我正在创建一个像这样的安全随机数:
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实例? (例如,在字节数组中创建的新实例开头创建的数字)
答案 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
。