JAVA8系列教程-安全随机数生成
如果您开发软件已有一段时间,那么您将知道如何生成随机数,甚至可以使用Java的SecureRandom类安全地生成随机数。不幸的是,生成安全随机数并不像简单地使用那样容易SecureRandom
。
在这个Java示例中,我们组装了一个简单的清单,以帮助您在应用程序中使用安全随机数时获得成功。
阅读更多:
用Java生成安全哈希
1.如何生成安全的随机数
通常,随机数的生成取决于熵(随机性)的来源,例如信号,设备或硬件输入。在Java中,java.security.SecureRandom类被广泛用于生成具有加密强度的随机数。
确定性随机数已成为许多软件安全漏洞的根源。这个想法是,对手(黑客)在给定几个随机数样本的情况下,将无法确定原始种子。如果违反了此限制,则对手可能会成功预测所有将来的随机数。
import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; public class Main { public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException { SecureRandom secureRandomGenerator = SecureRandom.getInstance("SHA1PRNG", "SUN"); // Get 128 random bytes byte[] randomBytes = new byte[128]; secureRandomGenerator.nextBytes(randomBytes); //Get random integer int r = secureRandomGenerator.nextInt(); //Get random integer in range int randInRange = secureRandomGenerator.nextInt(999999); } }
2.安全随机数–最佳做法
2.1。确定性能标准和工作负载平衡
如果性能是首要考虑因素,然后利用SHA1PRNG
,从中种子/dev/urandom
。SHA1PRNG可以比NativePRNG快17倍,但是种子选项是固定的。
使用进行播种NativePRNG
更灵活,但是如果熵在服务器上读取不了,则它会阻止熵是否足够大/dev/random
。如果您不知道从哪里开始,请从开始SHA1PRNG
。
2.2。不接受默认值;指定PRNG和要使用的提供程序
像这样指定您的条件:
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
以下是有关受支持的PRNG和提供程序的其他信息。
以下是SUN提供程序的PRNG列表:
- SHA1PRNG(当前通过系统属性和java.security熵收集设备的组合来完成初始植入)
- NativePRNG(nextBytes()使用/ dev / urandom,generateSeed()使用/ dev / random)
- NativePRNGBlocking(nextBytes()和generateSeed()使用/ dev / random)
- NativePRNGNonBlocking(nextBytes()和generateSeed()使用/ dev / urandom)
- JRE 8+中提供了NativePRNGBlocking和NativePRNGNonBlocking。
有关其他提供程序的信息,请参阅Java密码体系结构Oracle JDK 8提供程序文档。Oracle还提供了按OS平台描述提供程序的文档。
2.3。提供更多机会增加熵
SecureRandom
定期创建一个新实例并重新设置种子,如下所示:
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN"); sr.setSeed(SecureRandom.generateSeed(int))
如果种子泄漏,定期播种可以防止数据泄露。如果使用SHA1PRNG,则始终java.security.SecureRandom.nextBytes(byte[])
在创建PRNG的新实例后立即调用。
2.4。降低可预测性
如果egdSource
为java.security
文件中的配置参数或java.security.egd
系统属性分配了可预测的文件/ URL,则SecureRandom可以变为可预测的。
2.5。修补旧版Java
低于1.4.2的JRE版本在生成SHA1PRNG安全种子方面存在已知问题。再说一次,如果您使用的Java版本如此之旧,那么您将有更大的安全顾虑。
Java的旧版本非常不安全,因此更新补丁程序非常重要。确保客户安全的最佳方法之一是针对可能的最新Oracle重要补丁更新对软件进行快速认证。
- 本文标签: 其他
- 本文链接: https://www.v8en.com/article/261
- 版权声明: 本文由SIMON原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权