【问题标题】:How to decide which is the most secure way to generate random numbers in java using SecureRandom class如何确定使用 SecureRandom 类在 java 中生成随机数的最安全方法
【发布时间】:2016-05-26 20:53:46
【问题描述】:

我想知道哪种方法是生成 0-255 范围内高度安全的随机数的最佳方法,而且具有快速性能。在我看来,我肯定必须使用 SecureRandom 类,但我不确定我是否必须使用 .getInstance(SHA1PRNG) 或者最好让它默认而不使用 arg 构造函数。

我介于这两种选择之间:

第一种方式

 public class RandomGenerator {

  private static final String sha1prng = "SHA1PRNG";

    private final SecureRandom csprng;
    private final byte[] bytes = new byte[1];

    public RandomGenerator() { 
        try { 
            csprng = SecureRandom.getInstance(sha1prng); 
        } catch (NoSuchAlgorithmException e) { 
            throw new RuntimeException(e);
        }
        csprng.nextBoolean(); 
    }



    protected int generateByte() {
        do {
            csprng.nextBytes(bytes);
        } while (bytes[0] == 0); 

        return ((byte)(bytes[0] & 0xff) + 256) % 256;
     }

  }

第二道:

 public class SomethingThatNeedsRandomBytes {

  private static final int NUMBER_OF_RANDOM_BYTES = ... ;

  private final SecureRandom csprng;

 SomethingThatNeedsRandomBytes(SecureRandom csprng) {
   if (csprng == null)
  throw new IllegalArgumentException();

     this.csprng = csprng;

    }

   void doSomethingInvolvingRandomness() {
     byte[] bytes = new byte[NUMBER_OF_RANDOM_BYTES];
     csprng.nextBytes(bytes);
// Do something with random bytes here.
     }
  }

我在这个网站上看到了很多其他答案,其中大多数人建议不要使用 SHA1PRNG 并让它默认,但另一方面,其他一些答案建议使用 NativePRNG(我不喜欢它,因为它不快) 或 SHA1PRNG。我想反馈一下哪种方式生成高安全随机数,哪种方式最快。

提前致谢。

【问题讨论】:

  • 你真的是在问如何决定,还是只是在问答案是什么?
  • @EJP 我想知道如何决定?好的,我可以使用基准测试或 System.nanoTime () 进行速度性能测试,但我不知道如何确定哪个更安全

标签: java secure-random


【解决方案1】:

如果构造函数为空,SecureRandom 将选择第一个注册的支持 SecureRandom 算法的安全提供程序;如果不存在,则默认为 SHA1PRNG。这会因系统而异,如果您的应用程序可能在不同的环境中运行,您应该在构造函数中指定算法。要检索 SecureRandom 的安全提供程序的顺序,您可以运行以下命令:

import java.security.Security;
import java.security.Provider;
import java.security.Provider.Service;

for (Provider provider : Security.getProviders()) {
    for (Service service : provider.getServices()) {
        if (service.getType().equals("SecureRandom")) {
            System.out.println(service.getAlgorithm());
        }
    }
}

NativePRNG 的实现取决于操作系统,但通常使用硬件或操作系统事件生成的熵来产生随机值。通常这必须等待生成熵才能返回值。绝对而言,这比 SHA1PRNG 更安全;但是,实际上您不太可能注意到差异。如果算法的速度对应用程序很重要,SHA1PRNG 通常会比 NativePRNG 更快,并且两种算法都为加密操作提供了足够的随机值。需要注意的是,对于密码哈希等应用程序,通常首选较慢的算法。

见:https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html#SecureRandom--

【讨论】:

  • D.Holland 我真的很感激。这对我真的很有帮助。我正在使用 ShamirSecretSharing 方案,其中它必须应用于文件的每个字节,如果文件是一些 Gb,那么使用 NativePRNG 将花费我很多时间来共享和重建文件。我的操作基于最有效的 GF(256),并且我使用霍纳规则来评估减少乘法次数的多项式。那么如果我使用 SHA1PRNG,你认为什么是足够安全的?我问的原因是因为我找不到更安全的证明方法
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多