如何重新创建SecureRandom实例并进行比较?

时间:2014-01-02 11:52:27

标签: java security cryptography

我正在创建一个像这样的安全随机数:

SecureRandom challange = new SecureRandom();
final byte[] number = new byte[32];
challange.nextBytes(number);

然后将其转换为Base64(不确定generateSeed是否会混淆):

byte[] secureBytes = challange.generateSeed(32);
byte[] base64secure = Base64.encode(secureBytes);

之后我通过TCP套接字发送它并在另一端读取它。

如何从收到的字节中创建新的SecureRandom实例? 如果它们是相同的数字,我如何比较两个SecureRandom实例? (例如,在字节数组中创建的新实例开头创建的数字)

1 个答案:

答案 0 :(得分:1)

我刚刚研究了一下,没有办法做到这一点。 SecureRandom的意思在于它通过加密安全和播种值来阻止它:

import java.security.SecureRandom;

public class Main{
    public static void main(String[] args){

      SecureRandom seedMaker = new SecureRandom();  
      byte[] seed = seedMaker.generateSeed(20);
      SecureRandom r1 = new SecureRandom(seed);
      SecureRandom r2 = new SecureRandom(seed);

      byte[] b1 = new byte[4];
      byte[] b2 = new byte[4];
      for (int i=0;i<10;i++) {
        r1.nextBytes(b1);
        r2.nextBytes(b2);

        System.out.println(java.util.Arrays.toString(b1)+" == "+java.util.Arrays.toString(b2));
      }
    }
}

在此处试试:http://www.tryjava8.com/app/snippets/52c56f1de4b00bdc99e8a99c

您可以立即看到结果不匹配。

要获得您想要的行为,您只能使用标准的Random数字生成器和种子来执行此操作,而不能使用SecureRandom