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」という文字列のハッシュを生成しようとしました。

シルバーライト出力:LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=

正しい出力:aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

コードで何が間違っていますか?

4

2 に答える 2

10

あなたの例では、バイト配列をBase64でエンコードしています。正しい出力は 16 進数形式であり、次を使用して実現できます。

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

それ以外の:

return Convert.ToBase64String(s.Hash);
于 2012-05-18T16:25:19.113 に答える
2

これら2つのソリューションを比較しました:

ソリューション 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 for Developer に基づく):

// 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のみを使用してください:)

于 2014-07-21T18:07:00.757 に答える