更好的做法是散列密码而不是加密密码。基本上,散列是一种单向机制,而加密是可逆的。
为什么这很重要?好吧,如果恶意实体(可能是员工)发现了您如何加密数据(通过暴力破解或只是窃取密钥等),他们可以解密它 - 然后(错误)使用您的客户密码,大多数其中将在其他地方重复使用(其他网站、电子邮件、银行等)。像这样的违规行为会损害您网站/公司的声誉。
使用散列,您可以知道散列值是如何生成的,但您不会知道生成它的值(他们的密码)。当然,除非您在登录时没有保护服务器之间的通信(例如,使用 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 的回答,默认实现在生成哈希时除了用户密码之外还使用盐。
* 如果您的网站页面(至少登录)尚未通过安全连接提供服务,请也完成此操作。