z-b*_*oss 258 mysql passwords hash types cryptography
我不确定密码哈希是如何工作的(将在以后实现),但现在需要创建数据库模式.
我正在考虑将密码限制为4-20个字符,但据我所知,加密后的哈希字符串将具有不同的长度.
那么,如何将这些密码存储在数据库中?
Bil*_*win 440
这取决于您使用的散列算法.无论输入如何,散列总是产生相同长度的结果.通常将文本中的二进制哈希结果表示为一系列十六进制数字.或者您可以使用该CHAR(60)函数将十六进制数字字符串减少一半.
NIST建议使用SHA-256或更高版本的密码.较小的散列算法有其用途,但已知它们是可破解的.
你应该盐将散列函数之前,你的密码.Salting密码不会影响散列结果的长度.
Noa*_*ich 13
实际上,您可以使用CHAR(哈希长度)来定义MySQL的数据类型,因为每个哈希算法总是会计算出相同数量的字符.例如,SHA1始终返回40个字符的十六进制数.
作为固定长度的字符串(VARCHAR(n)或MySQL调用它).散列总是固定长度,例如12个字符(取决于您使用的散列算法).因此,20个字符的密码将减少为12个字符的哈希值,而4个字符的密码也会产生12个字符的哈希值.
Argon2赢得了2015年密码哈希竞赛。Scrypt,bcrypt和PBKDF2是较旧的算法,现在认为它们较不受欢迎,但从根本上讲还是不错的,因此,如果您的平台尚不支持Argon2,则可以现在使用另一种算法。
切勿将密码直接存储在数据库中。也不要对其进行加密:否则,如果您的站点遭到破坏,攻击者将获得解密密钥,因此可以获得所有密码。密码必须是散列的。
甲密码哈希具有从哈希表散列或密码散列不同的特性。切勿在密码上使用普通的密码哈希,例如MD5,SHA-256或SHA-512。密码哈希算法使用salt,它是唯一的(不用于任何其他用户或任何其他人的数据库中)。盐是必不可少的,这样攻击者就不能仅预先计算常用密码的哈希值:使用盐,他们必须为每个帐户重新开始计算。密码哈希算法本质上很慢 -尽你所能地慢。慢速攻击对您的伤害要比您大得多,因为攻击者必须尝试许多不同的密码。有关更多信息,请参见如何安全地对密码进行哈希处理。
密码哈希编码四个信息:
许多库都包含一对函数,可方便地将此信息打包为单个字符串:一个带有算法指示符,硬度指示符和密码,生成随机盐并返回完整的哈希字符串的函数;另一个将密码和完整的哈希字符串作为输入,并返回一个布尔值,指示密码是否正确。没有通用标准,但是通用的编码是
$ 算法 $ 参数 $ 盐 $ 输出
其中algorithm是一个数字或编码算法的选择一个短字母数字串,parameters是可打印字符串,salt并output以Base64而不终止被编码=。
16个字节足以容纳盐和输出。(例如,参见有关Argon2的建议。)以Base64编码,每个21个字符。其他两个部分取决于算法和参数,但是典型的是20–40个字符。总共大约有82个ASCII字符(CHAR(82)并且不需要Unicode),如果您认为以后很难扩展该字段,则应在其中添加安全边距。
如果您以二进制格式对哈希进行编码,则算法的哈希值可以减少到1个字节,硬度值可以减少到1-4个字节(如果您对某些参数进行了硬编码),salt和output可以分别减少到16个字节,共37个字节。说40个字节(BINARY(40))至少有几个备用字节。请注意,这些是8位字节,不是可打印字符,尤其是该字段可以包含空字节。
请注意,哈希的长度与密码的长度完全无关。
哈希是一个位序列(128 位、160 位、256 位等,具体取决于算法)。binary(n)如果 MySQL 允许(SQL Server 数据类型是或) ,您的列应该是二进制类型,而不是文本/字符类型varbinary(n)。您还应该对哈希值加盐。盐可以是文本或二进制,您将需要相应的列。
TEXT为了向前兼容,您应该使用(存储无限数量的字符)。随着时间的推移,散列算法(需要)变得更强大,因此随着时间的推移,这个数据库字段将需要支持更多的字符。此外,根据您的迁移策略,您可能需要将新旧哈希存储在同一字段中,因此不建议将长度固定为一种类型的哈希。
| 归档时间: |
|
| 查看次数: |
302630 次 |
| 最近记录: |