我的公司使用以下算法在将密码存储到数据库之前对其进行哈希处理:
public static string Hash(string value)
{
byte[] valueBytes = new byte[value.Length * 2];
Encoder encoder = Encoding.Unicode.GetEncoder();
encoder.GetBytes(value.ToCharArray(), 0, value.Length, valueBytes, 0, true);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(valueBytes);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
stringBuilder.Append(hashBytes[i].ToString("x2"));
}
return stringBuilder.ToString();
}
对我而言,这听起来像是一个微不足道的md5哈希,但是当我尝试匹配密码(123456)时,算法给了我ce0bfd15059b68d67688884d7a3d3e8c,当我使用标准的md5哈希时,它给了我e10adc3949ba59abbe56e057f20f883e。
正在构建该站点的iOS版本,并且用户需要登录,密码将在发送之前进行哈希处理。我告诉iOS团队使用标准的md5哈希,但当然它还没有成功。
我无法取消密码并使用标准md5(当然)再次哈希,而且我不知道究竟是什么告诉iOS团队,以获得相同的哈希值。< / p>
任何帮助?
答案 0 :(得分:7)
您需要在两端使用相同的编码(可能是UTF8)。
如果用
替换代码byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes("123456"));
,您将获得e10adc3949ba59abbe56e057f20f883e
。
答案 1 :(得分:2)
您需要使用UTF8而不是Unicode。以下代码与PHP md5()函数完全相同:
public static string md5(string value)
{
byte[] encoded = ASCIIEncoding.UTF8.GetBytes(value);
MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
byte[] hashCode = md5Provider.ComputeHash(encoded);
string ret = "";
foreach (byte a in hashCode)
ret += String.Format("{0:x2}", a);
return ret;
}