2017-09-13 62 views
1

如何以十六進制在C#中正確編碼SHA-256散列?如何以十六進制編碼SHA-256散列

private static string ToHex(byte[] bytes, bool upperCase) 
{ 
    StringBuilder result = new StringBuilder(bytes.Length * 2); 

    for (int i = 0; i < bytes.Length; i++) 
     result.Append(bytes[i].ToString(upperCase ? "X2" : "x2")); 

    return result.ToString(); 
} 

private string hashRequestBody(string reqBody) 
{ 
    string hashString; 
    using (var sha256 = SHA256Managed.Create()) 
    { 
     var hash = sha256.ComputeHash(Encoding.Default.GetBytes(reqBody)); 
     hashString = ToHex(hash, false); 
    } 

    MessageBox.Show(hashString); 
    return hashString; 
} 

我這樣做,但結果是與銀行的沙箱和我一起工作的不同。

測試數據:

{"CorporateID":"BCAAPI2016","SourceAccountNumber":"0201245680","TransactionID":"00000001","TransactionDate":"2017-09-13","ReferenceID":"refID","CurrencyCode":"IDR","Amount":"10000","BeneficiaryAccountNumber":"0201245681","Remark1":"Transfer Test","Remark2":"Online Transfer"}

銀行的沙盒結果:e9d06986c1ed6b063bf59aa873030013725c518631deef2b2147e614017c2141

礦:1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e

+0

ToHex()看起來不錯,問題是另一回事。你能顯示測試數據嗎? –

+0

@AlexK。編輯:) –

+0

你的結果是正確的輸入,你確定你應該只是散列,而不是使用像HMAC的東西? –

回答

1

我見過幾個解決這個問題,但你的代碼是最優雅的。我稍微重新考慮了它並測試了它的答案。我也得到了哈希:

1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e

看到這裏的工作小提琴:https://dotnetfiddle.net/QbsKTc

也許這散列銀行的不同,因爲你改變了JSON字符串刪除私人數據?

using System; 
using System.Security.Cryptography; 
using System.Text; 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine(SHA256HexHashString("{\"CorporateID\":\"BCAAPI2016\",\"SourceAccountNumber\":\"0201245680\",\"TransactionID\":\"00000001\",\"TransactionDate\":\"2017-09-13\",\"ReferenceID\":\"refID\",\"CurrencyCode\":\"IDR\",\"Amount\":\"10000\",\"BeneficiaryAccountNumber\":\"0201245681\",\"Remark1\":\"Transfer Test\",\"Remark2\":\"Online Transfer\"}")); 
    } 

    private static string ToHex(byte[] bytes, bool upperCase) 
    { 
     StringBuilder result = new StringBuilder(bytes.Length * 2); 
     for (int i = 0; i < bytes.Length; i++) 
      result.Append(bytes[i].ToString(upperCase ? "X2" : "x2")); 
     return result.ToString(); 
    } 

    private static string SHA256HexHashString(string StringIn) 
    { 
     string hashString; 
     using (var sha256 = SHA256Managed.Create()) 
     { 
      var hash = sha256.ComputeHash(Encoding.Default.GetBytes(StringIn)); 
      hashString = ToHex(hash, false); 
     } 

     return hashString; 
    } 
}