C# 对密码进行哈希运算,得到不同的结果
我正在接管一个以前的开发人员编写的系统。系统由管理员批准用户帐户,当管理员批准用户帐户时,系统将使用以下方法散列密码并将其保存到数据库中。它将未加密的密码发送给用户。当用户登录时,系统使用完全相同的方法对用户输入的内容进行散列,并将其与数据库值进行比较。我们已经遇到过几次数据库条目与用户条目不匹配的情况,这是他们应该做的。因此,该方法似乎并不总是对相同的值进行散列。有人知道这种散列方法是否可靠,以及如何使其可靠吗?谢谢C# 对密码进行哈希运算,得到不同的结果,c#,.net,hash,hashalgorithm,C#,.net,Hash,Hashalgorithm,我正在接管一个以前的开发人员编写的系统。系统由管理员批准用户帐户,当管理员批准用户帐户时,系统将使用以下方法散列密码并将其保存到数据库中。它将未加密的密码发送给用户。当用户登录时,系统使用完全相同的方法对用户输入的内容进行散列,并将其与数据库值进行比较。我们已经遇到过几次数据库条目与用户条目不匹配的情况,这是他们应该做的。因此,该方法似乎并不总是对相同的值进行散列。有人知道这种散列方法是否可靠,以及如何使其可靠吗?谢谢 private string HashPassword(string
private string HashPassword(string password)
{
string hashedPassword = string.Empty;
// Convert plain text into a byte array.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(password);
// Allocate array, which will hold plain text and salt.
byte[] plainTextWithSaltBytes =
new byte[plainTextBytes.Length + SALT.Length];
// Copy plain text bytes into resulting array.
for(int i = 0; i < plainTextBytes.Length; i++)
plainTextWithSaltBytes[i] = plainTextBytes[i];
// Append salt bytes to the resulting array.
for(int i = 0; i < SALT.Length; i++)
plainTextWithSaltBytes[plainTextBytes.Length + i] = SALT[i];
// Because we support multiple hashing algorithms, we must define
// hash object as a common (abstract) base class. We will specify the
// actual hashing algorithm class later during object creation.
HashAlgorithm hash = new SHA256Managed();
// Compute hash value of our plain text with appended salt.
byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
// Create array which will hold hash and original salt bytes.
byte[] hashWithSaltBytes = new byte[hashBytes.Length +
SALT.Length];
// Copy hash bytes into resulting array.
for(int i = 0; i < hashBytes.Length; i++)
hashWithSaltBytes[i] = hashBytes[i];
// Append salt bytes to the result.
for(int i = 0; i < SALT.Length; i++)
hashWithSaltBytes[hashBytes.Length + i] = SALT[i];
// Convert result into a base64-encoded string.
hashedPassword = Convert.ToBase64String(hashWithSaltBytes);
return hashedPassword;
}
私有字符串HashPassword(字符串密码)
{
string hashedPassword=string.Empty;
//将纯文本转换为字节数组。
字节[]明文字节=Encoding.UTF8.GetBytes(密码);
//分配数组,该数组将包含纯文本和salt。
字节[]带altbytes的明文=
新字节[plainTextBytes.Length+SALT.Length];
//将纯文本字节复制到结果数组中。
for(int i=0;i
如果过程不使用任何随机决策(即,它是完全确定的),并且所用算法的实现是相同的(它们应该是相同的-SHA256应该在任何地方都完全相同,Base64字符串也是相同的),那么算法本身不太可能“散列值不是相同的”
如果您无法重现错误(意思是:查找某个值,该值在服务器上哈希时总是生成一个哈希,在客户端哈希时总是生成另一个哈希),您应该确保正确传输和接收值。可能客户端未加密的密码被扰乱了?可能服务器从客户端接收到损坏的数据?可能服务器数据库本身的数据发生了某种变化?
确保每个事务都经过验证,即用户无法收到损坏的密码。此函数使用salt进行哈希运算。这是一种技术,可确保它为同一密码生成不同的哈希,并使表查找更加困难
只有当您具有相同的salt值时,哈希才是相同的
有关此技术的详细信息,请参阅维基百科
引述:
用盐来减缓攻击。
盐是调味的一种方法
在对它们进行散列之前,先
攻击者的预计算字典
没用,这是怎么做的。
无论何时将条目添加到
数据库中,您计算一个随机变量
用作盐的数字字符串。
当您要计算
爱丽丝的密码,你查一下盐
Alice帐户的值,请在前加上
输入密码,并将其散列
结果数据库看起来
像这样:
<users>
<user name='Alice' salt='Tu72*&' password='6DB80AE7...'/>
<user name='Bob' salt='N5sb#X' password='096B1085...'/>
<user name='Fred' salt='q-V3bi' password='9118812E...'/>
</users>
请注意,现在没有办法判断
鲍勃和弗雷德用的是同一个
密码。注意盐本身
这不是秘密