我为加密目的创建了一个随机生成器,我想知道它是否足够安全。如果是你当然可以自由使用它。提前感谢您阅读我的文字墙:D
功能说明
$this->pref_hash_algo($bits_of_entropy=null, $inclusive=false)
函数获取默认的散列方法(在我的情况下为sha256
),或者如果给出$bits_of_entropy
,它将获得最佳散列算法,包括或不包含。例如,230比特的熵包含将返回sha256
而排他将返回sha224
。
从self::$HASH_PREFERENCES['128'][0]
返回的算法是ripemd128
对于$this->hash($input, $algorithm=null, $output_type=self::OUTPUT_HEX)
,它仅执行PHP hash($input, $algorithm[, $binary])
,并额外检查算法是否被认为是安全的,并支持更多的输出类型,然后是二进制和十六进制。
代码
为便于访问,请将第一个版本移至http://pastebin.com/YtJFvpah
更新
根据您的输入,我已将代码更改为以下内容:http://pastebin.com/bQ5tFDdh
编辑摘要:
测试
案例1
我运行php /my/path/to/file.php | ent
来测试/dev/urandom
方法和2.000.000字节样本的替代方法。
/dev/urandom
每字节熵为7.999903位。 (http://pastebin.com/NLqZ5Kza)案例2
我使用替代方法创建了一个4,7MB的二进制文件(当/dev/urandom
被禁用/不可用时)并运行dieharder -a -f /home/beanow/random.input -t 10
:
/dev/urandom
给出了:2个弱点(http://pastebin.com/HiwQeJtP)案例3
与案例2相同,但使用20MB二进制文件并删除-t参数以使用默认设置。
/dev/urandom
给了:4个弱点(http://pastebin.com/hwqQBTqu)答案 0 :(得分:1)
加密规则#1不设计您自己的加密。密码学非常微妙,很容易出错。没有理由应该避免使用OS内置的PRNG;所有主要平台(* nix,Windows等)都有强大,易于理解,经过充分研究的PRNG。所以使用那些。
答案 1 :(得分:1)
这并不是真正制作自己的PRNG。我不知道你为什么要从/dev/urandom
哈希输出,如果有什么事情会使这个系统不那么安全。只需读出您需要的字节,将其从base256更改为base16或其他任何需要的字节。
答案 2 :(得分:1)
您可以针对输出运行许多测试,以确定它的实际随机性。
<强> ent - A Pseudorandom Number Sequence Test Program 强>
... [ent]对存储在文件中的字节序列应用各种测试,并报告这些测试的结果。 [ent]对于评估伪随机数生成器以用于加密和统计抽样应用程序,压缩算法以及其他感兴趣文件信息密度的应用程序非常有用。
<强> The diehard test suite 强>
...用于测量随机数发生器质量的一系列统计测试。 Wikipedia
<强> The dieharder test suite 强>
顽固分子的主要观点(就像之前的死硬)是为了方便时间和测试(伪)随机数发生器,包括软件和硬件,用于研究和加密中的各种目的。
使用自制的伪随机数生成器,通过死硬和顽固测试套件非常困难。