随机数安全

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38287155/article/details/95768096

随机数分类

  • 真随机数 : 通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等
  • 伪随机数 : 通过一定算法和种子得出。软件实现的是伪随机数,其中难以预测的随机数称为强伪随机数,易于预测的随机数称为弱伪随机数

随机数特性

  • 随机性 : 不存在统计学偏差,是完全杂乱的数列
  • 不可预测性 : 不能从过去的数列推测出下一个出现的数
  • 不可重现性 : 除非将数列本身保存下来,否则不能重现相同的数列

随机数的特性和随机数的分类有一定的关系,比如,弱伪随机数只需要满足随机性即可,而强位随机数需要满足随机性和不可预测性,真随机数则需要同时满足3个特性。


伪随机数的生成

我们平常软件使用和应用使用的都是伪随机数,伪随机数的生成实现一般是算法+种子

具体的伪随机数生成器一般有:

  • 线性同余法
  • 单向散列函数法
  • 密码法
  • ANSI X9.17

比较常用的一般是线性同余法,比如Java中的java.util.Random类,都采用了线性同余法生成随机数


随机数安全风险

随机数导致的安全问题一般有两个原因:

  • 应该使用随机数,开发者并没有使用随机数.简单来说,当我们需要一个随机数的时候,但开发人员可能没有使用随机数,而是指定了一个常量,比如找回密码的token,需要一个伪随机数,但许多业务直接根据用户生成token.
  • 应该使用强伪随机数,开发者使用了弱伪随机数.在开发中大部分语言的基础库中的random库都是伪随机数,但是需要切记的是,伪随机数不能用于密码技术的

安全建议

  • 随机数要足够长,避免暴力破解;
  • 保证不同用处的随机数使用不同的种子;
  • 对安全性要求高的随机数(如密码技术相关)禁止使用的弱伪随机数;
  • 不要使用时间函数作为随机数(很多开发人员喜欢用时间戳)
  • 强伪随机数的生成思路:收集计算机的各种信息,键盘输入时间,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,CPU时钟,来得到一个近似随机的种子,主要是达到不可预测性。

参考博文

https://blog.csdn.net/renwotao2009/article/details/51643799

展开阅读全文

没有更多推荐了,返回首页