我不确定密码哈希的工作原理(稍后将实现),但现在需要创建数据库架构。
我正在考虑将密码限制为4-20个字符,但是据我了解,加密哈希字符串后的长度将不同。
那么,如何将这些密码存储在数据库中呢?
更新:仅使用哈希函数不足以存储密码。您应该阅读Gilles在该主题上的答案,以获取更详细的解释。
对于密码,请使用增强密钥的哈希算法,例如Bcrypt或Argon2i。例如,在PHP中,使用password_hash()函数(默认情况下使用Bcrypt)。
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
结果是一个类似于以下内容的60个字符的字符串(但是数字会有所不同,因为它会生成唯一的盐)。
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
使用SQL数据类型CHAR(60)存储Bcrypt哈希的这种编码。请注意,此函数不会编码为十六进制数字的字符串,因此我们无法轻松地将其以十六进制形式存储为二进制。
CHAR(60)
其他散列函数仍具有用途,但不能用于存储密码,因此,我将在下面保留原始答案,该答案写于2008年。
这取决于您使用的哈希算法。不管输入如何,散列总是产生相同长度的结果。通常用一系列十六进制数字表示文本中的二进制哈希结果。或者,您可以使用该UNHEX()函数将十六进制数字的字符串减少一半。
UNHEX()
自2015年起,NIST 建议在需要互操作性的哈希函数的任何应用程序中使用SHA-256或更高版本。但是NIST不建议使用这些简单的哈希函数来安全地存储密码。
较小的散列算法有其用途(例如在应用程序内部,而不是用于交换),但是众所周知,它们是可破解的。