Insecure Randomness

Abstract

标准的伪随机数生成器不能抵挡各种加密攻击。

Explanation

在对安全性要求较高的环境中,使用一个能产生可预测数值的函数作为随机数据源,会产生 Insecure
Randomness 错误。 电脑是一种具有确定性的机器,因此不可能产生真正的随机性。 伪随机数生成器
(PRNG) 近似于随机算法,始于一个能计算后续数值的种子。 PRNG 包括两种类型: 统计学的 PRNG 和密
码学的 PRNG。 统计学的 PRNG 可提供有用的统计资料,但其输出结果很容易预测,因此数据流容易复制。
若安全性取决于生成数值的不可预测性,则此类型不适用。 密码学的 PRNG 通过可产生较难预测的输出结果
来应对这一问题。 为了使加密数值更为安全,必须使攻击者根本无法、或极不可能将它与真实的随机数加以
区分。 通常情况下,如果并未声明 PRNG 算法带有加密保护,那么它有可能就是一个统计学的 PRNG,不应
在对安全性要求较高的环境中使用。
示例: 下面的代码可利用统计学的 PRNG 为购买产品后仍在有效期内
的收据创建一个 URL。
String GenerateReceiptURL(String baseUrl) {
Random ranGen = new Random();
ranGen.setSeed((new Date()).getTime());
return(baseUrl + Gen.nextInt(400000000) + ".html");
}
这段代码使用 Random.Next() 函数为由其产生的收据页面生成“唯一”的标识符。 因为
Random.nextInt() 是一个统计学 PRNG,攻击者很容易就能猜到由它生成的字符串。 尽管收据系统的底
层设计也存在错误,但如果使用了一个不生成可预测收据标识符的随机数生成器(如密码学的 PRNG),会
更安全一些。

Recommendation

当不可预测性至关重要时,如大多数对安全性要求较高的环境都采用随机性,这时可以使用密码学的 PRNG
。 不管选择了哪一种 PRNG,都要始终使用带有充足熵的数值作为该算法的种子。 (诸如当前时间之类的数
值只提供很小的熵,因此不应该使用。) Java 语言在 java.security.SecureRandom 中提供了一个加
密 PRNG。 就像 java.security 中其他以算法为基础的类那样,SecureRandom 提供了与某个特定算法
集合相关的包,该包可以独立实现。 当使用 SecureRandom.getInstance() 请求一个 SecureRandom
实例时,您可以申请实现某个特定的算法。 如果算法可行,那么您可以将它作为 SecureRandom 的对象使
用。 如果算法不可行,或者您没有为算法明确特定的实现方法,那么会由系统为您选择 SecureRandom 的
实现方法。 Sun 在名为 SHA1PRNG 的 Java 版本中提供了一种单独实现 SecureRandom 的方式,Sun 将其
描述为计算: “SHA-1 可以计算一个真实的随机种子参数的散列值,同时,该种子参数带有一个 64 比特的计
算器,会在每一次操作后加 1。 在 160 比特的 SHA-1 输出中,只能使用 64 比特的输出 [1]。” 然而,文档中
有关 Sun 的 SHA1PRNG 算法实现细节的相关记录很少,人们无法了解算法实现中使用的熵的来源,因此也并
不清楚输出中到底存在多少真实的随机数值。 尽管有关 Sun 的实现方法网络上有各种各样的猜测,但是有一
点无庸置疑,即算法具有很强的加密性,可以在对安全性极为敏感的各种内容中安全地使用。

解决办法
采用更加安全的SecureRandom来替换Random。
 

最新文章

  1. 解决蓝屏代吗0x0000007B的几种常见办法
  2. Linux服务器下用svn创建多个项目
  3. 一行 Python 代码搞定一棵树
  4. QT QObject::connect函数的学习
  5. Assembly 'Microsoft.Office.Interop.Excel
  6. dg rman
  7. <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
  8. SSH批量管理 expect自动交互
  9. JQuery AJAX 全局设置
  10. JS中回调函数的写法
  11. Flask入门之Virtualvenv的安装及使用(windows)
  12. SpringBoot Controller接收参数的几种常用方式
  13. label标签内含有input元素,点击事件会触发两次
  14. JSP和Struts2、Hibernate、Spring3基础内容和原理
  15. vue2.0 实现click点击当前li,动态切换class
  16. Problem1-Project Euler
  17. spring boot学习(6) SpringBoot 之事务管理
  18. Git Cannot rebase: You have unstaged changes.
  19. MySQL建表字段类型
  20. 《DSP using MATLAB》Problem 2.14

热门文章

  1. IDEA打包普通java项目并用java命令运行
  2. flask-基础篇01
  3. Drone自动部署配置文件
  4. shell_Day01
  5. 某星球存在两种生物,A种生物有1个头6条腿,B种生物有3个头4条腿。来自地球的太空船刚刚在该星球降落, 突然发现一大群这两种生物组成的队伍,由于时间紧,只数了头的数量和腿的数量,请帮助宇航员分析A、B两种生物各有多少个。
  6. mac下eclipse关联svn插件
  7. NS-Atmosphere payload Programmer
  8. Python在字典中通过键名查找键值
  9. 怎样修改linux内核
  10. C语言初级阶段5——函数2