使用RandomSecure

时间:2016-04-22 10:35:17

标签: java private-key key-pair secure-random

无论如何我可以生成相同的私钥吗?我厌倦了使用KeyPairGenerator对象初始化RandomSecure,该对象使用相同的seed

private PrivateKey getPrivateKey(String seed) {
    try {   
        SecureRandom sr = new SecureRandom(seed.getBytes());

        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024, sr);
        KeyPair keyPair = keyGen.generateKeyPair();
        return keyPair.getPrivate();
    } catch (NoSuchAlgorithmException e) {
        System.out.println("Failed to generate key pair!");
    }
    return null;
}

我调用上面的函数并检查私钥是否相同:

String seed = "xyzabc123";
PrivateKey key1 = getPrivateKey(seed);
PrivateKey key2 = getPrivateKey(seed);

boolean same = key1.equals(key2); // false

它们不同,我的问题是有没有办法生成始终相同的私钥?

2 个答案:

答案 0 :(得分:0)

Java的SecureRandom实现取决于可用的提供程序,因此它可能在不同的操作系统或不同的实现上有所不同。

在linux上,默认实现是NativePRNG,它会忽略你的种子AFAIK。

您可以执行的操作是在调用生成之前序列化您的安全随机数,并对其进行反序列化以将其重置为下一代。

我以前做过这个,并且记住它至少适用于一些Java实现。

String seed = "xyzabc123";
SecureRandom sr = new SecureRandom(seed.getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);   
out.writeObject(sr);
byte[] superseed = bos.toByteArray();
PrivateKey key1 = getPrivateKey(superseed);
PrivateKey key2 = getPrivateKey(superseed);

private PrivateKey getPrivateKey(byte[] superseed) {
    ByteArrayInputStream bis = new ByteArrayInputStream(superseed);
    ObjectInput in = new ObjectInputStream(bis);
    SecureRandom sr = (SecureRandom)in.readObject(); 
...

答案 1 :(得分:-1)

我认为此代码不会在每个请求中生成相同的private-key。 这背后的原因是这段特殊的代码

SecureRandom sr = new SecureRandom(seed.getBytes());

每次调用getPrivateKey(String)方法时。每次SecureRandom类都会生成一个新的随机数。

keyGen.initialize(1024, sr); //each time secure random number will be different.
KeyPair keyPair = keyGen.generateKeyPair();

keyGen.initialize()方法始终使用不同的密钥进行初始化,因此每次keyGen.generateKeyPair();方法都会生成不同的private-key

如果您尝试在SecureRandom方法中更改或传递相同的initialize()对象,则只能实现它。