2017-09-13 8 views
1

Comment hexadécoder Encoder un hachage SHA-256 correctement en C#? Je l'ai fait, mais le résultat est différent avec le bac à sable de la banque avec lequel j'ai travaillé.Comment coder en hexadécimal un hachage SHA-256

DONNÉES D'ESSAI:

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

résultat bac à sable de la Banque: e9d06986c1ed6b063bf59aa873030013725c518631deef2b2147e614017c2141

Mine: 1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e

+0

ToHex() semble correct, le problème est autre chose. Pouvez-vous montrer des données de test. –

+0

@AlexK. édité :) –

+0

Votre résultat est correct pour cette entrée, êtes-vous sûr que vous êtes censé juste hachage plutôt que d'utiliser quelque chose comme un HMAC? –

Répondre

1

Je l'ai vu plusieurs solutions à ce problème, mais votre code est le plus élégant. Je l'ai légèrement ré-factorisé et testé pour cette réponse. Je reçois aussi le hachage:

1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e

Voir violon travailler ici: https://dotnetfiddle.net/QbsKTc

Peut-être ce hachage est différent de la banque parce que vous avez changé la chaîne JSON pour supprimer les données privées?

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; 
    } 
}