Python hmac y C # hmac

Tenemos un servicio web de python. Necesita un hash como parámetro. El hash en python se genera de esta manera.

hashed_data = hmac.new("ant", "bat", hashlib.sha1) print hashed_data.hexdigest() 

Ahora, así es como genero el hash de C #.

  ASCIIEncoding encoder = new ASCIIEncoding(); Byte[] code = encoder.GetBytes("ant"); HMACSHA1 hmSha1 = new HMACSHA1(code); Byte[] hashMe = encoder.GetBytes("bat"); Byte[] hmBytes = hmSha1.ComputeHash(hashMe); Console.WriteLine(Convert.ToBase64String(hmBytes)); 

Sin embargo, estoy saliendo con un resultado diferente.

¿Debo cambiar el orden del hash?

Gracias,

Jon

Para imprimir el resultado:

  • En Python usas: .hexdigest()
  • En C # usas: Convert.ToBase64String

Esas 2 funciones no hacen lo mismo en absoluto. El hexdigest de Python simplemente convierte la matriz de bytes a una cadena hexadecimal, mientras que el método C # usa la encoding Base64 para convertir la matriz de bytes. Entonces para obtener la misma salida simplemente defina una función:

 public static string ToHexString(byte[] array) { StringBuilder hex = new StringBuilder(array.Length * 2); foreach (byte b in array) { hex.AppendFormat("{0:x2}", b); } return hex.ToString(); } 

y entonces:

 ASCIIEncoding encoder = new ASCIIEncoding(); Byte[] code = encoder.GetBytes("ant"); HMACSHA1 hmSha1 = new HMACSHA1(code); Byte[] hashMe = encoder.GetBytes("bat"); Byte[] hmBytes = hmSha1.ComputeHash(hashMe); Console.WriteLine(ToHexString(hmBytes)); 

Ahora obtendrás la misma salida que en Python:

 739ebc1e3600d5be6e9fa875bd0a572d6aee9266