如何加密所有现有的客户密码

信息安全 加密 密码
2021-08-17 08:38:26

我在一家网上商店工作,自从我在这里工作以来,我们以明文形式存储了客户密码。我以数据输入员的身份加入公司,当我发现我们这样做时,我向管理层提出了建议,但他们似乎并不感兴趣或不关心。几年后,我负责该网站,现在我想加密我们所有客户的密码。

在 .NET 电子商务网站上加密所有客户密码的最快和最简单的方法是什么?有我们可以使用的 .NET 库吗?

编辑

我目前对加密或密码安全几乎一无所知。我被指责在发布这个问题之前没有做任何研究。我今天实际上已经开始研究这个话题,这个问题是我研究的一部分。如果人们因我缺乏知识而受到冒犯,我很抱歉,但这不是因为懒惰。我对这个领域一无所知,我现在正试图找出答案。这个问题是其中的一部分。我真的很感激你能给我的任何帮助。

3个回答

密码应该加盐和散列,而不是加密。您应该使用慢散列来减轻预计算攻击。这里有 .NET 代码:https ://crackstation.net/hashing-security.htm

编辑添加:如果您的帐户数量很少,您可以在哈希代码运行时简单地阻止登录尝试。但是,它的设计速度很慢,因此您可能必须在对密码进行哈希处理时允许登录。那没问题。先对比明文密码;如果没有匹配,则散列提供的密码并再次比较。

不要忘记您必须存储盐和哈希。如果您不更改数据库架构,则可以将它们连接起来并存储在现有的密码字段中,假设它是 varchar。否则,您可能必须在哈希计算完成并提交后将列添加到数据库并清除明文列。

检查您的密码恢复机制。完成此操作后,您将无法告诉用户他们的密码是什么。你需要一些其他的恢复机制。

与问题无关,但如果您不使用 TLS 进行登录,则需要。

.Net 提供开箱即用的密码散列的最佳选择是 PBKDF2,正如 CodesInChaos 评论的那样,它实现为System.Security.Cryptography.Rfc2898DeriveBytes.

您必须做出的真​​正选择是这是否是您的帐户/密码管理代码需要的唯一更改。如果是,您可以直接实现它,替换您当前的密码管理,并完成它。

但是,如果您管理凭据的方式存在其他问题(以及使用纯文本密码存储,我怀疑这很可能),那么完全抽象帐户管理并重构要使用的应用程序可能是一个更好的主意ASP.NET Identity反而。默认情况下,这将为您提供基于 PBKDF2 的密码散列,并为您提供现成的解决方案,例如密码重置、防止密码暴力破解的帐户锁定机制以及许多其他安全优势。

更好的做法是散列密码而不是加密密码。基本上,散列是一种单向机制,而加密是可逆的。

为什么这很重要?好吧,如果恶意实体(可能是员工)发现了您如何加密数据(通过暴力破解或只是窃取密钥等),他们可以解密它 - 然后(错误)使用您的客户密码,大多数其中将在其他地方重复使用(其他网站、电子邮件、银行等)。像这样的违规行为会损害您网站/公司的声誉。

使用散列,您可以知道散列值是如何生成的,但您不会知道生成它的值(他们的密码)。当然,除非您在登录时没有保护服务器之间的通信(例如,使用 HTTP 而不是 HTTPS 网页)。*

作为此过程的一部分,密码也应该加盐:

在密码学中,盐是随机数据,用作散列密码或密码短语的单向函数的附加输入。 [1] 盐的主要功能是防御字典攻击而不是密码哈希列表

来源:http ://en.wikipedia.org/wiki/Salt_%28cryptography%29

同样,基本上,这将是攻击者获取已知/常见(密码)单词列表的地方,例如“letmein”并对其进行哈希处理。知道他们会知道与密码“letmein”对应的哈希,并且可以快速查找以查看您的任何用户是否具有相同的密码哈希。显然,这很容易通过可能/常见(密码)单词的“字典”实现自动化。加盐有助于防止这种情况。

至于如何在 .NET 中实现它,请参阅 Stack Overflow 中的这个问题(和答案):

https://stackoverflow.com/questions/19957176/asp-net-identity-password-hashing

我对.NET 开发不是很熟悉,但是根据@jd4u 的回答,默认实现在生成哈希时除了用户密码之外还使用盐。

* 如果您的网站页面(至少登录)尚未通过安全连接提供服务,请也完成此操作。