这将是Kai Michaelis,JörgSchwenk和我撰写的论文的总结,该论文在RSA Conference 2013的密码学家会议上发表 。 你可以得到我的演讲的幻灯片在这里和我们的全文在这里 。 我们对PRNG(主要是SecureRandom)附带的常见Java库生成的随机序列进行了分析,发现在特殊条件下存在明显的弱点。 为了使文章尽可能简短,PRNG使用的算法的描述,详细的错误描述和统计测试的结果均被省略,但可在本文中找到。 我们的研究涵盖PRNG本身以及用于播种的熵收集器(例如,如果没有实数生成器可用)。
底线:当需要良好的随机性时不要使用PRNG!
质量通过多种方式分级。 首先,我们进行了代码分析,并(成功地)尝试查找和识别导致严重缺陷的编码错误。 其次,我们对生成的随机序列进行了统计检验。 最后,我们强调了在特殊条件下(高系统负载,某些组件不可用等)的算法。

第一个库:

尽管经过重试,但Apache Harmony仍可作为Android源代码的一部分(请参见此处 )保留下来,因此是数百万种设备的一部分。

弱点

发现的错误之一直接影响Android平台。 其他错误仅存在于Apache Harmony中,而不存在于Android源代码中。
FIRST –创建自种子的SecureRandom实例时(通过调用不带参数的构造函数并随后进行setSeed()调用),代码在插入起始值后无法调整字节偏移(状态缓冲区中的指针)。 这将导致计数器和填充的开头(32位字)覆盖部分种子而不是附加种子。 第二 –在类似Unix的操作系统下运行时,新的SecureRandom实例从urandom或随机设备中植入了20个字节的种子。 如果两者均不可访问,则该实现将提供备用种子设施。 一旦播种工具收集了请求的字节数,出于未知原因,最高有效位将设置为零。 结果,对于每个请求的字节,SecureRandom实例的有效种子仅为7/8,从而将安全性(由于第一个错误,仅64位)降低了8位至56位。 更糟糕的是,由于另一个无效的模减少,单个调用播种功能的熵被限制为仅31位。 当查看生成的字节时,熵收集器的问题显而易见。 下图描述了单个点的两个连续字节。

每个方向上都完全缺少127以上的值。

第二个库:

GNU Classpath部分由著名的IcedTea项目使用,因此最著名的是Linux系统上的64位Java Browser-plugin。

弱点

该库在内部状态方面存在重大缺陷。 该错误与用于哈希函数的相同的初始化向量(IV)有关。 这将内部状态的未知字节数从32个减少到只有20个。EntropyCollector算法很难预测,这很好,但是它依赖于争夺CPU时间的线程,这很容易受到影响(通过将系统置于高负载)。 线程运行时检查不够严格,无法确保良好的随机性。 下图显示了有关平均分配输出的困难,留下了较大的色块。 该图显示了熵收集器在高系统负载下的性能。

相比之下,熵收集器在正常情况下的表现与预期相同:

第三图书馆:

Java SE的官方免费开源实现在很大程度上与Oracle提供的版本相同。 大多数Java用户很可能依赖此代码。

弱点

代码审查没有明显的弱点。 Entropy Collector依赖于线程递增计数器,但是与GNU Classpath相反,它对运行时的要求最低。 结果图填充得非常平衡。

第四图书馆:

该库与其他库有所不同,因为它只是用于各种密码算法的非常全面的库。 它附带多种替换品 BouncyCastle的熵收集器可以在两种操作模式下运行,即快速模式和慢速模式,其中不同数量的字节用于随机输出。

弱点

与OpenJDK案例一样,Bouncy Castle的SecureRandom替代品(DigestRandomGenerator)没有发现明显的错误。 相反,已知VMPCRandomGenerator容易受到攻击。 两种模式下的熵收集器都可以非常平衡地填充图形。

快速模式

慢速模式

摘要

非常有趣的是受检查的实现的有限且不可配置的内部状态大小。 几乎所有实现都依赖SHA-1作为哈希(压缩)功能。 因此,它们对于大于160bit的密钥生成似乎没有用。 只有Apache Harmony依赖于512位的内部状态,但是会遭受编码错误。 该博客文章省略了许多详细信息和统计信息,以便仅对库进行快速而肮脏的审查-如果您对更多详细信息和进一步的结果感兴趣,欢迎您阅读全文。

参考:来自Java安全和相关主题博客的JCG合作伙伴 Christopher Meyer的Java伪随机数生成器(PRNG)中的弱点 。

翻译自: https://www.javacodegeeks.com/2013/03/weaknesses-in-java-pseudo-random-number-generators-prngs.html

Java伪随机数生成器(PRNG)中的弱点相关推荐

  1. java伪随机数生成器

    关于随机数的基本概念 1.对随机数性质分类: 随机性:符合该性质的叫弱伪随机数.这种随机数仅可以用于一般应用,无法用在密码学,例如java中的java.util.Random类 不可预测性:符合该性质 ...

  2. Java 随机数生成器 Random SecureRandom 原理分析

    文章目录 java.util.Random java.Security.SecureRandom /dev/random 与 /dev/urandom 资料 Java 里提供了一些用于生成随机数的工具 ...

  3. Java 随机数生成器 Random SecureRandom

    Java 里提供了一些用于生成随机数的工具类,这里分析一下其实现原理,以及他们之间的区别.使用场景. java.util.Random Random 是比较常用的随机数生成类,它的基本信息在类的注释里 ...

  4. Redis源码和java jdk源码中hashcode的不同实现

    一.redis实际上是使用了siphash 这个比较简单,我说的简单是指redis代码比较少不像jdk一样调用C++代码调用栈非常深. 先看这个rehashing.c 主要就是dictKeyHash函 ...

  5. 使用python实现伪随机数生成器

    在前两天学习了使用python实现伪随机数的方法,今天是时候来做一个总结了. 首先要说明的是什么是随机数,真正的随机数是使用物理现象产生的:比如掷钱币.骰子.转轮.使用电子元件的噪音.核裂变等等.产生 ...

  6. 计算机仿真随机数生成,伪随机数生成器研究

    摘要: 本文主要考虑了基于计算复杂性定义的伪随机数生成器.介绍了单向函数与伪随机数生成器之间的关系以及几种常见的基于离散对数问题,DDH问题的伪随机数生成器.在分析了它们的安全性和效率的同时也提出了改 ...

  7. 随机数生成器 java_Java中的随机数生成器

    随机数生成器 java Today we will look at how to generate a random number in Java. Sometimes we need to gene ...

  8. Verilog 实现伪随机数生成器(线性反馈移位寄存器)

    Verilog 实现伪随机数生成器(线性反馈移位寄存器) 1,题目 2,RTL代码设计 3,testbench测试代码 4,前仿真,波形验证 参考文献1 1,题目 不简单的进行移位,而是在移位的基础上 ...

  9. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  10. 【历史上的今天】12 月 24 日:姚期智出生;微软在 Java 反垄断案中败诉;GIF 图像格式获得专利保护

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 24 日,在 115 年前的今天,美国电子和无线电技术专家雷吉纳德·费森登(Reginal ...

最新文章

  1. pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值
  2. angular.element()的用法
  3. Navicat for SQL Server 文件属性有哪些
  4. ngrok-外网访问内网工具NGROK的使用
  5. 3、MySQL 8.0.20在Linux(centos 8)上搭建主从复制
  6. 这个点名系统太好用了,快来看看……
  7. Java中string.equalsIgnoreCase(0)与0.equalsIgnoreCase(string)的区别:
  8. Ubuntu16.04安装使用wineqq
  9. mysql如何进行数据透视,mysql-如何优化数据透视表的条件检查?
  10. Java编程思想精彩评注分享之二
  11. gimp中文版教程_GIMP中文详细教程.pdf
  12. 学习《自己动手写网络爬虫》之记录2
  13. HTML页面中条形码或二维码扫描枪的使用
  14. vlan的几种划分方式
  15. 数据之美(五):美不胜收的数据图(上)
  16. 成从武:其他人绕不开高德
  17. 码元速率的盲估计-包络谱法
  18. PDF转换成html的完美方法
  19. entity 与dto 区别
  20. 用UltraISO制作CentOS U盘安装盘

热门文章

  1. 获取mp3部分信息的python代码
  2. 夜神模拟器SD卡文件存储位置
  3. 如何成为一个Linux内核开发者(经典)
  4. 自己动手编译最新Android源码及SDK
  5. 安装net-speeder,加速***
  6. sin30的c语言表达式,c语言sin30度怎么打
  7. html5分镜头脚本范例,分镜头脚本范本.pdf
  8. Mono.Cecil FAQ文档翻译
  9. 弘辽科技:淘宝店铺违规再也不用怕了 这个新规能抵消扣分处罚
  10. 整理最全的图床集合——三千图床