Java 如何重新创建SecureRandom实例并进行比较?
我正在创建一个安全的随机数,如下所示:Java 如何重新创建SecureRandom实例并进行比较?,java,security,cryptography,Java,Security,Cryptography,我正在创建一个安全的随机数,如下所示: SecureRandom challange = new SecureRandom(); final byte[] number = new byte[32]; challange.nextBytes(number); 然后像这样将其转换为Base64(不确定generateSeed是否会弄糟它): 之后,我通过TCP套接字发送它,并在另一端读取它 如何使用收到的字节创建新的SecureRandom实例? 如果两个SecureRandom实例是相同的数字
SecureRandom challange = new SecureRandom();
final byte[] number = new byte[32];
challange.nextBytes(number);
然后像这样将其转换为Base64(不确定generateSeed是否会弄糟它):
之后,我通过TCP套接字发送它,并在另一端读取它
如何使用收到的字节创建新的SecureRandom实例?
如果两个SecureRandom实例是相同的数字,我如何比较它们?(例如,从字节数组中创建的新实例开始创建的数字)我刚刚对此进行了更多的研究,没有办法做到这一点。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));
}
}
}
导入java.security.SecureRandom;
公共班机{
公共静态void main(字符串[]args){
SecureRandom seedMaker=新SecureRandom();
字节[]seed=seedMaker.generateSeed(20);
SecureRandom r1=新的SecureRandom(种子);
SecureRandom r2=新的SecureRandom(种子);
字节[]b1=新字节[4];
字节[]b2=新字节[4];
对于(int i=0;iI假设这将是依赖于提供程序的行为,因为Javadocs不要求忽略种子,或者两个相同的种子不应产生非一致的输出。还请注意,如果您使用System.out.println(java.util.Arrays.equals(b1,b2))进行总结,您的示例可能更容易阅读是的,我想看到差异,但是Arrays.equals也是一个不错的选择。你应该使用流密码,而不是带有seed的SecureRandom
。你的代码会在不同的java版本/实现之间中断。我相信甚至有一些实现忽略了seed,或者只是将其添加到熵池中。我建议在CTR模式下使用AES。上面的答案是正确的。对于我的问题,对AES IV参数使用IvParameterSpec而不是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));
}
}
}