SQL 2005 MD5 Hash y C # Hash MD5

Actualmente tengo una database henetworkingada (SQL 2005) que genera cadenas de hash para tokens. Lo hace así …

DECLARE @RowID INT DECLARE @hashString VARCHAR(128) SET @RowID = 12345 SET @salt= 0xD2779428A5328AF9 SET @hashBinary = HASHBYTES(('MD5', @salt + CAST(@RowID AS VARBINARY(30))) SET @hashString = sys.fn_varbintohexstr(@hashBinary) 

Si ejecuto esto, mi cadena hash se ve así: "0x69a947fd71b853485007f0d0be0763a5"

Ahora, necesito replicar la misma lógica en C # para poder eliminar la dependencia de la database para generar estos hashes, y tiene que ser compatible con versiones anteriores.

He implementado en C # de esta manera:

 byte[] saltBytes = BitConverter.GetBytes(0xD2779428A5328AF9); byte[] pidBytes = BitConverter.GetBytes(12345); byte[] bytesToHash = new byte[saltBytes.Length + pidBytes.Length]; for (int i = 0; i < saltBytes.Length; i++) { bytesToHash[i] = saltBytes[i]; } for (int i = 0; i < pidBytes.Length; i++) { bytesToHash[saltBytes.Length + 1] = pidBytes[i]; } MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider(); byte[] hashedBytes = hasher.ComputeHash(bytesToHash); string hashString = BitConverter.ToString(hashedBytes).ToLower().Replace("-", ""); 

El problema es que mi implementación de C # genera este hash: "715f5d6341722115a1bfb2c82e4421bf"

Ellos son obviamente diferentes.

Entonces, ¿es posible hacer la pareja de manera consistente?

Me parece que hay un error en tu segundo ciclo. Intenta cambiar "+ 1" a "+ i" …

 for (int i = 0; i < pidBytes.Length; i++) { // the line below just overwrites the same position multiple times // bytesToHash[saltBytes.Length + 1] = pidBytes[i]; bytesToHash[saltBytes.Length + i] = pidBytes[i]; } 

En su ejemplo, simplemente sobrescribe la misma position en la matriz varias veces, en lugar de configurar cada elemento desde ese punto hacia adelante.

He resuelto el problema:

Si hago esto en SQL:

 DECLARE @Value INT SET @Value = 12345 SELECT sys.fn_varbintohexstr(CAST(@Value AS VARBINARY(30))) 

Obtengo este resultado: 0x00003039

Ahora, si hago esto en C #:

 int value = 12345; byte[] bytes = BitConverter.GetBytes(value); Console.Write(BitConverter.ToString(bytes)) 

Obtengo este resultado: 39-30-00-00

Los bytes parecen estar en order inverso. Por lo tanto, una vez que aplico estas matrices de bytes al hasher MD5, obtengo valores hash claramente diferentes.

Si invierto la matriz de bytes C # antes de pasarla a través del MD5 Hasher, obtengo el mismo hash generado por SQL.