如何生成随机的长盐用于散列?

时间:2010-02-10 08:47:53

标签: php salt-creation

用PHP制作随机可变长度盐用于散列的方法是什么?假设我想制作一个16个字符的长盐 - 我该怎么做?

4 个答案:

答案 0 :(得分:60)

编辑:不推荐使用mcrypt扩展名。 对于新项目,请看看 random_bytes ( int $length )
sodium(截至php 7.2 core-)扩展。


如果mcrypt extension可用,您只需使用mcrypt_create_iv(size, source)创建一个盐。

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);

由于“string”的每个字节都在0-255之间,你需要一个二进制安全函数来保存/检索它。

答案 1 :(得分:3)

取决于您的操作系统,例如:

$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);

请阅读随机和随机的行为。

虽然其他人已正确指出md5和重复散列存在一些问题,但对于密码(即相对较短的字符串),无论散列算法的复杂程度如何,暴力攻击都需要相同的时间。

下进行。

答案 2 :(得分:2)

这是我找到一个生成随机字符串的函数:

/* 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;
}

答案 3 :(得分:0)

好盐有两个先决条件:它必须很长,而且必须是随机的。有很多方法可以实现这一目标。例如,您可以使用microtimerand的组合,但您可能需要更长的时间来确保您的盐是唯一的。

虽然碰撞的可能性是微不足道的,但请记住,使用MD5或其他容易发生碰撞的算法对盐进行散列会减少盐无可匹敌的可能性。

编辑:将rand()替换为mt_rand()。正如迈克尔所说,它比rand好。