Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何重新创建SecureRandom实例并进行比较?_Java_Security_Cryptography - Fatal编程技术网

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));
      }
    }
}