我想知道如何对哈希值进行加盐并使用加盐的哈希值?如果密码是使用随机生成的盐进行加密,那么当用户尝试认证时我们如何验证它?我们需要在数据库中存储生成的哈希值吗?
是的。首先,您需要生成一个盐,然后从密码加上盐生成哈希值,将哈希值和盐一起保存。
盐应该如何生成?我不确定是否有共识。我使用 /dev/random 作为示例。
$salt = '$2a$12$'
. strtr(substr(base64_encode(shell_exec(
'dd if=/dev/random bs=16 count=1 2>/dev/null'
)), 0, 22), '+', '.')
. '$';
$hash = crypt($input, $salt);
哪种加密方法更受青睐?据我所知,sha256还不错。
请参考计算机大师的答案,即像上面的示例一样使用bcrypt。请参阅
PHP手册页面上的crypt()
。如果您的系统上没有bcrypt,则可以通过
Suhosin补丁来获取它。
当用户进行身份验证时,“重新加盐”哈希值是否是一个好主意?
盐只是使字典攻击变慢的一种方式。如果您有一个足够随机的盐,我认为经常更改它并不会有所帮助。您最好投入精力让用户选择好密码,定期更改密码,并将您的Blowfish成本参数保持在合理的值。
最后,多次重新哈希它是否会有任何重大安全提升?
这个问题属于密码设计领域。我建议您把它留给专家。换句话说:忘掉它——只需使用最佳常规实践即可。