盐和散列,为啥不使用用户名?

Posted

技术标签:

【中文标题】盐和散列,为啥不使用用户名?【英文标题】:Salt and hashing, why not use username?盐和散列,为什么不使用用户名? 【发布时间】:2011-07-30 17:15:12 【问题描述】:

我必须承认,我对与 Web 应用程序相关的大多数高科技安全问题基本上一无所知,但我至少认为我可以问一件事,因为这是一个直接的问题,并且(希望)有一个具体的答案。

拿这个网站:http://www.15seconds.com/issue/000217.htm

这表明他们将盐值存储在表中,我了解使用盐背后的原理和数学,但我想知道这一点:

为什么他们不直接使用用户名作为盐值而不是生成盐值?

【问题讨论】:

【参考方案1】:

因为用户名的熵比随机盐低,所以他们散布散列的散列比适当的盐少。

无论如何,该页面上的示例并不是非常壮观。我总是只生成一个 GUID 并使用它。

我怀疑,就现​​实生活中的安全性而言,这一切都已尘埃落定,即使是非常少量的每位用户 salt 也会对安全性产生很大影响,随着 salt 变得越来越复杂,改进也非常小。

【讨论】:

谢谢,这符合我对这个主题的最初想法。 另一个考虑:如果不使用用户名作为哈希的一部分,管理员就不可能在不知道用户密码或更改密码的情况下更改用户的用户名吗?我刚刚在我继承的系统中遇到了这个问题,其中电子邮件用作用户名......哈希包含一个随机盐字符串,但是因为它还包含电子邮件地址,所以它导致了上述更改电子邮件的问题。 @MattBrowne:非常好的观点!一个实际的想法是:如果用户试图自己更改他的电子邮件,通常他应该输入密码来确认更改。您可以首先验证密码(使用旧电子邮件/用户名),然后在单个事务中更改电子邮件地址,并根据输入的密码计算新密码哈希。并不是说我建议使用用户名/电子邮件作为盐,只是关于这个问题的想法。但是在不输入密码的情况下更改电子邮件/用户名(例如,管理员想要为某人更改)显然仍然是不可能的。 当您第一次构建系统时,无法预测所有未来的需求,其中一个可能是管理员更改用户名,即使起初看起来用户可以更改自己的用户名就足够了用户名。 更改密码散列机制确实很痛苦,因为这意味着所有用户都必须更改密码。【参考方案2】:

盐的重点是独一无二。 salt旨在防止攻击成本共享,即攻击者试图以低于攻击成本两倍的成本攻击两个散列密码。

确保唯一性的一种解决方案是在足够宽的空间中生成随机盐。因此,为两个不同的密码实例获得两倍相同的盐是不可能在实践中发生的。

用户名不够独特

用户更改密码时用户名不会更改。看到旧哈希密码和新哈希密码的攻击者可能会以低于攻击成本两倍的成本同时攻击两者。 在给定时间,用户名在系统范围内是唯一的,而不是在全球范围内。那里有很多“bob”(在 Unix 系统中,考虑“root”)。使用用户名可能允许攻击者同时攻击多个系统。

盐熵并不是很重要,除非它确保了随机生成设置中的唯一性。

【讨论】:

我经常看到有关新密码+旧密码的信息,但我不清楚为什么人们攻击旧密码很有用。我可以告诉你,我昨天使用的旧密码是“letmein”,但今天对你没有帮助。 在基于密码的加密的上下文中更有意义,例如作为保护 Zip 存档。此外,用户倾向于重复使用密码,因此旧密码通常也是未来的密码(或同一个人在另一个系统中使用的密码)。 好吧,那么我认为使用哈希(域 + 用户名 + 密码)之类的东西使其全局和本地唯一没有问题。但是,旧密码和用户名更改的参数仍然有效。【参考方案3】:

怎么样:

Salt = CryptoHash( CryptoHash(SubmittedEmailOrUsername) . CryptoHash(SubmittedPasswd) ) ?

貌似是这样的

    具有不需要存储盐的优点,因为它可以动态计算,

    同时仍然具有良好的熵(基于哈希而不是明文),并且

    提供与加密哈希一样长的盐,例如 128-512 位?

一个问题是如果系统允许两个用户拥有用户名和密码(虽然不会发生在电子邮件地址中),但是这个方案还有其他问题吗?

【讨论】:

这是循环的:盐用于获取“CryptoHash(Passwd)”。 这并没有真正回答问题,即“我们为什么不使用用户名?”,而不是“我们可以做些什么来更好地使用用户名?”。
戴维斯,你能详细说明一下循环吗?这里是Registering + Lookup,好像ok?注册/新账号,新用户提交邮箱和密码系统计算Salt=Hash(Hash(Email).Hash(passwd)) 系统现在可以计算该电子邮件的 StoredPassword = Hash(Salt . Email . Passwd) 对于登录,用户输入电子邮件和密码 系统计算 Salt=Hash( Hash(Email) . Hash (Passwd) ) 系统查找电子邮件的 StoredPassword 系统将 StoredPassword 与 Hash(Salt . Email . Passwd)进行比较
对格式化表示歉意:(它不允许我添加换行符(它说使用“​​”,但似乎不在回复子集中),然后我的 5 分钟编辑时间到期。阅读现在格式化/评论帮助页面

以上是关于盐和散列,为啥不使用用户名?的主要内容,如果未能解决你的问题,请参考以下文章

如果数据库是可访问的,那么盐和散列的意义何在?

如何针对密码的特定字母进行身份验证[重复]

检查散列的 REST API 令牌

用户密码盐的最佳长度是多少? [关闭]

明文密码和散列值抓取防范方法

带有休眠和散列密码的 Spring Security DB 身份验证?