2012-07-12 24 views
7

我們將密碼哈希存儲在數據庫中。基本上我們得到MD5散列(字節數組),然後在字節數組上運行Encoding.Unicode.GetChars並將結果字符串存儲在數據庫中。然後當有人登錄時,我們以相同的方式散列他們的密碼並比較兩個字符串。T-SQL在不轉換爲UNICODE的情況下從VARCHAR獲取字節

這很好,除了我無法在T-SQL中提取密碼哈希並將其插入另一行。我可以得到這個工作的唯一方法是,如果我實際上使用有效散列直接從另一行中選擇密碼散列。

我試圖將字符串轉換爲十六進制,並讓SQL將其轉換,但這也不起作用。我認爲這是因爲我們編碼爲UNICODE的字節可能不會構成有效的UNICODE字符串。

因此,例如(SQL Server: Convert a string into a hex string and back):

當您運行下面的命令,這個詞「幫助」被轉換爲VAR二進制文件,然後返回一個字符串和變戲法似的!你最終再次獲得'幫助'。

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

問題是,當我運行我的密碼哈希列,如存儲在該列所得到的值是不一樣的。如果我將包含散列的字符串粘貼到兩個'符號之間的SQL Management Studio中,它會跳過'並放入其他字符。再次,probalby試圖插入一個不完整的UNICODE序列,因爲它不是一個合適的UNICODE字符串。

所以我正在尋找一種方法來簡單地拿個字節的VARCHAR(64),其中包含的密碼哈希,並將其寫入到一個編碼文本格式,是這樣的:

0x0F037584C99E7FD4F4F8C59550F8F507 

使然後我可以做類似

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

任何想法?

回答

4

DUH!找到了。當我重讀我的文章時,我意識到在我的示例中,我正在使用轉換爲VARCHAR,而不是NVARCHAR。一旦我將其更改爲NVARCHAR,它就開始工作了。

0

您可以使用

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

    FileBytes=0x3C3F786D6C207665 
相關問題