14

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

4

4 回答 4

60

编辑: mcrypt 扩展已被弃用。对于新项目,请查看
random_bytes ( int $length )
sodium (截至 php 7.2 core-) 扩展。


如果mcrypt 扩展可用,您可以简单地使用mcrypt_create_iv(size, source)创建盐。

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

由于“字符串”的每个字节都可以在 0-255 之间的范围内,因此您需要一个二进制安全函数来保存/检索它。

于 2010-02-10T09:06:49.707 回答
3

根据您的操作系统,例如:

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

请阅读 random 和 urandom 的行为。

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

C。

于 2010-02-10T09:11:09.653 回答
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;
}
于 2012-07-12T17:17:28.903 回答
0

好盐有两个先决条件:一定要长,一定要随意。有很多方法可以做到这一点。例如,您可以使用microtime和的组合rand,但您可能会花更多的时间来确保您的盐是唯一的。

虽然发生冲突的可能性可以忽略不计,但请记住,使用 MD5 或其他易发生冲突的算法对您的盐进行散列将减少您的盐无缘无故地唯一的机会。

编辑:代替rand(). mt_rand()正如迈克尔所说,它比rand.

于 2010-02-10T08:55:09.310 回答