加密数据库密码字段的必要性如何

时间:2012-09-21 12:27:23

标签: database-design encryption passwords security

我听说为了安全问题,建议将密码字段保存在数据库中。

如果只是我的网站,我可以访问数据库。我根据我们的网站政策查看其他密码没有问题。

这是否也适用于我的网站?或者说有其他安全原因。

4 个答案:

答案 0 :(得分:5)

guidance是没有人 - 甚至用户自己 - 应该能够看到密码,并且它们不应该以允许检索它们的方式存储在数据库中。这是因为有很多方法可以丢失这些数据 - 管理员可以打印出一份报告,并将其留在桌面上;攻击者可能能够使用SQL注入来运行数据库查询;有人可能会闯入你的建筑物并窃取备份磁带。

许多客户在多个网站上使用相同的密码 - 因此,如果您的网站是最薄弱的链接,如果他们重新使用了密码,您可能会将其暴露给其他网站上的风险。

建议使用称为“散列”的加密技术,该技术获取明文密码并将其转换为无意义的字符串;没有办法扭转哈希,这意味着即使我偷了哈希密码,我也无法弄清楚原始的纯文本是什么。

将相同的字符串散列两次会产生相同的哈希值 - 因此当有人登录时,您将对其明文密码进行哈希处理,并将其与数据库中的哈希值进行比较。

OWASP链接提供了有关此主题的更多信息,包括“salting”哈希。

答案 1 :(得分:3)

您不应将任何密码存储在数据库中,加密或以其他方式存储。

相反,存储哈希。当用户尝试登录时,计算用户输入的密码的哈希值,并将其与存储在数据库中的哈希值进行比较。

不幸的是,普通的哈希很容易受到所谓的“彩虹”攻击。如果攻击者抓住你的桌子,他可以预先计算整个英文 1 字典的哈希值,甚至可以预先计算一定长度的所有字符组合的哈希值,从而产生所谓的 “彩虹表”,然后快速将其与数据库表进行比较,以获得匹配的哈希值。您的一些用户必然会使用在此类攻击下可能失败的弱密码。

为防止彩虹攻击,请勿对密码本身进行哈希处理。而是哈希密码+盐。 salt 是一个随机的,特定于用户的字符串,不需要比散列本身 2 更隐秘。这引入了哈希值的变化,因此攻击者无法再为所有用户使用相同的彩虹表。攻击者实际上必须为每个用户(以及他/她的盐)生成一个新的彩虹表,希望这会让它变得非常昂贵。

缺乏腌制导致了今年Linke的大规模安全漏洞。引自this New York Times article

“安全专家说,Salting密码是Security 101-- LinkedIn,eHarmony和Lastfm.com都未能采取的基本步骤。”

当然,这应该只是多层防御的最后一层,该层旨在让攻击者在阅读完数据库后更加艰难。你应该尝试一切力量来防止这种情况发生,包括防止SQL注入,严格分层,正确的数据库安全,防火墙,定期修补等......


1 或其他一些感兴趣的人类语言。

2 但理想情况下,应该在明确定义的Web服务API之后单独存储。

答案 2 :(得分:1)

您应该始终散列密码。用户没有理由信任您,并且您无法知道您的数据库是否已被泄露。有了这样的问题,我只能假设您对网站安全有基本的了解。我们生活在像索尼,美国政府,银行等公司每周都在攻击数据库的日子里。如果您认为自己可以免除此项,那么您应该在注册时将其发布,以便让您的用户知道您不关心他们的隐私。

没有任何理由您应该能够读取您的一个用户密码。

要实现密码哈希,您应该在注册期间获取密码并在存储到数据库之前对其进行哈希处理。然后,当用户登录时,您应该对密码进行哈希处理,然后将哈希值与数据库中的哈希值进行比较。如果他们比较,那么它的密码相同。

另外,请记住加密密码。这意味着,如果您有一个“test”密码并对其进行哈希处理,如果另一个站点上的用户的密码为“test”,则两个哈希值相同,并且可以根据以前的哈希值计算出密码。 Salting就像在散列之前向密码添加额外数据一样,因此数据库中的“test”实际上可能是“test123”,每当有人输入密码时,PHP会自动将“123”附加到其中。这种方式在将您的站点的哈希值与另一个站点进行比较时,相同密码的哈希值并不相同。

答案 3 :(得分:1)

你的意思是你认为你是唯一可以访问它的人。安全性应该分层实施,所以如果一个失败,那么它背后总会有另一个。

密码应始终进行哈希处理和腌制。