当前位置:  开发笔记 > 后端 > 正文

用于散列密码字段的数据类型和长度是多少?

如何解决《用于散列密码字段的数据类型和长度是多少?》经验,为你挑选了5个好方法。

我不确定密码哈希是如何工作的(将在以后实现),但现在需要创建数据库模式.

我正在考虑将密码限制为4-20个字符,但据我所知,加密后的哈希字符串将具有不同的长度.

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



1> Bill Karwin..:

这取决于您使用的散列算法.无论输入如何,散列总是产生相同长度的结果.通常将文本中的二进制哈希结果表示为一系列十六进制数字.或者您可以使用该CHAR(60)函数将十六进制数字字符串减少一半.

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)

NIST建议使用SHA-256或更高版本的密码.较小的散列算法有其用途,但已知它们是可破解的.

你应该盐将散列函数之前,你的密码.Salting密码不会影响散列结果的长度.


@Hippo:请不要使用用户名作为盐.为每个用户生成一个随机盐.
如果您将salt存储在同一个表(或具有相同访问权限的任何其他位置)中,则没有理由不将用户名用作salt,因为它对每个用户都是唯一的.但是,任何已知的盐都会使哈希密码弱于没有已知盐的哈希值.如果盐也是未知的,盐只会增加价值.
是的,没有理由不把它存放在同一行.即使攻击者获得了对数据库的访问权限,他们也必须根据该盐构建彩虹表.这就像猜测密码一样多.
我不明白已知与未知盐的交易.如果您正在实现一个站点 - 需要知道正在测试密码的登录页面/脚本/服务的salt.那么 - 你是"未知"的盐倡导者 - 你是否认为攻击者不知道登录过程的代码?否则 - 攻击者*不会总是*知道盐,它是随机的,唯一的,与散列密码一起存储还是分开?
@SgtPooki:您需要另一列来以明文形式存储盐.然后,您可以在键入时使用相同的盐对用户的密码进行哈希处理,并将结果与​​存储在表中的哈希摘要进行比较.
为了回应@fijiaaron,wrt"没有理由不使用用户名作为salt",请参阅http://security.stackexchange.com/a/41618/2572.在整个互联网中,盐应该是_globally_唯一的,就像在整个互联网中一样.将salt与密码一起存储在数据库中是_fine_.使用用户名作为盐会削弱它.
随机生成的盐是否也存储在同一个表行中?
@MikeT,您是否认为给定站点中的每个用户都使用相同的盐?不,**每位使用者**使用随机盐。然后,必须为每个用户创建一个不同的Rainbow表,这使其与蛮力密码猜测一样便宜(可能考虑存储)。

2> Noah Goodric..:

实际上,您可以使用CHAR(哈希长度)来定义MySQL的数据类型,因为每个哈希算法总是会计算出相同数量的字符.例如,SHA1始终返回40个字符的十六进制数.



3> Dana the San..:

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


是的,但在这方面绝对相关(+1)
这确实非常值得(+1),但它没有回答这个问题!(-1)
好点,但评论多于答案

4> Treb..:

作为固定长度的字符串(VARCHAR(n)或MySQL调用它).散列总是固定长度,例如12个字符(取决于您使用的散列算法).因此,20个字符的密码将减少为12个字符的哈希值,而4个字符的密码也会产生12个字符的哈希值.


'或者MySQL调用它' - MYSQL称之为CHAR.此类型用于固定长度值.所以我认为CHAR比VARCHAR更好.

5> Gilles 'SO- ..:
始终使用密码哈希算法:Argon2,scrypt,bcrypt或PBKDF2。

Argon2赢得了2015年密码哈希竞赛。Scrypt,bcrypt和PBKDF2是较旧的算法,现在认为它们较不受欢迎,但从根本上讲还是不错的,因此,如果您的平台尚不支持Argon2,则可以现在使用另一种算法。

切勿将密码直接存储在数据库中。也不要对其进行加密:否则,如果您的站点遭到破坏,攻击者将获得解密密钥,因此可以获得所有密码。密码必须是散列的

密码哈希具有从哈希表散列或密码散列不同的特性。切勿在密码上使用普通的密码哈希,例如MD5,SHA-256或SHA-512。密码哈希算法使用salt,它是唯一的(不用于任何其他用户或任何其他人的数据库中)。盐是必不可少的,这样攻击者就不能仅预先计算常用密码的哈希值:使用盐,他们必须为每个帐户重新开始计算。密码哈希算法本质上很慢 -尽你所能地慢。慢速攻击对您的伤害要比您大得多,因为攻击者必须尝试许多不同的密码。有关更多信息,请参见如何安全地对密码进行哈希处理。

密码哈希编码四个信息:

使用哪种算法的指标。这对于敏捷性是必需的:加密建议会随着时间而变化。您需要能够过渡到新算法。

难度或硬度指示器。该值越高,则需要更多的计算来计算散列。在密码更改功能中,该值应该是恒定值或全局配置值,但是随着计算机变得越来越快,它应该随着时间的推移而增加,因此您需要记住每个帐户的值。有些算法只有一个数字值,其他算法那里有更多参数(例如分别调整CPU使用率和RAM使用率)。

盐。由于盐必须是全局唯一的,因此必须为每个帐户存储。应在每次更改密码后随机生成盐。

适当的哈希,即哈希算法中数学计算的输出。

许多库都包含一对函数,可方便地将此信息打包为单个字符串:一个带有算法指示符,硬度指示符和密码,生成随机盐并返回完整的哈希字符串的函数;另一个将密码和完整的哈希字符串作为输入,并返回一个布尔值,指示密码是否正确。没有通用标准,但是通用的编码是

$ 算法 $ 参数 $  $ 输出

其中algorithm是一个数字或编码算法的选择一个短字母数字串,parameters是可打印字符串,saltoutput以Base64而不终止被编码=

16个字节足以容纳盐和输出。(例如,参见有关Argon2的建议。)以Base64编码,每个21个字符。其他两个部分取决于算法和参数,但是典型的是20–40个字符。总共大约有82个ASCII字符CHAR(82)并且不需要Unicode),如果您认为以后很难扩展该字段,则应在其中添加安全边距。

如果您以二进制格式对哈希进行编码,则算法的哈希值可以减少到1个字节,硬度值可以减少到1-4个字节(如果您对某些参数进行了硬编码),salt和output可以分别减少到16个字节,共37个字节。说40个字节BINARY(40))至少有几个备用字节。请注意,这些是8位字节,不是可打印字符,尤其是该字段可以包含空字节。

请注意,哈希的长度与密码的长度完全无关。

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有