C# 在Windows Phone中生成SHA1哈希将输出不同的哈希
我目前正在使用Windows Phone和Silverlight中的内置方法创建字符串的SHA1哈希。代码如下:C# 在Windows Phone中生成SHA1哈希将输出不同的哈希,c#,windows-phone-7.1,sha1,C#,Windows Phone 7.1,Sha1,我目前正在使用Windows Phone和Silverlight中的内置方法创建字符串的SHA1哈希。代码如下: private static string CalculateSHA1(string text) { SHA1Managed s = new SHA1Managed(); UTF8Encoding enc = new UTF8Encoding(); s.ComputeHash(enc.GetBytes(text.ToCharAr
private static string CalculateSHA1(string text)
{
SHA1Managed s = new SHA1Managed();
UTF8Encoding enc = new UTF8Encoding();
s.ComputeHash(enc.GetBytes(text.ToCharArray()));
System.Diagnostics.Debug.WriteLine("Original Text {0}, Access {1}", text, Convert.ToBase64String(s.Hash));
return Convert.ToBase64String(s.Hash);
}
例如,我尝试为这个字符串生成一个哈希:“hello”
Silverlight输出:LPJNul+wow4m6dsqxbinhswhlwfp0jecwqzypolmcq=
正确输出:aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
我在代码中做错了什么?在您的示例中,您正在对字节数组进行Base64编码。正确的输出为十六进制格式,您可以通过以下方式实现:
return BitConverter.ToString(s.Hash).Replace("-", "");
而不是:
return Convert.ToBase64String(s.Hash);
我比较了这两种解决方案: 解决方案A:
// compatible Windows Phone 7.1, 8.0 and 8.1
public static string CalculateSHA1(string str)
{
var bytes = Encoding.UTF8.GetBytes(str);
byte[] sha1Bytes;
using (var algorithm = new SHA1Managed())
sha1Bytes = algorithm.ComputeHash(bytes);
return BitConverter.ToString(sha1Bytes).Replace("-", "").ToLowerInvariant();
}
解决方案B(基于开发人员的D):
解决方案A的速度快了40倍。所以只使用解决方案A.:)非常感谢,而且,我不得不调用
ToLowerInvariant()
来匹配UNIX,因为它的哈希值几乎总是小写的。
// compatible Windows Phone 8.1 only
public static string CalculateSHA1New(string str)
{
var vector = CryptographicBuffer.ConvertStringToBinary(str, BinaryStringEncoding.Utf8);
var digest = HashAlgorithmProvider.OpenAlgorithm("SHA1").HashData(vector);
return CryptographicBuffer.EncodeToHexString(digest);
}