我一直在尝试使用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;
?>
答案 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)