Sha-256

每種語言的 SHA256 實現是否為相同的值提供不同的結果

  • July 31, 2019

由於缺乏理解,這可能是一個非常幼稚的問題,但我正在觀看 Andreas M. Antonopoulos 關於區塊鏈、比特幣和共識算法的影片,他要求提供字元串的 SHA-256 輸出Hello!。一個人告訴他前幾個字元,作為 Windows/C# 開發人員,我決定只是為了好玩來檢查實現這個非常簡單的 C# 方法的答案:

   public byte[] Generate(string valueToHash)
   {
       byte[] hashValue;
       byte[] stringToBytes = Encoding.ASCII.GetBytes(valueToHash);

       using (SHA256 hashGenerator = SHA256.Create())
       {
           hashValue = hashGenerator.ComputeHash(stringToBytes);
       }

       return hashValue;
   }

然後使用此方法輸出結果:

   public static void PrintByteArray(byte[] array)
   {
       for (int i = 0; i < array.Length; i++)
       {
           Console.Write($"{array[i]:X2}");
           if ((i % 4) == 3) Console.Write(" ");
       }
       Console.WriteLine();
   }

但我得到了不同的結果。

我記得過去有些網站儲存了大量的雜湊數據庫和生成它們的實際值,然後可以粘貼雜湊值,如果它很常見,您將獲得實際的字元串。這讓我想到,無論您使用什麼語言/作業系統,例如使用 SHA-256 散列的值都會產生相同的結果。然而,情況似乎並非完全如此。影片中提供答案的人(來自評論)使用 Mac 機器,那麼究竟是什麼導致 SHA-256 為相同的輸入產生不同的輸出?是作業系統,還是程式語言?也許我在簡單的程式碼中犯了錯誤?

是的,SHA-256定義為在每個平台上為相同的輸入字節序列提供相同的輸出。然而,根據設計,即使輸入的最小變化也會將輸出改變為完全不同的東西。因此,您觀察到的差異最可能的原因是您使用的輸入實際上與影片的原始輸入不同。

造成這種差異的一些可能原因可能包括:

  • 一個輸入末尾的額外空字節。
  • 一個輸入末尾的額外換行符或空格。
  • 換行符編碼的差異(如果字元串包含一個)。
  • 其中一個字母的大小寫不同(例如hellovs. Hello)。
  • 標點符號的差異(例如Hello!vs.Hello."Hello!")。
  • 用於將字元串編碼為字節序列的字元編碼的差異(對於普通的ASCII字元串不太可能Hello!,因為當今最常用的字元編碼是 ASCII 的擴展,但可能例如如果一個字元串被編碼為UTF-16) .

引用自:https://crypto.stackexchange.com/questions/72299