Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我已经创建了一个伪随机生成器,它对加密安全吗?_Php_Security_Random_Cryptography - Fatal编程技术网

Php 我已经创建了一个伪随机生成器,它对加密安全吗?

Php 我已经创建了一个伪随机生成器,它对加密安全吗?,php,security,random,cryptography,Php,Security,Random,Cryptography,我创建了一个用于加密目的的随机生成器,我想知道它是否足够安全。如果是,你当然可以自由使用。提前感谢您阅读我的文字墙:D 功能说明 $this->pref_hash_algo($bits_of_entropy=null,$inclusive=false)函数获取默认的哈希方法(在我的例子中是sha256),或者如果给定了$bits_of_entropy,它将获得包含或不包含的最佳哈希算法。例如,包含230位的熵将返回sha256,而独占将返回sha224 从self::$HASH_PREFEREN

我创建了一个用于加密目的的随机生成器,我想知道它是否足够安全。如果是,你当然可以自由使用。提前感谢您阅读我的文字墙: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\u type=self::output\u HEX)
它只执行PHP
hash($input,$algorithm[,$binary])
并额外检查算法是否安全,以及是否支持更多的输出类型,而不是二进制和十六进制

生成代码

为了便于访问,将第一个版本移动到

更新

根据您的输入,我已将代码更改为以下内容:

编辑摘要:

  • 不是散列,只是格式化/dev/uradom输出
  • 添加了同时输出哈希,用于当哈希算法对于请求的随机位数量的输出太少时(例如,当请求4000位时为sha512)
测试

案例1

我运行了
php/my/path/to/file.php | ent
,在一个2.000.000字节的样本上测试
/dev/uradom
方法和替代方法

  • /dev/uradom
    给出了每字节7.999903位的熵。()
  • 另一种方法给出了每字节7.99913位的熵。()
案例2

我使用替代方法创建了一个4,7MB的二进制文件(当
/dev/uradom
被禁用/不可用时),并运行
diehard-a-f/home/beanow/random.input-t10

  • /dev/uradom
    给出了两个漏洞()
  • 给出的替代方法:0个漏洞()
案例3

与案例2相同,但使用20MB二进制文件并删除-t参数以使用默认设置

  • /dev/uradom
    给出了4个漏洞()
  • 给出的替代方法:1弱()

密码学的规则1是不要设计自己的密码学。密码学非常微妙,很容易出错。没有理由避免使用操作系统内置PRNG;所有主要平台(*nix、Windows等)都有强大、易于理解、经过充分研究的PRNG。因此,请使用它们。

这并不是真正让您自己制作PRNG。我不知道你为什么要对
/dev/uradom
的输出进行哈希运算,如果这会降低系统的安全性的话。只需读出所需的字节,将其从base256更改为base16或其他任何需要的内容

您可以对输出运行许多测试,以确定输出的随机性

。。。[ent]对存储在文件中的字节序列应用各种测试,并报告这些测试的结果。[ent]对于评估用于加密和统计采样应用、压缩算法和其他文件信息密度相关应用的伪随机数生成器非常有用

。。。用于测量随机数发生器质量的一组统计测试

diehard(像之前的diehard一样)的主要目的是为了便于对(伪)随机数生成器进行计时和测试,包括软件和硬件,用于研究和密码学的各种目的


使用自制的伪随机数生成器,通过diehard和diehard测试套件是相当困难的。

您使用的是预定义的哈希算法、uniqid和microtime函数,然后将它们组合在一起。您的“算法”与您使用的哈希算法一样好,没有更差,也没有更好。请参阅(但请跳过“已接受”答案,这有点错误)您创建的PRNG在哪里?我看到您正在使用一个:
/dev/uradom
或操作系统多次向您抛出的任何东西(隐含在
uniqid
mt_rand
中)。几乎不一样。(还有,“压缩”随机数据?巨大的红旗!)。你自己写了问题的答案,IMNSHO:“不要试图改进它,你很可能会毁掉它——反正我做了。”@N.B:从来没有更好过,但几乎总是更糟。@Beanow-如果你看不到你的“算法”取决于你使用的哈希算法的属性。。我们不能谈论你自己的散列。您只是使用了那些开销更大的算法。你所得到的只是在相同数量的排列下延长执行时间。必须有人这样做。此外,如果有内置的操作系统,我也会使用它。我编写了备份算法。他是大多数*nix系统附带的PRNG。然后对结果进行散列,这不会增加输出的熵。不要试图添加东西或可爱的东西,阅读系统PRNG并使用它。感谢你发布了最具建设性的答案,而不是假设我是一个随机脚本的孩子,使一些奇怪的东西。(后来我发现我的功能很像Drupal)。我会接受它,因为人们在有机会直接了解它的工作原理之前就关闭了它。我已经使用线程中的反馈来改进函数并添加测试结果。你能看到我是否正确解释了结果,并找到了一个几乎与
/dev/uradom
一样好的算法吗?(除此之外,我的方法要慢得多,可能会有一个可预测的因素。)如果你只是需要一个PRNG来模拟,那么这些测试是很好的