2012-05-11 21 views
6

Actualmente estoy trabajando en un proyecto que implicará transferencias de tarjetas de crédito para admisiones basadas en filas de bases de datos. Al igual que un sistema de llamada voluntaria, el hash SHA-256 del número CC debe coincidir con el hash en la fila DB para que se lo considere el "pickup adecuado".hashes SHA-256 diferentes entre C# y Javascript

Sin embargo, dado que el sistema de taquilla se basa en el navegador, el número de CC en el arranque debe ser hash del lado del cliente, usando Javascript, y luego se compara con los datos de llamada previa descargados.

Sin embargo, cuando tratamos de cifrar los números, el hash siempre termina diferente de lo que fue hashed cuando se creó la fila DB (usando VB.NET y SQL Server 2008 R2). Por ejemplo, si un número CC en la base de datos resulta ser , entonces el hash resultante de .NET se convertiría en xU6sVelMEme0N8aEcCKlNl5cG25kl8Mo5pzTowExenM =.

Sin embargo, al usar cualquier biblioteca de hash SHA-256 de Javascript que pude encontrar, el hash resultante sería siempre NbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0 =.

Supongo que se trata de algún tipo de problema Unicode/UTF-8, pero no importa lo que intento, no puedo hacer que los hashes salgan igual y me está volviendo loco. ¿Puede alguien ofrecer algún consejo?

Aquí hay algo que puede proporcionar alguna información. Vaya a http://www.insidepro.com/hashes.php?lang=eng e inserte "4444333322221111" sin comillas en el cuadro Contraseña. Luego, desplácese hacia abajo a la sección SHA-256.

Puede ver que hay cuatro resultados, dos de ellos son los códigos hash que publiqué (el segundo desde la parte superior es el hash de Javascript y el de abajo es el hash SQL). De acuerdo con esa página, el resultado del hash inferior se genera utilizando una cadena de base 64, además de convertir la contraseña en formato unicode.

He investigado esto y he probado muchas funciones diferentes para codificar la contraseña en formato Unicode, pero no importa qué pequeños ajustes intente u otras funciones que realice, nunca podría lograr que coincida con el código hash que necesito.

Actualmente estoy investigando los parámetros utilizados al llamar a la función SHA-256 en el lado del servidor.

ACTUALIZACIÓN:

Así sólo para asegurarse de que no estaba loca, me encontré con el método de hash que estoy usando los números CC en la ventana inmediata durante la depuración. De nuevo, el resultado sigue siendo el mismo que antes. Puede ver una captura de pantalla aquí: http://i.imgur.com/raEyX.png

+0

¿Podría proporcionarnos alguna información sobre cómo logró el hash en ambos extremos? ¿Qué funciones, su código, etc. ... – JaredPar

+0

posible duplicado de [Java SHA256 emite diferente hash a PHP SHA256?] (Http://stackoverflow.com/questions/4680661/java-sha256-outputs-different-hash-to- php-sha256) –

+0

¿Mostrar un código? Estoy usando este SHA512: http://pajhome.org.uk/crypt/md5/sha512.html y previamente utilicé este SHA-1: http://www.movable-type.co.uk/scripts/sha1. html sin problemas de interoperabilidad de C#. (Pregunta relacionada: ¿por qué no usar sha512?) –

Respuesta

2

Adam Liss tenía razón cuando mencionó las matrices de bytes entre las cadenas en .NET/SQL Server son diferentes a las cadenas en Javascript. La matriz en .NET para la cadena se vería como [52 0 52 0 52 0 52 0 51 0 51 0 ... etc.] y lo mismo en Javascript se vería como [52 52 52 52 51 51 51 51 ...]. Por lo tanto, con diferentes matrices de bytes, se generaron diferentes hash.

Pude remediar esto para mi aplicación modificando el algoritmo de hash base 64 SHA-256 de here, donde cada carácter se extrae de la cadena de uno en uno para generar el hash.

En lugar de tener que hacerlo de esta manera, primero convertí la cadena en una matriz de bytes unicode (como el ejemplo de .NET anterior, 52 0 52 0, etc.), alimenté esa matriz al algoritmo de hash en lugar del cadena, e hizo algunos ajustes muy pequeños para que agarre cada miembro de la matriz para generar el hash. Bajo y he aquí, funcionó y ahora tengo un método muy conveniente de calcular números CC de la misma manera que el .NET framework para una búsqueda rápida y fácil de pedidos.

+1

Puede haber intentado 'Encoding.ASCII.GetBytes (" 4444333322221111 ")' para asegurarse de que estaba tratando con ASCII en el lado de .NET. Recuerde, las funciones criptográficas se ocupan de los bytes, no del texto. La asignación entre texto y bytes no es uno a uno, a menos que tenga en cuenta la codificación. –

+0

William, ¿te importa compartir cómo lo hiciste? – Jaans

0

¿Estás seguro de tu función de JavaScript SHA256?


¿Y su primer hash generado?

SHA-256("4444333322221111"); // 35b8ee49a804ee51d5433292646d3de9b1ed42830bb1c6005f2b825d7d16b70d 

hex: 35b8ee49a804ee51d5433292646d3de9b1ed42830bb1c6005f2b825d7d16b70d 
HEX: 35B8EE49A804EE51D5433292646D3DE9B1ED42830BB1C6005F2B825D7D16B70D 
h:e:x: 35:b8:ee:49:a8:04:ee:51:d5:43:32:92:64:6d:3d:e9:b1:ed:42:83:0b:b1:c6:00:5f:2b:82:5d:7d:16:b7:0d 
base64: NbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0= 
+0

Esto probablemente debería ser un comentario ... a menos que planee editar más información. –

+0

He intentado una gran cantidad de métodos diferentes de SHA256 para Javascript y ninguno ha devuelto el hash correcto. –

+0

¿Puede profundizar en eso, @WilliamThomas? –

2

Según online SHA-256 hash calculator y una base-64 to hex decoder, que es la aplicación .NET que no ha calculado el hash correctamente. Es posible que desee verificar dos veces los parámetros que pasa a las funciones hash.

Cuando se trata de dos implementaciones que no son de confianza, siempre es una buena idea buscar otra implementación independiente y elegir la que coincida con la tercera como correcta. O eso, o find some test vectors, y valida las implementaciones individualmente.


EDIT:

Un experimento rápido muestra que el hash SHA-256 que se obtiene de .NET coincide con la cadena Hext 3400340034003400330033003300330032003200320032003100310031003100 - Little Endian caracteres de 16 bits. Asegúrate de pasar ASCII.

+0

Interesante ... Lo comprobaré, gracias. –