jueves 18 de septiembre de 2008

Como generar un Hash con una key secreta? (Message Authentication Code)

Gente,

Comparto algo que recién lo precisamos para un proyecto y entiendo aplica a varios escenarios.

Escenario:

Generar un hash de un string utilizando además una key secreta para agregar de esa manera un nivel más de seguridad, evitando que alguien se meta en el medio, cambie datos y vuelva a generar un hash idéntico.

Esto es lo que se conoce como MAC (Message Authentication Code). En esencia, el resultado es un hash encriptado.

Método

Existen varios mecanismos en la vuelta para generar esto (HMACMD5 , HMACSHA1). Hoy Microsoft está recomendando el uso de SHA256, por lo cual, opté por utilizar HMACSHA256.

Código

A continuación comparto las partes relevantes del código que permite hacer esto:

using System.Security.Cryptography;



public
string GetMACHash(string textToHash)

{


// secret key shared by sender and receiver.


byte[] secretkey = new
Byte[64];


string key = null;


string result = null;


 


//get secret key

key = "MySecretKey"; //esto podemos invocar a un metodo que traiga este valor de la registry por ejemplo

secretkey = System.Text.UTF8Encoding.UTF8.GetBytes(key);


 


// Initialize the keyed hash object.


HMACSHA256 myhmacsha256 = new
HMACSHA256(secretkey);


 


// Compute the hash of the text.


byte[] bytedText = System.Text.UTF8Encoding.UTF8.GetBytes(textToHash);


 


byte[] hashValue = myhmacsha256.ComputeHash(bytedText);


 


//Base-64 Encode the results and strip off ending '==', if it exists

result = Convert.ToBase64String(hashValue).TrimEnd("=".ToCharArray());


 


//set response


return result;

}


 

Referencias

Aquí hay un buen artículo que habla acerca de MACs.

http://dotnetslackers.com/articles/security/Hashing_MACs_and_Digital_Signatures_in_NET.aspx

Aquí la información sobre la clase HMACSHA256 

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha256.aspx