在Windows Phone中生成SHA1哈希值会输出不同的哈希值

4

我目前正在使用Windows Phone和Silverlight中内置的方法来创建字符串的SHA1哈希值。以下是代码:

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+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= 正确的输出:aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d 那么我的代码哪里出了问题呢?
2个回答

10

在你的示例中,你正在对字节数组进行Base64编码。你需要得到正确输出的十六进制格式,可以使用以下方式实现:

return BitConverter.ToString(s.Hash).Replace("-", "");

改为:

return Convert.ToBase64String(s.Hash);

非常感谢,此外,我不得不调用 ToLowerInvariant() 来匹配 UNIX,因为几乎总是小写的哈希。 - Francesc

2

I've compared those two solutions:

Solution 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):
// 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);
}

好的,方案A的速度快了40倍。因此只使用方案A。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接