使用随机盐验证密码

时间:2012-06-05 00:46:51

标签: php password-hash

我一直在尝试使用mysql DB了解存储在用户表中的哈希和salt。我完成了存储它们但似乎无法解决用户登录时如何验证的问题 我已经浏览过并看到过将盐和散列分开存储在一起。我生产的盐是随机的。

任何想法?
我已经发布了我的代码。

<?php
$password = 'passwordwhatever';

//generate the salt
function gen_salt() {
    $salt = uniqid(mt_rand(), true) . sha1(uniqid(mt_rand(), true));
    $salt = crypt('sha512', $salt);
    return $salt;
}

//generate the hash
function gen_hash($salt, $password) {
    $hash = $salt . $password;
    for($i = 0; $i < 100000; $i++) {
        $hash = crypt('sha512', $hash);
    }

    $hash = $salt . $hash;
    return $hash;
}

$password = gen_hash(gen_salt(), $password);
echo $password;

?>

3 个答案:

答案 0 :(得分:2)

只要你生产相同的盐,它就不会太重要了。只要您能够访问它,就可以在配置中将其存储在数据库中。扭转SHA512哈希的努力是如此之高,除非你是五角大楼,否则没人会打扰。关键是你希望能够用相同的盐重复哈希,这样你就可以非常确定输入是否相同,而不必存储敏感输入。如果这是有道理的。

答案 1 :(得分:0)

盐需要包含在数据库(或某个地方)的某个地方。一些选项是将salt附加到哈希值或存储为其自己的字段。我喜欢将它附加到哈希。

$password = $salt . '.' . $hash;

然后,当用户登录时,您获取密码,将其分解为哈希和盐,并使用密码生成功能(使用密码中的盐而不是随机盐)来确定它是否与数据库中的密码。

list($salt,$hash) = explode('.', $password);
$check = gen_hash($salt, $input_pass);
if ($check === $password)
    // valid

答案 2 :(得分:0)

也许你应该看看bcryptThis可能会对您有所帮助。我写了一些tutorials,但他们是德语。哦,PHP 5.3原生支持bcrypt。