什么数据types用于散列密码字段和多长?

我不确定密码哈希如何工作(稍后将实现),但现在需要创build数据库模式。

我想限制密码为4-20个字符,但据我所知encryption后的哈希string将是不同的长度。

那么,如何将这些密码存储在数据库中呢?

这取决于你使用的哈希algorithm。 无论input如何,哈希总是产生相同长度的结果。 典型的是将二进制散列结果以文本forms表示为一系列hex数字。 或者,您可以使用UNHEX()函数将一串hex数字减less一半。

  • MD5生成一个128位的散列值。 您可以使用CHAR(32)或BINARY(16)
  • SHA-1生成一个160位的散列值。 您可以使用CHAR(40)或BINARY(20)
  • SHA-224生成一个224位的散列值。 您可以使用CHAR(56)或BINARY(28)
  • SHA-256生成一个256位散列值。 您可以使用CHAR(64)或BINARY(32)
  • SHA-384会生成一个384位的散列值。 您可以使用CHAR(96)或BINARY(48)
  • SHA-512生成一个512位散列值。 您可以使用CHAR(128)或BINARY(64)
  • BCrypt生成一个实现相关的448位散列值。 您可能需要CHAR(56),CHAR(60),CHAR(76),BINARY(56)或BINARY(60)

NISTbuild议使用SHA-256或更高的密码。 较小的哈希algorithm有其用途,但已知它们是可破解的 。

在应用哈希函数之前,您应该使用密码。 提供密码不会影响哈希结果的长度。

实际上,您可以使用CHAR(哈希长度)来为MySQL定义您的数据types,因为每个哈希algorithm总是会计算出相同数量的字符。 例如,SHA1总是返回一个40个字符的hex数字。

作为一个固定长度的string(VARCHAR(n)或者MySQL调用它)。 散列总是固定长度,例如12个字符(取决于您使用的散列algorithm)。 所以20个字符的密码将被减less到12个字符的散列,而一个4个字符的密码也会产生一个12个字符的散列。

你可能会发现这个维基百科的文章腌制值得 。 这个想法是添加一组数据来随机化你的散列值; 这将保护您的密码免受字典攻击,如果有人未经授权访问密码散列。

哈希是一个比特序列(128比特,160比特,256比特等,这取决于algorithm)。 如果MySQL允许它(SQL Server数据types是binary(n)varbinary(n) ),那么你的列应该是二进制types的,而不是文本/字符types。 你也应该盐的哈希值。 盐可能是文本或二进制,你将需要一个相应的列。

这真的取决于你正在使用的哈希algorithm。 如果我没有记错的话,密码的长度与散列的长度无关。 查看你正在使用的散列algorithm的规格,运行几个testing,然后截断。

对于md5 vARCHAR(32)是适当的。 对于那些使用AES更好地使用varbinary。

我一直在testingfindencryptionstring的最大string长度,并将其设置为VARCHARtypes的字符长度。 取决于您将拥有多less条logging,这可能确实有助于数据库的大小。

为了向前兼容,您应该使用TEXT (存储无限数量的字符)。 随着时间的推移,散列algorithm(需要)变得更强,因此这个数据库领域将需要随着时间的推移支持更多的字符。 另外,根据您的迁移策略,您可能需要将新旧散列存储在同一个字段中,因此不推荐将其长度固定为一种散列types。