熵不起得随机数-碧云涛.PDF

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
熵不起得随机数-碧云涛

原原文文地地址址:/tips/1060 0x00 前前言言 2龙好早以前说,能不能把这篇文章翻了,我拿到文章一看,有点意思,但是 多东西我不清楚,然后在维基百科上看 了一些关于Entropy (熵)和PRNG (伪随机生成器)和RNG (随机数生成器)的文章, 拖沓,坑却越挖越大,今天 打算跟随原文的过程的说一下这篇文章所说到的事情,但是不是完整的翻译。 直到我看完之后才想起来,这个事情Superhei曾经在Discuz的代码里也提出过:/dzvul/sod /14/sod - 2008- 14.txt,也是:/2008/08/17/mt_srand-and-not-so-random-num ers/。 文章里出现一个Entropy (熵),我这里引用一下wikipeida中文的一段话来解释下这个东西。 英语文本数据流的熵比较低,因为英语 容易读懂,也就是说 容易被预测。即即便便我我们们不不知知道道下下一一段段英英语语文文字字是是什什 么么内内容容,,但但是是我我们们能能 容容易易地地预预测测,,比比如如,,字字母母e总总是是比比 字字母母z多多,,或或者者qu字字母母组组合合的的可可能能性性总总是是超超过过q与与任任何何其其 它它字字母母的的组组合合。。如果未经压缩,一段英文文本的每个字母需要8个比特来编码,但是实际上英文文本的熵 大概只有4.7 比特。 接下来是文章,总体来说:能力有限,如存在错误,请多多指出。 注:文章内token,salt,nonce,PRNG,RNG这些缩写我 只注了一次,而seed有些地方写成了随机数种子,有些地方写了seed。 0x01 细细节节 随机值在PHP中 常见,在框架内或者类库中你都可能看到用它生成的token (令牌),salt (盐值),这些都被当做一 种输入放到对应的函数内,随机数 常见 常用。 生成一个范围内的随机数,一个随机的用以加密的密匙,一个不可以被猜测到的可用于验证用户权鉴的字符,生成一 个sessionid什么的,我们都会用到随机。 但是这些使用中都存在一个隐患,如果攻击者可以预测你用RNG (随机数生成器)或者PRNG (伪随机数生成器)生 成的随机结果会是什么,那他也差不多能知道你最后生成token是什么,或者nonce (一次性验证的凭证)是什么,所 以,好的随机数必须是不可以被预测到得随机数。 但是作者认为,在PHP 内存在两个关于随机数的弱点: 1,信息泄露。 2,熵池不足。 信息泄露的意思是,在随机数生成过程中能泄露过程中的一些东西,例如伪随机数种子的值,有了这个随机数的结果 也可以更简单的获取到。 熵池不足的意思是,随机数初始的内部状态或者随机数种子的组成的成分就 有限,大概就在一个范围内,PRNG生 成的结果也就在一个可能猜到的范围内。 两个对PHP编写的代码来说,都不算好消息。 什什么么产产生生了了随随机机值值呢呢?? 多人都搞不清楚什么是随机值,可能有些人觉得用unique产生的值和其他随机数比的话,前者更安全一点,后者可能 容易就获取到了,我实际上不认同这个。 关于随机数的讨论应该基于目的,如果你期望使用的随机数是不可被预测的,重要的,那你的随机数就应该不可被预 测。 影响随机数的强度的是生成用的熵,熵简单来说是到字节的不确定性,举个例子,我拿出个2进制的字符,它就包含0 和1,如果攻击者什么都不知道,好,我们的熵是2,如果攻击者知道结果一定是1,我们的熵就是0比特了,因为能否 预测这个需求是和不确定性相反的。 这个在PHP里比较明显,mt_rand生成的随机值永远只是数字,它不输出字符串,特殊字符什么的,所以攻击者只需要 尝试数字,如果我们使用/dev/random来生成随机数会比前者的熵池更大。 而且,mt_rand不是真的随机数生成器,它是PRNG (伪随机生成器),采取的是一种被称为梅森旋转的算法,用以生 成高质量的伪随机数,它会采用随机数种子来生成随机数的值。 你可以本地测试一下下面的代码 #!php mt_srand (1361152757.2); for ($i=1; $i 25; $i++) { echo mt_rand (), PHP_EOL; } 产生的随机数看上去是不是 正常,也没什么问题,你再运行一次你会发现结果还是一样的,这不保证在PHP的版本 变化后还是如此,但是在过去流行的版本里,是这样的。 如果攻击者可以获取随机数种子,他就可以预测用梅森旋转 算法生成的mt_rand的值。 这个特性让随机数种子变成了能否预测的关键。 在在PHP 内内的的随随机机数数 PHP使用的三

您可能关注的文档

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档