【问题标题】:Generate KeyPair with RandomSecure使用随机安全生成密钥对
【发布时间】:2016-08-15 22:39:48
【问题描述】:

反正我可以生成始终相同的私钥吗?我厌倦了用RandomSecure 对象初始化KeyPairGenerator,它使用相同的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

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

【问题讨论】:

  • 我认为唯一的方法是创建自定义 Rsa 算法
  • 你的意思是SecureRandom

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


【解决方案1】:

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(); 
...

【讨论】:

    【解决方案2】:

    我认为这段代码不会在每次请求时生成相同的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

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

    【讨论】:

    • 如果使用同一个 SecureRandom,那么每次调用肯定会产生不同的值。
    猜你喜欢
    • 2017-01-15
    • 2018-01-12
    • 1970-01-01
    • 2013-06-23
    • 2018-09-10
    • 2015-09-27
    • 2017-08-11
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多