哈希和盐值如何增强应用程序的安全性?

4
尽管我理解对于网站管理员来说保密密码是个好主意,因为他可能会尝试使用相同的密码登录用户的电子邮件,(因为很多用户在各处使用相同的密码)。但除此之外,我并不认为这有什么意义。我知道这使得字典攻击更加困难,但是如果有人未经授权进入数据库,那么担心密码已经太晚了吧?这个人现在已经可以访问数据库中的所有表,并且可以随意做任何想做的事情。还是我漏看了什么重要信息吗?
10个回答

8
更大的问题是,人们往往会在各个网站上使用相同的密码(点此这里了解更多)。因此,如果你获得了一个包含用户名和未加盐密码的数据库,那么这些密码很可能也能在其他地方生效,比如hotmail、gmail等等。

6
这个人可能有权限在你的系统中做任何他/她想做的事情,但你不应该允许他/她通过使用你用户的密码来处理其他系统
密码是你用户的财产,你应该妥善保管。

6

很多用户在您的网站上使用与他们在银行使用的相同凭据(用户名/密码)。如果有人能够获取凭据表,他们就可以立即访问一堆银行帐户。失败。

如果您实际上不存储密码,则攻击者无法仅通过获取凭据表来窃取您用户的银行帐户。


6
它依赖于哈希是单向函数的事实。换句话说,将密码转换为哈希非常容易,但反过来却很困难。
因此,当用户注册时,您将其选择的密码转换为哈希并存储它。稍后,他们使用密码登录,您将密码转换为其哈希并进行比较,这是因为高概率情况下,如果(passwordhashA == passwordhashB),则passwordA = passwordB。
盐是相关问题的解决方案。如果您知道某人的passwordhash是ABCDEF,那么您可以尝试计算所有可能密码的哈希值。迟早有一天,您可能会发现hash('dog')= ABCDEF,因此您知道他们的密码。这需要很长时间,但是使用预先创建的“字典”可以加速该过程,在给定哈希的情况下,您可以查找相应的密码。然而,盐意味着被散列的文本不是简单的英语单词或简单的单词组合。例如,上面给出的例子,将被散列的文本不是“dog”,而是“somecrazymadeuptextdog”。这意味着任何可用的字典都是无用的,因为其中包含该文本哈希的可能性要小得多,而包含“dog”哈希的可能性要大得多。如果盐是随机的字母数字字符串,则这种可能性变得更低。

我甚至会说相反的是不可能的,因为一个哈希可以匹配多个密码。然而,我们可以尝试计算与哈希匹配的(而不是唯一的)密码。 - Brann

4

网站管理员可能不是唯一能够访问您密码的人。整个数据库被意外地上传到公共分享的可能性总是存在的。在这种情况下,全世界所有有互联网接入的人都可以下载并阅读明文存储的密码。

是的,这种事情确实发生过,甚至包括信用卡数据。

是的,这种事情高度可能会再次发生。


3
"如果有人未经授权进入数据库,那么关于密码的担忧是否已经太晚了?"
你假设数据库设计不良,其中授权数据与应用程序数据混杂在一起。 "关注点分离"原则和"最小访问权限"原则建议用户凭证应与其他内容分开存储。
例如,将用户凭证保存在LDAP服务器中。此外,您的问题假定数据库凭据是唯一的凭据。同样,最小访问权限原则建议您具有与数据库凭证分开的应用凭证。您的Web应用程序用户名和密码不是数据库用户名和密码。桌面应用程序也是如此。应用程序身份验证可能并不一定与数据库身份验证一致。
此外,良好的安全性建议将访问用户名和密码与应用程序数据分开。在大型组织中,具有许多数据库用户的情况下,一个管理员应该是“安全官员”,处理身份验证和授权。没有其他用户可以修改授权,安全官员也没有权限访问应用程序数据。
要确保安全官员永远不会访问数据,这是一个快速的审核。稍微复杂一些的审核可以确保具有数据授权的人是真实的人,而不是安全官员的替代者。
散列密码是工作安全策略的一部分。"

2
当然,存储密码的哈希值而不是明文并不能使您的应用程序安全。但这是增加安全性的一种措施。正如您所提到的,如果您的服务器被攻破,这项措施无法拯救您,但它可以限制损失。
“链条的强度取决于最薄弱的环节。”
对密码进行哈希处理只能加强链条中的一个环节。因此,您需要采取更多措施。

2
除了之前提到的关于盐值的问题,还有一个问题可以通过使用盐值来解决:
如果你在所有地方都使用相同的盐值(或者根本没有使用盐值),那么仅仅通过查看数据库就可以得知用户foo和用户bar拥有相同的密码(即使你不知道密码是什么)。
然后,如果攻击者成功获取了foo的密码(例如使用社交工程学),那么bar的密码也就被知道了。
此外,如果盐值在所有地方都相同,攻击者可以构建一个专门针对这个特定盐值的字典,然后使用这个“加盐”字典进行暴力破解攻击。

1
这可能有点偏题,但我偶尔会注意到一些网站没有使用哈希(例如,当我点击忘记密码按钮时,他们会以明文形式向我发送我的密码,而不是让我选择另一个密码)。
我通常会选择取消订阅,因为我认为不能信任那些没有采取基本预防措施来哈希密码的人设计的网站。 这是盐的另一个原因 :)

是的,我同意。不幸的是,很多非常有价值的网站都是这样做的。我现在能想到的其中一个就是NameCheap注册机构。我几年前用过它,记得当时社区对它非常尊重。无论如何,以明文形式存储密码是极不专业的... - User

0
人们似乎对此过于自满!威胁不是某个拥有您系统或备份介质的shell访问权限的人,而是任何可以看到您网站未受保护(但动态)部分和一个被忽视的SQL注入威胁的脚本小子。一次查询,突然间他就可以登录为任何用户,甚至作为管理员。哈希密码使攻击者使用其密码登录为任何特定用户或更新记录以使用自己的密码的可能性大大降低。
“未受保护”包括任何可作为自注册用户访问的站点的任何部分。与银行站点相比,例如,您必须拥有现有的银行账户才能访问该站点的大部分内容。攻击者仍然可以开设银行账户以访问该站点,但当他试图破解系统时,派遣大个子持更大枪支的人追捕他会更容易些。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接