我一直在尝试在android中生成唯一的密钥对。任何人都可以告诉我为什么以下总是在第一次调用时产生相同的密钥?
long ltime = System.currentTimeMillis();
SecureRandom random = null;
random = new SecureRandom();
byte[] seed = ByteBuffer.allocate(8).putLong(ltime).array();
random.nextBytes(seed);
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
try {
mKeyPairGenerator.initialize(spec, random);
} catch (InvalidAlgorithmParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mKeyPair = mKeyPairGenerator.generateKeyPair();
mPublicKey = (PublicKey) mKeyPair.getPublic();
mPrivateKey = (PrivateKey) mKeyPair.getPrivate();
答案 0 :(得分:1)
始终生成相同的密钥,因为带有种子的SecureRandom是确定性的,并且始终产生相同的结果。只是不要设置种子,这可能是不安全的,因为你可以阅读参考书目:
播种SecureRandom可能不安全
种子是用于引导随机数的字节数组 代。要生成加密安全的随机数,两者都有 种子和算法必须是安全的。
默认情况下,此类的实例将生成初始种子 使用内部熵源,例如/ dev / urandom。这粒种子是 不可预测且适合安全使用。
只需使用KeyPairGenerator类:
KeyPair keys = null;
try {
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(spec);
keys = keyGen.generateKeyPair();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
if(keys != null){
PublicKey mPublicKey = (PublicKey) keys.getPublic();
PrivateKey mPrivateKey = (PrivateKey) keys.getPrivate();
}
答案 1 :(得分:0)
这个问题的最终答案是将充气城堡中的海绵城堡添加到我的应用中。
答案 2 :(得分:0)
我的最终解决方案是将spongycastle提供程序添加到我的应用程序中。一旦我这样做,钥匙开始是随机的。