题
PHP 中有什么方法可以生成随机的、可变长度的盐以用于散列?假设我想制作一个 16 个字符的长盐 - 我该怎么做?
没有正确的解决方案
其他提示
编辑:所述mcrypt扩展已被弃用。 对于新的项目,看看结果 random_bytes(INT $长度)结果 和钠(如PHP 7.2核 - 的)扩展。
如果 mcrypt扩展是可用的,你可以简单地使用的 mcrypt_create_iv(大小,源)以创建盐。
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);
既然“字符串”的每个字节可以是在0-255范围内之间需要一个二进制安全功能,节省/检索它。
根据您的操作系统,是这样的:
$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);
别上随机和urandom的行为阅读起来。
虽然其他人已经正确地指出,有一些问题,MD5和重复散列,口令(即相对短的字符串)蛮力攻击采取相同的时间量而不管该散列算法多么复杂是
下进行。
下面是我发现了一个函数,以产生随机字符串:
/* random string */
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
好的盐有两个先决条件:它必须很长,而且必须是随机的。有很多方法可以实现这一点。您可以使用以下组合 microtime
和 rand
, 例如,但您可能会竭尽全力确保您的盐是独一无二的。
虽然冲突的可能性可以忽略不计,但请记住,使用 MD5 或其他容易发生冲突的算法对盐进行哈希处理将减少盐无缘无故唯一的可能性。
编辑:代替 rand()
为了 mt_rand()
. 。正如迈克尔指出的那样,这比 rand
.
不隶属于 StackOverflow