我不确定密码哈希是如何工作的(稍后将实现它),但现在需要创建数据库模式。
我正在考虑将密码限制为4-20个字符,但据我所知,加密哈希字符串将具有不同的长度。
那么,如何在数据库中存储这些密码呢?
我不确定密码哈希是如何工作的(稍后将实现它),但现在需要创建数据库模式。
我正在考虑将密码限制为4-20个字符,但据我所知,加密哈希字符串将具有不同的长度。
那么,如何在数据库中存储这些密码呢?
当前回答
我一直在测试寻找加密字符串的最大字符串长度,并将其设置为VARCHAR类型的字符长度。根据您将拥有多少条记录,它确实有助于数据库大小。
其他回答
为了向前兼容,您应该使用TEXT(存储无限数量的字符)。随着时间的推移,哈希算法(需要)变得更加强大,因此随着时间的推移,这个数据库字段将需要支持更多的字符。此外,根据您的迁移策略,您可能需要在同一个字段中存储新的和旧的散列,因此不建议将长度固定为一种类型的散列。
作为一个固定长度的字符串(VARCHAR(n)或MySQL的称呼)。 哈希总是有一个固定的长度,例如12个字符(取决于您使用的哈希算法)。因此,20个字符的密码将被简化为12个字符的哈希,4个字符的密码也将生成12个字符的哈希。
我一直在测试寻找加密字符串的最大字符串长度,并将其设置为VARCHAR类型的字符长度。根据您将拥有多少条记录,它确实有助于数据库大小。
始终使用密码哈希算法:Argon2, scrypt, bcrypt或PBKDF2。
Argon2赢得了2015年的密码哈希比赛。Scrypt, bcrypt和PBKDF2是较老的算法,现在被认为不太受欢迎,但从根本上来说仍然是合理的,所以如果你的平台还不支持Argon2,现在可以使用另一种算法。
不要将密码直接存储在数据库中。也不要加密:否则,如果您的站点被攻破,攻击者就会获得解密密钥,从而获得所有密码。密码必须散列。
A password hash has different properties from a hash table hash or a cryptographic hash. Never use an ordinary cryptographic hash such as MD5, SHA-256 or SHA-512 on a password. A password hashing algorithm uses a salt, which is unique (not used for any other user or in anybody else's database). The salt is necessary so that attackers can't just pre-calculate the hashes of common passwords: with a salt, they have to restart the calculation for every account. A password hashing algorithm is intrinsically slow — as slow as you can afford. Slowness hurts the attacker a lot more than you because the attacker has to try many different passwords. For more information, see How to securely hash passwords.
密码哈希编码四段信息:
An indicator of which algorithm is used. This is necessary for agility: cryptographic recommendations change over time. You need to be able to transition to a new algorithm. A difficulty or hardness indicator. The higher this value, the more computation is needed to calculate the hash. This should be a constant or a global configuration value in the password change function, but it should increase over time as computers get faster, so you need to remember the value for each account. Some algorithms have a single numerical value, others have more parameters there (for example to tune CPU usage and RAM usage separately). The salt. Since the salt must be globally unique, it has to be stored for each account. The salt should be generated randomly on each password change. The hash proper, i.e. the output of the mathematical calculation in the hashing algorithm.
许多库包含一对函数,可以方便地将这些信息打包为单个字符串:一个函数接受算法指示符、硬度指示符和密码,生成一个随机salt并返回完整的哈希字符串;另一个以密码和完整的哈希字符串作为输入,并返回一个布尔值,指示密码是否正确。没有通用的标准,但有一个通用的编码
$algorithm$parameters$salt$output
其中algorithm是一个数字或编码算法选择的短字母数字字符串,parameters是一个可打印的字符串,salt和output用Base64编码,不终止=。
对于盐和输出,16个字节就足够了。(参见Argon2的推荐。)用Base64编码,每个有21个字符。另外两部分取决于算法和参数,但20-40个字符是典型的。总共大约有82个ASCII字符(CHAR(82),不需要Unicode),如果您认为以后很难扩大字段,则应该在此基础上添加一个安全裕度。
如果您以二进制格式对哈希进行编码,则可以将算法的哈希编码为1个字节,硬度为1 - 4个字节(如果您对某些参数进行硬编码),盐和输出分别为16个字节,总共为37个字节。假设是40字节(BINARY(40)),至少有两个空闲字节。注意,这些是8位字节,不是可打印字符,特别是字段可以包括空字节。
注意,散列的长度与密码的长度完全无关。
for md5 vARCHAR(32)是合适的。对于那些使用AES的人来说,最好使用varbinary。