2013-12-10 55 views
0

我使用此存儲過程對SQL Server表進行散列和寫入密碼。將VARBINARY值寫入SQL Server 2008中的NVARCHAR列

DECLARE @PassWord as nvarchar(2000) = 'PSW' 
... 

DECLARE @MD5Password nvarchar(2000); 
SELECT @MD5Password = CONVERT(nvarchar(2000),@Password); 
SELECT HASHBYTES('MD5', @MD5Password); 
SET @MD5Password = HASHBYTES('MD5', @MD5Password) 

INSERT INTO [MyDataBase].[MyDatatable] (Column1) 
VALUES (@MD5Password) 

類型的Column1nvarchar(2000)

當我使用此代碼在MyDatatable中編寫密碼時,結果並非如我所料,它的寫法像中文字符。

我知道這是因爲從varbinary(類型@MD5Password)到nvarchar轉換,但我不知道我怎麼也得做寫在Mydatatable了良好的價值觀?

你能幫忙嗎?
謝謝

+3

呃,我可以問你爲什麼不製作varbinary列嗎? –

+0

嗨,@Aaron。因爲該列是由其他需要此列的nvarchar的軟件創建的。 – Chalumeau

+1

那麼其他軟件不應該讀取密碼,不要在轉換之前將其轉換爲純文本。如果你只是將它轉換爲字符串並將其傳遞給應用程序,那麼對它進行哈希處理有什麼意義呢?應用程序應該使用用戶提供的密碼,對其進行散列,並將其與您存儲的散列密碼進行比較。一旦存儲完畢,任何人都不應該將其轉換回純文本。你試圖做的事情聽起來像另一個Adobe崩潰等待發生。 –

回答

1

我假設你被廠商鎖定到特定的安全實現......如果不是你需要重新評估一些事情,比如作爲您正在使用的特定哈希算法,以及對哈希進行醃製的做法。

所以,如果你實際上被鎖定在這個實現中,我的理解是你基本上將varbinary的值轉換爲十六進制字符串......可能用於從數據庫而不是你的應用程序生成密碼哈希?

In SQL Server 2005 and onward, you can use xquery to accomplish this

DECLARE @Password NVARCHAR(20) = 'PSW' 

DECLARE @Hash VARBINARY(16) 
DECLARE @HashString VARCHAR(34) 

SET @Hash = HASHBYTES('MD5', @Password); 
SET @HashString = '0x' + CAST('' AS XML).value('xs:hexBinary(sql:variable("@Hash"))', 'VARCHAR(32)'); 

SELECT @Hash 
SELECT @HashString 

SQL Server 2005之前,你將不得不依賴存儲過程無證系統,但並不鼓勵這樣的Paul White describes in this answer

+0

謝謝@MichealFredrickson。實際上,我被鎖定在特定的安全實施中。謝謝你的理解和你的回答。這是像我預料的那樣工作。 – Chalumeau

0

正如文檔中所述,hashbytes返回一個varbinary值。爲什麼不是你的列varbinary?讓我問,爲什麼你想要一個可讀的哈希密碼呢?

如果你需要這樣的說法只是用鑄

DECLARE @Valor VARBINARY(20) 
SET @Valor = CAST('1235667' AS VARBINARY(20)) 
SELECT @Valor, CAST(@Valor AS VARCHAR(20)) 
+0

我知道HASHBYTES會返回一個varbinary值。 我在我最近的評論中解釋了爲什麼我可以更改列類型。我想要一個可讀的散列密碼,其他軟可以讀取列值。 – Chalumeau

+0

我之前就開始撰寫評論,並在其後編輯回答。 – jean

+0

使用來自'HASHBYTES'的輸出時,這不起作用。它不會轉換爲所需的十六進制字符串,而是返回'îuzR^Qû} HP =

相關問題