我有一些使用JCS和Bouncey Castle创建KeyPair的Java代码。当我在像我的桌面这样的物理Linux系统上创建密钥对时,它可以正常工作。密钥生成需要一两秒钟。当我在VM上运行相同的代码时,密钥通常会“挂起”(我让它运行最多5分钟)。有时它在30秒内工作,但这种情况很少见。
我猜这与VM上没有足够的随机性有关,但我不知道如何解决这个问题。
这是从我的实际程序代码中提取并缩小的测试代码:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class KeyPairCreateTester {
private static final String RANDOM_ALGO = "SHA1PRNG";
public static void main(String[] args) {
final String keyAlgo = "RSA";
final int keySize = 2048;
try {
System.out.printf("Creating random instance using %s\n", RANDOM_ALGO);
SecureRandom random = SecureRandom.getInstance(RANDOM_ALGO);
System.out.printf("Creating key using algo %s size %d\n", keyAlgo, keySize);
KeyPairGenerator keygen = KeyPairGenerator.getInstance(keyAlgo);
System.out.printf("Initialize\n");
keygen.initialize(keySize, random);
System.out.printf("Generating key\n");
KeyPair keyPair = keygen.generateKeyPair();
System.out.println("Success");
} catch (NoSuchAlgorithmException e) {
System.err.println("No such algo");
}
}
}
“生成密钥”后会出现“挂起”。
将keySize调低至偶数512只有很小的效果。在512处,密钥的生成次数会增加几倍,但它仍然会在大部分时间内挂起至少5分钟。
物理机和VM都是Ubuntu 16.04。
Java是1.8.0_72 + 1.8.0_101(我试过了两个)。
真的会对这一点有所了解。这让我发疯了!
答案 0 :(得分:2)
通过安装hasged包并启动该服务解决问题(systemctl start hasged)。