[英]Sha512 not returning equal in c# hash validation
64個字節是相同的,但==返回false。 我猜測編碼可能有問題,但我無法弄清楚我做錯了什么。 有什么想法解決這個問題?
public static byte[] hashSHA512(string unhashedValue)
{
SHA512 shaM = new SHA512Managed();
byte[] hash = shaM.ComputeHash(Encoding.UTF8.GetBytes(unhashedValue));
return hash;
}
public static bool Validate(string enteredValue, byte[] hashedValue)
{
byte[] hash = hashSHA512 (enteredValue);
return (hash == hashedValue);
}
我用一個簡單的值來測試它,因為它們都調用相同的哈希方法,所以除了編碼中的某些東西之外我沒有看到它如何失敗。 我只是使用內置的System.Security.Cryptography。
在C#中,如果它們相同,則兩個數組僅等於另一個數組,即它們是完全相同的數組。 正常的相等比較不會檢查這些數組的內容是否相等:
byte[] x = new byte[] { 1, 2, 3 };
byte[] y = new byte[] { 1, 2, 3 };
Console.WriteLine(x == y); // false
您可以使用Enumerable.SequenceEqual
來檢查內容是否相等:
Console.WriteLine(x.SequenceEqual(y)); // true
由於SHA512哈希值通常以十六進制顯示,因此實際返回十六進制字符串而不是字節數組可能是有意義的。 您可以使用多種方法之一將字節數組轉換為十六進制字符串 。 然后,您可以對字符串執行相等檢查 - 這將按預期工作。
沒有,沒有什么不對的編碼- 有一個沒有編碼byte[]
他們只是字節。 對於執行參考比較的數組,只需要==
。
您可以使用SequenceEqual
來比較數組:
public static bool Validate(string enteredValue, byte[] hashedValue)
{
// TODO: Rename `hashSHA512 to follow .NET naming conventions
byte[] hash = hashSHA512 (enteredValue);
return hash.SequenceEqual(hashedValue);
}
請注意,您需要using System.Linq;
在您的using指令中引入LINQ。
備擇方案:
SequenceEqual
更有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.