【发布时间】:2011-01-01 13:56:23
【问题描述】:
大家好,
我从Preferred Method of Storing Passwords In Database 了解到存储密码的哈希值是安全的...
如何使用 c# 对密码值加盐和散列?
如何比较存储在数据库中的值和用户给出的值?
【问题讨论】:
-
这里有一个库:encrypto.codeplex.com
大家好,
我从Preferred Method of Storing Passwords In Database 了解到存储密码的哈希值是安全的...
如何使用 c# 对密码值加盐和散列?
如何比较存储在数据库中的值和用户给出的值?
【问题讨论】:
最流行的方法是使用散列算法。 blog post here 有一个很好的关于如何使用 MD5 算法对字符串进行哈希处理的例子,但在 System.Cryptography 命名空间中还有很多其他示例。
至于 #2,关于其工作原理的一般分步指南如下:
注册时:
登录/用户和密码检查:
都是比较啰嗦的,但是很安全。
还有另一个关于散列和盐渍here的非常深入的指南。
【讨论】:
简单哈希:
public string GetSHA256Hash(string s)
{
if (string.IsNullOrEmpty(s))
{
throw new ArgumentException("An empty string value cannot be hashed.");
}
Byte[] data = System.Text.Encoding.UTF8.GetBytes(s);
Byte[] hash = new SHA256CryptoServiceProvider().ComputeHash(data);
return Convert.ToBase64String(hash);
}
【讨论】:
严格来说,您应该salt the password 然后对其进行哈希处理,以避免字典攻击。您可以使用System.Cryptography 命名空间中的HashAlgorithm 抽象类的任何实现来计算散列 - 当前的最佳选择可能是SHA-2 algorithms 之一。
您存储哈希而不是密码,并比较哈希值以验证用户。
【讨论】:
正如其他人所说,有很多选择。
这是来自Microsoft 的一些示例代码(使用 MD5 而非 SHA),可能有助于您入门
using System;
using System.Security.Cryptography;
using System.Text;
string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
sSourceData = "MySourceData";
//Create a byte array from source data.
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
//Compute hash based on source data.
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
【讨论】:
对于散列,您在 System.Security.Cryptography 中有几种受支持的算法,对于您的用例,您可能希望选择基于 SHA 的散列或类似的东西。
关于比较:您不会比较 DB 值和用户给您的值。您首先使用用于将密码存储在数据库中的相同加密/散列函数,这次是用户输入。如果结果等于数据库中的哈希值,则密码(可能)正确。
目的是没有人可以访问数据库以明文形式检索密码,甚至您的程序也不需要知道它(只有接受用户输入的部分会在短时间内拥有它)。
链接(甚至可能重复):
【讨论】: