2012-07-12 22 views
7

Archiviamo un hash della password nel database. In pratica si ottiene l'hash MD5 (array di byte) e Encoding.Unicode.GetChars quindi eseguire sulla matrice di byte e negozio che stringa risultante nel database. Quindi, quando qualcuno effettua il login, cancelliamo la password allo stesso modo e confrontiamo le due stringhe.T-SQL Get byte di VARCHAR senza conversione al UNICODE

Questa grande opera, ad eccezione che non posso estrarre un hash della password in T-SQL e inserirla in un'altra riga. L'unico modo in cui posso farlo funzionare è se in realtà imposto l'hash della password direttamente da una selezione di un'altra riga con un hash valido.

Ho cercato di convertire la stringa esadecimale e lasciare SQL converte, ma questo non funziona nemmeno. Presumo che sia perché i byte che codifichiamo come UNICODE probabilmente non costituiscono una stringa UNICODE valida.

Così, per esempio (SQL Server: Convert a string into a hex string and back):

Quando si esegue il seguente comando, la parola 'Aiuto' viene convertito in binario var e poi di nuovo in una stringa e oplà! Finisci con "Aiuto" di nuovo.

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

problema è che quando ho eseguito che sulla mia colonna di hash della password, il valore risultante non è lo stesso che viene memorizzato nella colonna. Se incollo la stringa contenente l'hash in SQL Management studio tra due simboli, salta il "e inserisce altri caratteri. Anche in questo caso, probalby tenta di interagire con una sequenza UNICODE incompleta visto che non è una stringa UNICODE corretta.

Quindi quello che sto cercando è un modo per prendere semplicemente i byte nel VARCHAR (64) che contiene l'hash della password e scrivere in un formato di testo codificare, qualcosa di simile a:

0x0F037584C99E7FD4F4F8C59550F8F507 

In modo che Posso quindi fare qualcosa come

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

Qualche idea?

risposta

4

DUH! Trovato. Mentre stavo rileggendo il mio post mi sono reso conto che nei miei esempi stavo usando una conversione in VARCHAR, non in NVARCHAR. Una volta cambiato in NVARCHAR, tutto ha iniziato a funzionare.

0

è possibile utilizzare

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

    FileBytes=0x3C3F786D6C207665