Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.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 使用openssl_random_pseudo_bytes()对mt_rand()进行种子设定_Php_Cryptography_Password Generator - Fatal编程技术网

Php 使用openssl_random_pseudo_bytes()对mt_rand()进行种子设定

Php 使用openssl_random_pseudo_bytes()对mt_rand()进行种子设定,php,cryptography,password-generator,Php,Cryptography,Password Generator,我正在尝试使用openssl\u random\u pseudo\u bytes构建一个简单的密码生成函数,并想知道它是否具有强大的加密功能 函数随机密码($length=12){ mt_srand(hexdec(bin2hex(openssl_随机_伪_字节(256))); $alphabet='abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz1234567890!@#$&*-=+.?'; $pass=''; $alphaLength=str

我正在尝试使用
openssl\u random\u pseudo\u bytes
构建一个简单的密码生成函数,并想知道它是否具有强大的加密功能

函数随机密码($length=12){
mt_srand(hexdec(bin2hex(openssl_随机_伪_字节(256)));
$alphabet='abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz1234567890!@#$&*-=+.?';
$pass='';
$alphaLength=strlen($alphabet)-1;
对于($i=0;$i<$length;$i++){
$n=mt_rand(0,$alphaLength);
$pass.=$alphabet[$n];
}
返回$pass;
}
我会假设,如果在
mt\u rand
函数中存在一个弱点,那么不管它是否使用
openssl\u random\u pseudo\u字节进行种子设定
。然而,我一直找不到关于这个话题的任何讨论。

根据
openssl\u random\u pseudo\u bytes
不能保证生成加密强随机数据。然而,在不太可能的情况下,它无法使用加密强大的RNG,它至少会告诉您。这就是
openssl\u random\u pseudo\u bytes
的第二个参数的作用:

它还指示是否使用加密强算法生成伪随机字节,并通过可选的
crypto_strong
参数执行此操作。这种情况很少出现
错误
,但有些系统可能已损坏或陈旧

您可以传递此参数,然后检查其值:

$bytes = openssl_random_pseudo_bytes(256, $strong);
if (!$strong) {
    // handle error as necessary.
}
然而,与
openssl\u random\u pseudo\u bytes
相反,
mt\u rand
不产生加密安全值

此函数不生成加密安全值,不应用于加密目的

我不是专家,但我怀疑在Mersenne Twister中植入安全随机数据会使生成的数据更加安全(如果有的话,可能只是第一个字节):

反建议 您没有说明正在使用哪个版本的PHP。如果您使用的是PHP7,那么它可能是一个很好的替代方案(它还明确声明是加密安全的):

($i=0;$i<$length;$i++)的
{
$n=随机整数(0,$alphaLength);
$pass.=$alphabet[$n];
}
或者,为
rand
函数提供基于PHP的安全实现,该函数使用OpenSSL作为CSPRNG,您可以根据
openssl\u random\u pseudo\u bytes
不能保证生成加密强随机数据。然而,在不太可能的情况下,它无法使用加密强大的RNG,它至少会告诉您。这就是
openssl\u random\u pseudo\u bytes
的第二个参数的作用:

它还指示是否使用加密强算法生成伪随机字节,并通过可选的
crypto_strong
参数执行此操作。这种情况很少出现
错误
,但有些系统可能已损坏或陈旧

您可以传递此参数,然后检查其值:

$bytes = openssl_random_pseudo_bytes(256, $strong);
if (!$strong) {
    // handle error as necessary.
}
然而,与
openssl\u random\u pseudo\u bytes
相反,
mt\u rand
不产生加密安全值

此函数不生成加密安全值,不应用于加密目的

我不是专家,但我怀疑在Mersenne Twister中植入安全随机数据会使生成的数据更加安全(如果有的话,可能只是第一个字节):

反建议 您没有说明正在使用哪个版本的PHP。如果您使用的是PHP7,那么它可能是一个很好的替代方案(它还明确声明是加密安全的):

($i=0;$i<$length;$i++)的
{
$n=随机整数(0,$alphaLength);
$pass.=$alphabet[$n];
}

或者,为
rand
函数提供一个基于PHP的安全实现,该函数使用OpenSSL作为CSPRNG,您可以使用它来代替
random\u int

它只在存储时安全。充其量,我只会用它来生成一个(一次性)验证令牌,而不会用它来存储密码,如果是这样的话。对,这只是为了给用户一个随机密码。存储是一种完全不同的生物(散列等)。它只在存储时安全。充其量,我只会用它来生成一个(一次性)验证令牌,而不会用它来存储密码,如果是这样的话。对,这只是为了给用户一个随机密码。存储是一种完全不同的生物(散列等)。谢谢@helmbert。我可以在函数中包含
cryto\u strong
检查。你对梅森龙卷风的评论是我问题的核心。我想,
mt_rand
将是弱点,但我不知道背后的科学依据。我将查看
random\u int
。在问这个问题之前,我确实读过这个答案。我用它的一些想法写了一个函数的变体。感谢未来读者的链接。谢谢@helmbert。我可以在函数中包含
cryto\u strong
检查。你对梅森龙卷风的评论是我问题的核心。我想,
mt_rand
将是弱点,但我不知道背后的科学依据。我将查看
random\u int
。在问这个问题之前,我确实读过这个答案。我用它的一些想法写了一个函数的变体。感谢为未来读者提供链接。