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
。在问这个问题之前,我确实读过这个答案。我用它的一些想法写了一个函数的变体。感谢为未来读者提供链接。