簡體   English   中英

Sha512在c#哈希驗證中不返回相等

[英]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。

備擇方案:

  • 將兩者轉換為base64(文本)表示並進行比較
  • 編寫自己的數組相等檢查器,這可能比SequenceEqual更有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM