我有一个从用户那里获取用户名和密码的登录窗口,我想知道处理密码的最佳方式。用户名只是一个普通的文本框,而密码是一个 PasswordBox。我将用户名直接传递给 ViewModel,但仅在使用代码隐藏单击登录按钮后才在 ViewModel 上设置 SecureString 属性。设置密码 SecureString 后,我想验证。
我现在正在编写登录框,但我还没有完全完成模型。我应该如何在 SQL Server 中存储密码?我是否只是将 SecureString 的内容写入 SQL,然后在用户尝试登录时尝试比较它?
最佳答案
你永远不应该存储密码——甚至不加密...
只需存储密码的散列值(只要以安全的方式实现散列,就可以防止密码被检索),为了验证,您以相同的方式对用户提供的密码进行散列并比较结果...
这样做有标准:
- http://en.wikipedia.org/wiki/PBKDF2
- http://www.ietf.org/rfc/rfc2898.txt
- http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx
上述标准使得使用彩虹表等变得困难,因为它使计算非常昂贵,因为它除了盐之外还使用了几轮......因此哈希例如慢 1000 倍(1000 轮)但是这正是您想要的 - 攻击者将需要进行相同的计算,因此需要 1000 倍的进动功率或时间才能通过蛮力实现目标...
您可以将结果直接存储为 VARBINARY,也可以在对字节进行 Base64 或 HEX 编码后存储为 VARCHAR...您需要将盐与它一起存储(只要每个密码都得到它就没有安全风险拥有独特的加密安全生成的随机盐)。
关于c# - 在 SQL Server 中存储、检索和验证密码 (SecureString),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310752/