MASTG-TEST-0016:测试随机数生成
概述¶
静态分析¶
识别所有随机数生成器的实例,并查找自定义或众所周知的不安全类。 例如,java.util.Random
为每个给定的种子值生成相同的数字序列; 因此,数字序列是可预测的。 相反,应该选择一个经过充分审查的算法,该算法目前被该领域的专家认为是强大的,并且应该使用经过充分测试的具有足够长度种子的实现。
识别所有未使用默认构造函数创建的 SecureRandom
实例。 指定种子值可能会降低随机性。 仅使用 SecureRandom
的无参数构造函数,该构造函数使用系统指定的种子值来生成 128 字节长的随机数。
一般来说,如果一个PRNG没有被宣传为密码学安全(例如java.util.Random
),那么它可能是一个统计PRNG,不应该用于安全敏感的上下文。如果生成器已知且种子可以被猜到,伪随机数生成器可以产生可预测的数字。一个128位的种子是产生一个“足够随机”的数字的良好起点。
一旦攻击者知道使用了哪种弱伪随机数生成器 (PRNG),编写一个概念验证来基于先前观察到的值生成下一个随机值可能非常简单,就像对 Java Random 所做的那样。 在非常弱的自定义随机生成器的情况下,可以通过统计方式观察模式。 尽管推荐的方法无论如何都是反编译 APK 并检查算法(请参阅静态分析)。
如果您想测试随机性,您可以尝试捕获大量的数字,并使用 Burp 的 sequencer 来查看随机性的质量如何。
动态分析¶
您可以使用 方法追踪在提到的类和方法上,以确定正在使用的输入/输出值。