你好,你可能知道PHP最近推出password_hash
内置的最新版本。 该文件说:
如果省略,随机盐将被创建并默认成本将被使用。
现在的问题是什么样的方法并用它来添加盐?
我很感兴趣,因为我想知道,如果是随机生成的盐,这样,当我存储我的哈希密码,他们始终是唯一的 。
你好,你可能知道PHP最近推出password_hash
内置的最新版本。 该文件说:
如果省略,随机盐将被创建并默认成本将被使用。
现在的问题是什么样的方法并用它来添加盐?
我很感兴趣,因为我想知道,如果是随机生成的盐,这样,当我存储我的哈希密码,他们始终是唯一的 。
所述盐随机创建。 他们应该是统计学上是独一无二的。
怎么看,检查出的C源代码 。
在Windows中,它会尝试使用php_win32_get_random_bytes()
生成的盐:
BYTE *iv_b = (BYTE *) buffer;
if (php_win32_get_random_bytes(iv_b, raw_length) == SUCCESS) {
buffer_valid = 1;
}
在Linux上,它会尝试读取/dev/urandom
生成盐:
int fd, n;
size_t read_bytes = 0;
fd = open("/dev/urandom", O_RDONLY);
if (fd >= 0) {
while (read_bytes < raw_length) {
n = read(fd, buffer + read_bytes, raw_length - read_bytes);
if (n < 0) {
break;
}
read_bytes += (size_t) n;
}
close(fd);
}
if (read_bytes >= raw_length) {
buffer_valid = 1;
}
然后,这两个后,如果缓冲区是无效的(不完整的,也可能是部分的),它使用RAND()来填充它。 请注意,在实践中,这是不可能发生的,它只是一个回退:
if (!buffer_valid) {
for (i = 0; i < raw_length; i++) {
buffer[i] ^= (char) (255.0 * php_rand(TSRMLS_C) / RAND_MAX);
}
}
现在,如果C是不是你的那杯茶,同样的逻辑和算法PHP实现在我的compat的图书馆 :
$buffer = '';
$raw_length = (int) ($required_salt_len * 3 / 4 + 1);
$buffer_valid = false;
if (function_exists('mcrypt_create_iv')) {
$buffer = mcrypt_create_iv($raw_length, MCRYPT_DEV_URANDOM);
if ($buffer) {
$buffer_valid = true;
}
}
if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
$buffer = openssl_random_pseudo_bytes($raw_length);
if ($buffer) {
$buffer_valid = true;
}
}
if (!$buffer_valid && is_readable('/dev/urandom')) {
$f = fopen('/dev/urandom', 'r');
$read = strlen($buffer);
while ($read < $raw_length) {
$buffer .= fread($f, $raw_length - $read);
$read = strlen($buffer);
}
fclose($f);
if ($read >= $raw_length) {
$buffer_valid = true;
}
}
if (!$buffer_valid || strlen($buffer) < $raw_length) {
$bl = strlen($buffer);
for ($i = 0; $i < $raw_length; $i++) {
if ($i < $bl) {
$buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
} else {
$buffer .= chr(mt_rand(0, 255));
}
}
}
唯一的区别是,PHP版本将使用mcrypt
或openssl
,如果安装要么...