我正在使用this文章中提供的ASP.NET密码哈希代码示例。它使用32字节的RNGCryptoServiceProvider实例为Salt和SHA256Managed实例进行散列。
TIA
答案 0 :(得分:3)
如图所示,实施没有任何问题。而这里真正的难题不一定是正确地管理账户,因此在某个地方没有漏洞。在任何情况下,您可能在大多数情况下都使用内置会员提供商 - 通常没有充分的理由推销自己的会员。
.NET加密内容处理字节,大多数其他系统吐出这些字节的十六进制表示 - 请查看PHP示例。 BytesToHex方法的工作是进行此转换。在ToString方法中使用“x2”告诉字节使用什么格式 - 在这种情况下是十六进制。有关更深入的解释,请参阅the documentation。
先看#1。就个人而言,如果我自己滚动,我会使用VARBINARY或BINARY而不进行文本转换 - 这是一个浪费的步骤,因为.NET想要将它视为一个byte []无论如何。如果你想要文本,并且你确定你从未改变你的编码或散列方法,那么我猜CHAR(LENGTH_OF_HASH)将是最有效的存储选项。
答案 1 :(得分:1)
您是否发现此处描述的方法存在任何问题,无法在生产环境中使用。
好的,首先让我们谈谈哈希。首先你应该知道当人们使用通用密码时,简单的哈希(Salt +密码)可以很容易地破解。所以单独使用salted哈希通常不会花费你太多时间来破解你用户密码的大部分。
场景:假设您需要24小时才能发现违规情况。在这个短暂的窗口中,许多帐户已经被破坏了。您重置所有用户帐户密码,用户现在安全吗?因此,您向所有用户发送电子邮件,通知他们违规行为,并建议他们重置密码。麻烦的是,那些愚蠢的用户已经在互联网上使用了一段时间的密码,他们的银行,电子邮件等的相同密码。因此,即使你停止他们使用被盗密码访问你的网站,用户可能还有其他帐户,他们必须重启。因此,假设他们需要另一天接收电子邮件并重置密码。你如何为用户购买更多时间?
答案是PBKDF2。这为哈希增加了大量的复杂性,因此每个密码的每次测试都比简单的盐渍哈希长几千倍。要在.NET中实现这一点,可以使用Rfc2898DeriveBytes类。请阅读以下工作示例:“Another example of how to store a salted password hash”。
我不明白BytesToHex方法的需要是什么,以及为什么附加“x2”。有什么想法吗?
没理由我能想到。
如果我想在SQL Server数据库中存储此散列密码(由HashPassword方法重新发送),则应使用哪种数据类型。 CHAR(128),VARCHAR(128)或其他具有每种方法的优点和缺点的东西。
Acutally raw bytes效果最好,如果你想将它存储为文本,Base64也值得考虑。