2012-07-12 17 views
7

Almacenamos un hash de contraseña en la base de datos. Básicamente obtenemos el MD5 hash (matriz de bytes) y luego ejecutamos Encoding.Unicode.GetChars en la matriz de bytes y almacenamos esa cadena resultante en la base de datos. Luego, cuando alguien inicia sesión, su contraseña se califica de la misma manera y se comparan las dos cadenas.T-SQL Obtenga bytes de VARCHAR sin convertir a UNICODE

Esto funciona muy bien, excepto que no puedo extraer un hash de contraseña en T-SQL e insertarlo en otra fila. La única forma en que puedo hacer que funcione es si realmente configuro el hash de contraseña directamente desde una selección de otra fila con un hash válido.

He intentado convertir la cadena en hexadecimal y dejar que SQL la convierta, pero eso tampoco funciona. Supongo que es porque los bytes que codificamos como UNICODE probablemente no constituyan una cadena de UNICODE válida.

Así, por ejemplo (SQL Server: Convert a string into a hex string and back):

Cuando se ejecuta el comando siguiente, la palabra 'ayuda' se convierte a binario var y luego de vuelta a una cuerda y ¡listo! Terminas con 'Ayuda' otra vez.

SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 'Help')) 

El problema es que cuando corro que en mi columna de hash de la contraseña, el valor resultante no es la misma que se almacena en la columna. Si pego la cadena que contiene el hash en el estudio SQL Management entre dos 'símbolos, salta el' y coloca otros caracteres. De nuevo, probalby tratando de interpretar una secuencia UNICODE incompleta ya que no es una cadena UNICODE adecuada.

Así que lo que estoy buscando es una manera de tomar simplemente los bytes en el VARCHAR (64) que contiene el hash de la contraseña y escribirla en un formato de texto codificar, algo así como:

0x0F037584C99E7FD4F4F8C59550F8F507 

Para que Entonces puedo hacer algo como

UPDATE [User] 
SET  PasswordHash = CONVERT(NVARCHAR(64), 0x0F037584C99E7FD4F4F8C59550F8F507) 
WHERE UserID = 123 

¿Alguna idea?

Respuesta

4

DUH! Lo encontré. Mientras releía mi publicación, me di cuenta de que en mis ejemplos estaba usando una conversión a VARCHAR, no a NVARCHAR. Una vez que lo cambié a NVARCHAR, todo comenzó a funcionar.

0

puede utilizar

select CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX),FileBytes)) 

    FileBytes=0x3C3F786D6C207665