2015-07-01 94 views
6

如果我使用SHA256使用下面的方法,我得到这个作为我的输出散列字符串“密码”,在C#:SHA256哈希值不与哈希同意网站

e201065d0554652615c320c00a1d5bc8edca469d72c2790e24152d0c1e2b6189 

this website(SHA-256 produces a 256-bit (32-byte) hash value)告诉我已经是:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 

我显然有一个数据格式问题或类似的东西。任何想法为什么这个C#SHA256Managed方法返回不同的东西?我发送方法“密码”作为输入参数。

private static string CalculateSHA256Hash(string text) 
    { 
     UnicodeEncoding UE = new UnicodeEncoding(); 
     byte[] hashValue; 
     byte[] message = UE.GetBytes(text); 

     SHA256Managed hashString = new SHA256Managed(); 
     string hex = ""; 

     hashValue = hashString.ComputeHash(message); 
     foreach (byte x in hashValue) 
     { 
      hex += String.Format("{0:x2}", x); 
     } 
     return hex; 
    } 
+2

请不要使用SHA256哈希来存储密码(假设您是从头开始设计的)。请阅读关于存储密码的现代方法,您应该使用如下所示:https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx或一些其他的多迭代方法。 – willaien

+1

感谢您的链接。我们使用SHA256,后端对用户来说是独一无二的,而且我们不是双重哈希。看起来我们可以改进的是使用PBKDF2而不是SHA256。 – LampShade

回答

13

UnicodeEncoding是UTF-16,保证所有角色膨胀2〜4个字节来表示他们的Unicode代码点(也参阅MSDN上的备注部分)。

改为使用(静态)Encoding.UTF8,因此大多数字符将适合一个字节。这取决于您需要模拟哪种系统是否适用于所有字符串。

+0

就是这样,谢谢! – LampShade