java 随机数字加密_java随机数之Random和SecureRandom

本文探讨了在安全环境中使用不安全的随机数生成器可能导致的问题,如Math.random()。文章介绍了统计学PRNG和密码学PRNG的区别,并提供了使用Java的SecureRandom类来生成更安全的随机数的解决方案。通过示例代码展示了SecureRandom的用法,以及在多线程环境下的线程安全性。文章最后提到了其他随机数生成工具,如ThreadLocalRandom和Random。
摘要由CSDN通过智能技术生成

一、前言

在一次项目的安全测试源代码扫描中,报由random()实施的随机数生成器不能抵挡加密攻击。其中报漏洞的源代码如下:

int number = (int) ((Math.random() * 9 + 1) * Math.pow(10, 6 -1));

String numStr= String.valueOf(number);

其中的报漏洞的解释是这样说的,在对安全性要求较高的环境中,使用能够生成可预测值的函数作为伪随机数据源,会产生Insecure Randomness(不安全随机性)错误。电脑是一种具有确定性的机器,因此不可能产生真正的随机性,伪随机数生成器(PRNG)近似于随机算法,始于一个能计算后续数值的种子。PRNG 包括两种类型: 统计学的 PRNG 和密码学的 PRNG。 统计学的 PRNG 提供很多有用的统计属性, 但其输出结果很容易预测, 因此容易复制数值流。 在安全性所依赖的生成值不可预测的情况下, 这种类型并不适用。 密码学的 PRNG 生成的输出结果较难预测, 可解决这一问题。 为保证值的加密安全性, 必须使攻击者根本无法、 或几乎不可能鉴别生成的随机值和真正的随机值。 通常情况下, 如果并未声明 PRNG 算法带有加密保护, 那么它很可能就是统计学的 PRNG, 因此不应在对安全性要求较高的环境中使用, 否则会导致严重的漏洞(如易于猜测的密码、 可预测的加密密钥、 Session Hijacking 和 DNS Spoofing) 。

示例: 下面的代码可利用统计学的 PRNG 为购买产品后仍在有效期内的收据创建一个 URL。

String GenerateReceiptURL(String baseUrl) {

Random ranGen= newRandom();

ranGen.setSeed((newDate()).getTime());return (baseUrl + ranGen.nextInt(400000000) + ".html");

}

这段代码使用 Random.nextInt() 函数为它生成的收据页面生成“唯一”的标识符。 由于 Random.nextInt() 是统计学的 PRNG, 攻击者很容易猜到其生成的字符

串。 尽管收据系统的底层设计并不完善, 但若使用不会生成可预测收据标识符的随机数生成器(如密码学的 PRNG),就会更安全些。

二、解决方案

当不可预测性至关重要时, 如大多数对安全性要求较高的环境都采用随机性, 这时可以使用密码学的 PRNG。 不管选择了哪一种 PRNG, 都要始终使用带有充足熵的数值作为该算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值