伪随机数安全性

真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。这样的随机数发生器叫做物理性随机数发生器,虽然很可靠,但是使用计算机很难实现,它们的缺点是技术要求比较高。
在实际应用中往往使用伪随机数就足够了。这些数列看似是随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。计算机产生的随机数有很长的周
期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。
伪随机数又有强弱之分。强伪随机数一般是指相对难以猜解的随机数,比如服务器占用的内存数量作为随机数;而弱伪随机数是指相对容易猜解的随机数呢,典型的例子是当前的时间戳等。
C、C++、Java等程序语言和软件中都有对应的随机数生成函数或者类。以我们最常用的Java语言为例,强伪随机数RNG实现
java.security.SecureRandom类,该类使用临时文件夹中大小,线程休眠时间等的值作为随机数种子;而弱伪随机数实现PRNG
java.util.Random类,默认使用当前时间作为种子,并且采用线性同余法计算下一个随机数。

Random r = new Random(10000); //10000作为seed,默认使用当前时间作为seed
for (int i=0;i<5;++i)
{
  System.out.println(r.nextInt());
}

以上这段代码,无论你怎么跑都会打印出以下结果:
-498702880
 -858606152
 1942818232
-1044940345
1588429001
这是一个稳定的结果。这就是由于线性同余法带来的后果。那么,在我们的程序,如果使用Random类生成一个随机数,事实上很容易通过上一个产生的随机数来推断下一个随机数。
接下来,我们来分析一些常用的随机数应用场景,并且分析一下出错的原因。
很多账号体系都有一个找回密码功能,找回密码时给手机发送的验证码,给邮箱发送的验证码或者重置密码链接,以上种种都使用了伪随机数。
下面以某网站通过邮箱重置密码链接找回密码为例,通过页面操作之后,会在密保邮箱中发现以下重置密码的链接:
http://www.xxx.com/findpwd/setpwdfromemail?vc=2ABB36620A927644607491393EF0D5EF&u=xxx%40gmail.com
通过分析,我们发现,vc=2ABB36620A927644607491393EF0D5EF是一串md值,解开之后值是1339744000,是个
unix时间戳!那么可以猜测,用户取回密码时产生一个时间戳与帐号绑定,那么修改这个用户密码只需知道这个时间戳就可以。况且,一般服务器时间都是跟标
准时间同步,也就是说unix时间戳是可以预测的。我们可以通过暴力破解遍历当前标准时间+一个网络延迟来进行暴力破解。
伪随机数的应用里,验证码是另外一种典型应用。对于安全而言,验证码是一个非常有效的保护机制和人机区分机制,可以保障口令不被暴力破解,可以防止刷票,
刷屏,重复提交恶意数据等。除了作为验证码之外,类似的应用还存在于一些活动的优惠券或者兑换码,如果兑换码设计不当,很容易被破解而破坏活动的公平性。
总结一下,使用随机数的场景需要注意以下几点:
不要使用时间戳作为随机数
保证不同用处的随机数使用不同的种子
对于安全性要求高的随机数,使用强伪随机数产生

时间: 2024-10-14 23:14:34

伪随机数安全性的相关文章

伪随机数的产生

应用:随机数或者伪随机数的产生在大量的密码函数中都有广泛的应用. 要求:随机性和不可预测性 1.随机性有两个评价标准:分布均匀性和独立性 a) 分布均匀性指的是0和1出现的概率大致相等 b) 独立性指的是序列中任何子序列不能由其他子序列推导出 遗憾的是,没有可靠的方法表明一个序列的独立性好,只能证明一个序列不具有独立性.因此只好多测测,来回多次仍然表现不错的话,就姑且当它独立性不错啦. 2.不可预测性是指每个数都统计独立于其他数,因而不可预测.但是真正的随机数序列很少用,一般看上去随机的随机数序

如何评价一个伪随机数生成算法的优劣

以下来自我在知乎的回答.http://www.zhihu.com/question/20222653 谈到随机性,这大概是一个令人困惑哲学问题吧.随机行为精确地说究竟指的是什么,最好是有定量的定义.Kolmogorov曾提出一种判定随机性的方法: 对于无穷的随机数序列,无法用其子序列描述.J.N.Franklin则认为:如果一个序列具有从一个一致同分布的随机变量中独立抽样获得的每个无限序列 都有的性质,则是随机的.这些定义都不是很精确,有时甚至会导致矛盾.可见数学家在谈到这个问题时是多么的审慎.

2016012093 马雪 散列函数的应用及其安全性

散列函数的应用及其安全性 一.给出散列函数的具体应用. 1.消息认证 (1)概念:消息认证是用来验证消息完整性的一种机制和服务.消息认证确保收到的消息和发送时是一样的,同时.此外,还要确保发送方声称的身份是真实有效的,当Hash函数用于提供消息认证功能时,被称为消息摘要. (2)使用本质:发送者根据待发送的消息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去.接收者收到后对于消息执行同样Hash计算,并将结果与收到的Hash值进行对比.如果不匹配,则接收者推断出消息(也可能是Ha

2016012010 赵瑞雪 散列函数的应用及其安全性

作业题目:散列函数的应用及其安全性 内容要求:(1) 给出散列函数的具体应用 (2) 结合生日攻击.以及2004.2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展.问题2的回答可以参考下面给出的第一个链接 (3) 结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问

信息安全技术作业5--散列函数的应用及其安全性

作业内容要求: 1)给出散列函数的具体应用. 2)结合生日攻击.以及2004.2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展.问题2的回答可以结合下面给出的第一个链接. 3)结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法来验证软件完整性时可能出现的问题. 链接1:https://www.

2016011998 张舒凯 散列函数的应用及其安全性

1.散列函数的具体应用 (1)消息认证:散列函数用于消息认证---消息认证是用来验证消息完整性的一种机制和服务,函数值称为消息摘要,确保收到的数据和发送时的一样(即没有修改.插入.删除或重放),发送者根据待发送的消息使用散列函数f计算一组散列值,再把散列函数值和消息发送出去:接受者收到后统一进行计算,并进行比对,具体方法: 1.使用对称密码算法加密消息和散列码: 2.使用对称密码算法只对散列码进行加密: 3.不使用加密算法,仅使用散列函数: 4.将整个消息和散列值加密. (2)数字签名:散列函数

2016012067 刘玥 散列函数的应用及其安全性

目录 一.散列函数的具体应用 二. 散列函数的安全性以及目前安全散列函数的发展 三. md5算法在验证软件完整性时可能出现的问题 一.散列函数的具体应用 (1)数字签名 哈希函数可以提高签名的速度,减少运算,又可以不泄露签名所对应的消息,还可以将消息的签名与加密变换分开处理. (2)校验 可以校验数据是否被篡改.传输消息之前对消息进行哈希变换,接收者也进行相同的哈希变换,若两个哈希值相同,可以认为消息在传输过程中没有被篡改. (3)快速访问 散列表的寻址时间复杂度为O(1),在数据存储中运用较多

作业5:有关散列函数安全性的知识扩展。

作业题目:散列函数的应用及其安全性. 内容要求: (1) 给出散列函数的具体应用. (2) 结合生日攻击.以及2004.2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展.问题2的回答可以参考下面给出的第一个链接. (3)结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出

第五次作业:散列函数安全性的知识扩展

散列函数的应用及其安全性 一.给出散列函数的具体应用 答: ①消息认证:是用来验证消息完整性的一种机制或服务,确保收到的数据确实和发送时的一样(没有修改.插入.删除或重放),通常还要求信息认证机制确保发送方声称的身份是真实有效的 消息认证中使用Hash函数的本质:发送者根据待发送的信息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去.接收者收到后对信息执行同样的Hash计算,并将结果与收到的Hash值进行对比,如果不匹配,则接收者推断出信息遭受到篡改 Hash函数用于消息认证的方