你为啥要在数据库中存储纯文本或加密(非散列)密码?

Posted

技术标签:

【中文标题】你为啥要在数据库中存储纯文本或加密(非散列)密码?【英文标题】:Why would you ever want to store a plain-text or encrypted(not hashed) password in a database?你为什么要在数据库中存储纯文本或加密(非散列)密码? 【发布时间】:2011-04-13 01:34:30 【问题描述】:

我听说过很多将散列密码存储在数据库中的原因。但是,身份验证 API 中几乎总是有选项可以将密码存储为纯文本或加密。

您是否有任何理由希望将密码以纯文本或加密形式存储在数据库中?

注意要清楚,我知道存储非哈希密码几乎总是不好。(据我所知)我的问题是为什么大多数身份验证 API包括将密码存储为加密或纯文本的选项。

【问题讨论】:

客户要求极差是我能想到的唯一原因。 没有充分的理由。曾经。没有什么比在网站上提交忘记密码的表单并通过电子邮件发送密码更糟糕的了。呃。 Earlz - 澄清一下,您问为什么连接字符串允许纯文本密码或 IIS 身份验证?不是程序员为什么会这样做(如果他们知道得更好的话)? @Kobi 我不是在询问连接字符串。我的意思是从字面上将密码存储在数据库中,而不是连接字符串或任何特定于 IIS 的内容 我知道。实际上,编辑确实解释了它 - 你不是在问程序员为什么这样做。 【参考方案1】:

我遇到过几次这样的说法:

存储明文密码可让您检测用户何时将密码更改为接近旧密码的密码,即通过增加数字、添加“1”或其他一些低条件熵更新方法。

没有人应该将此论点作为存储明文密码的充分理由 - 出于多种原因,它会被误导。

【讨论】:

【参考方案2】:

1) 大多数挑战-响应认证协议都要求服务器知道明文密码。也有例外,但它们不受欢迎且难以实施。

2) 存储密码允许密码恢复。

【讨论】:

这是确切的零知识密码证明系统,并不流行。【参考方案3】:

其中一个原因可能是为另一个外部服务自动重用密码。

如果我将我的 gmail 帐户配置为从其他非 google 电子邮件提供商检索我的电子邮件,我必须向 google 提供我的密码,并且 google 必须明确此密码才能将我的邮件放入我的 gmail 帐户。

这显然与主要服务的密码不同,但无论如何它是“密码类型”。

【讨论】:

不错,但在这种情况下,提供者存储的是 a 密码,而不是它自己的密码。 OAuth 旨在支持此用例,并且正在慢慢普及。【参考方案4】:

我能想到的唯一“好”理由是付钱给你开发应用程序的客户或你的经理坚持这样做。我想不出任何技术原因。

【讨论】:

【参考方案5】:

我能想到的唯一真正原因是当数据库属于一个本身针对实际应用程序的系统时。就像当您有程序为您登录某些东西时(电子邮件客户端、即时消息客户端等)。所有这些都必须以可恢复的方式存储密码才能访问,因为目标应用程序不会通过工具在真实用户用户之间做出决定。正是在这一点上,OAuth 和类似的东西被用来保存用户的密码。

【讨论】:

【参考方案6】:

当然,您可以将所有密码作为纯文本存储在您的存储(例如数据库)中。但不建议这样做。如果有人设法破解您的服务器并从数据库中获取您的数据,他也会获得每个密码。在这种情况下,即使只是存储使用 md5 等常用方法散列的密码也不能完全保存。因为有彩虹表(搜索谷歌这个),查找密码。

所以我建议存储加盐密码。我不知道您为什么将密码存储为纯文本。我不会这样做:)

【讨论】:

【参考方案7】:

我能想到的一个原因是允许密码恢复选项。无法恢复系统不知道的密码。

当然,另一种方法是系统只需将密码重置为新密码并将新密码发送给您。

【讨论】:

重置密码应该是更省钱的选择。 同意。不过,我能想到的唯一原因是不对密码进行哈希处理。 有时在某些网站上恢复旧密码就可以了 呃,你好 - 密码盐?您可以在对密码进行哈希处理时生成一个特殊的盐,当忘记密码时可以使用相同的盐来解密它。这就是 (gulp) ASP.NET Membership 的工作方式。 @RPM 对我来说听起来像是加密......或者至少不是单向哈希【参考方案8】:

也许您是一名黑客,想要使用或出售它们?

【讨论】:

【参考方案9】:

即使您非常确定数据库的安全性,所有管理员仍然可以访问您的用户密码。

了解密码加密不会保护您的网站,它只能保护您的密码,这一点非常重要。

如果您的网站没有足够的保护,密码加密将无法使其免受破解。如果您的系统被破解,黑客可能对其造成无法弥补的损害,并获得对机密信息的访问权限,包括密码数据库。但是,如果您将这些信息加密存储,黑客几乎无法利用它。破解加密密码需要大量时间和处理能力,即使在当今的计算机上也是如此。

【讨论】:

那种回答与问题相反;)

以上是关于你为啥要在数据库中存储纯文本或加密(非散列)密码?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不应该在数据库中以纯文本形式存储密码? [复制]

客户端密码加密[重复]

散列或加密或两者都存储用户的密码? C# Winforms [关闭]

Castle ActiveRecord / NHibernate - 密码加密或散列

在钥匙串中存储用于加密密码的密钥的最佳位置在哪里

客户端密码加密[重复]