为什么要加密用户密码?

18

可能是重复问题:
为什么不存储原始密码?

如果密码是数据中最不重要的部分,为什么要在数据库中存储加密后的用户密码呢?它似乎不会影响外部攻击;为每个帐户设置每日有限次数的登录尝试将是有效的。它似乎不会影响内部攻击;如果有人可以访问密码,则他们也可以访问数据库中其他更有价值的数据。

我错过了什么吗?整个数据库都应该使用用户密码作为密码加密的密钥进行加密才能生效吗?

结合他下面的帖子和他的问题:

好的,我的问题表述得很糟糕。让我重新说一下。

如果有人闯入这个系统,他们拥有用户的密码事实上是我最不关心的部分之一。我会加密密码,但在我看来,数据库中的其他数据更有价值。假设如果内部攻击者拥有那些数据,他们并不关心密码。

如果数据库中没有其他内容被加密,而数据库中的其他所有内容都是攻击者真正想要的,那么加密密码实际上解决了什么问题?


2
好的,怎么回事。鉴于您的用户名和您获得了大量点赞,而这个问题已经被讨论了很多次,您显然是一个袜子账户。难道今天是愚人节吗? - delete me
我正在做笔记,准备在几周后重新发布,以获取大量的赞...为什么要辛苦地赚取声望,而你可以这样做呢? - Palantir
这个问题就像在问:“为什么汽车需要刹车,反正你总有一天会死……”,并不是因为其他数据可能会被攻击,就意味着你不必保护这部分数据。这就好比说,如果一只狗攻击了某个人,你就不会帮助他,因为同时可能还有其他狗攻击其他人一样。 - Dominique
@Palantir - 他的声望已经达到了31。我认为这并不是世界末日。 - Jon B
标题有误导性,所以我将其更改为反映那里实际提出的问题和答案内容 - 从“存储原始密码是否合法?”到“存储原始密码是否合法?为什么应该加密它们?” - Palantir
显示剩余5条评论
10个回答

30
因为对密码进行哈希处理可以保护它免受组织内部的攻击。这样,有权访问数据库的人就不会知道用户的密码。
人们习惯于反复使用同一个密码,如果您的数据库意外被攻破,您的组织并不会是使用户在其他组织中的其他账户受到威胁的原因。现在,人们是否应该这样做并不重要,但他们确实这样做了,而哈希密码比向客户解释为什么内部人员获取密码并对与您无关的其他系统中的多个账户造成损失要容易得多。
如果您认为这个理由过于夸张,您可能想知道 Jeff Atwood, Stack Overflow 的创建者曾经发生过这种情况。他在博客文章《我刚刚作为你登录了:事情是如何发生的》中描述了整个 Stack Overflow 是如何被攻破的。
编辑:
为了进一步回答您的问题,您的其他敏感数据也应该加密。很多网络攻击都是内部工作,我不得不说,您必须对谁能看到哪些信息产生偏执狂。任何您认为敏感的数据,除非经过特别授权才能查看这些数据,否则应在数据库中进行加密。您是对的,在某些情况下,与其他可以被盗窃的数据相比,密码可能并不是您最担心的问题。关键在于“对您而言”这一点。密码对其他人来说很重要,应该与系统中的其他敏感数据一样得到保护。

8
如果您的系统存在SQL注入漏洞,有人窃取了您的数据库,并使用您存储的用户名、电子邮件地址和明文密码直接登录用户的电子邮件账户、银行账户等,那么您真的想承担这种责任吗?反过来,您真的想承担能够看到用户明文密码的责任吗?请注意保护好您的数据安全。

7

原因:

  1. 如果有人(内部或外部)窃取了这些密码并公开发布,你就完蛋了,可以立即关闭你的业务。
  2. 一些人在许多服务中使用相同的密码。如果某个“攻击者”能够访问电子邮件地址和密码,最简单的方法是尝试该密码是否也适用于该电子邮件帐户。

您不希望发生这种情况。

如果您可以访问其他人的电子邮件帐户,则可以请求从受害者的各种服务中发送遗忘密码等。


3
对于内部攻击,如果我能记住5个用户名/密码组合,然后去公共终端访问这些账户,比起在工作中使用工作机器直接编辑数据库或提取大量数据,更不容易被人发现攻击。正如其他人指出的那样,由于我们所有人都有100多个或更多的在线场所,所有这些场所都需要不同的密码...很多人只是一遍又一遍地使用相同的密码。如果Williams Widget公司丢失了您的姓名、登录名和密码,而您的银行具有相同的登录名和密码,并且追溯回来,Widget公司就是丢失您密码的人...这里涉及到责任的混淆。

1

因为你不想陷入发送未加密密码的设计陷阱,或者认为你可以这样做,因为你没有任何未加密的内容可以进行比较。


0

好的,我用了一个不好的方式来提问。让我重新表述一下。

如果有人闯入这个系统,他们拥有用户密码的事实是我最不关心的之一。我会加密密码,但在我看来,数据库中的其他数据更有价值。假设如果内部攻击者拥有那些数据,他们对密码是不在意的。

如果数据库中没有其他内容被加密,而数据库中的其他所有内容都是攻击者真正想要的,那么加密密码是否真正解决了任何问题?


1
有了加密密码,黑客只能窃取此系统中的数据,但如果没有加密密码,他们可以重复使用密码并访问其他众多系统的数据。这就是区别所在。 - sharptooth
要在问题中添加更多信息,请使用评论系统或编辑您的问题。如果不是真正的答案,请不要发布回答。编辑:我刚注意到您正在使用不同的帐户发布,即使那是你。最好使用您用于发布问题的帐户登录,以便您可以编辑您的问题... - Jeff
由于某种原因,我被注销了之前的帐户,再也进不去了。即使是我自己也被我的匿名性混淆了。这次我已经记下了OpenID哈希值。我正在处理的系统存储了可能被用于身份盗窃的信息。因此,我们更担心密码的安全性胜过内容的安全性。 - Anonymous Coward
不仅未加密的密码可以被重复使用来访问其他系统上的数据,如果用户使用相同的密码,则可以用于访问完全相同的系统。而且,虽然第一次“获取用户密码攻击”可能看起来像是一次攻击并被发现,但使用用户密码进行下一次访问将看起来像是“正常”访问。如果“真正”的攻击没有被注意到,他们可以更微妙地和“隐蔽地”造成伤害。 - ShinTakezou

0

保密性、完整性、真实性、隐私... 记得你的第一门安全课,尝试计算有多少个这些被你的问题绕过了。

四个?嗯,这取决于更具体的问题视角,但差不多 :)


0
此外,您不需要知道用户密码。在客户端创建密码哈希是一个好主意。根据您所在的位置,存储个人数据和密码可能会有法律要求。

-1
通常,密码的哈希值存储在数据库中而不是原始文本。这是为了确保用户凭据在系统遭受外部攻击时具有额外的安全性。 比较哈希值用于验证用户凭据。
您可能想阅读更多关于为什么采用这种方法的理论以更好地理解它。Wiki可以作为起点。

-1

在存储密码哈希值时,不要忘记使用一些盐来混淆,这样反向查找哈希值就不会暴露密码。是的,在哈希之前将其变成一个长字符串。
我不理解问题的最后一段。抱歉。


这个问题并不是在问密码应该如何加密,而是在问为什么需要加密密码。 - Jeff

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