Sql-Server

使用 HASHBYTES() 為 nvarchar 和變數產生不同的結果

  • June 30, 2017

我使用伺服器端雜湊來傳輸密碼,然後在數據庫中執行 PBKDF2 來儲存雜湊密碼 + salt 組合。

散列nvarchar(max)@variable持有相同值的 a 使用該HASHBYTES()函式產生不同的結果。

DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'

SELECT HASHBYTES('SHA1', 'password5baa61e4c9b93f3f0682250b6') AS NVARCHAR_INPUT, 
      HASHBYTES('SHA1', @hash) AS VARIABLE_INPUT

產生以下結果:

NVARCHAR_INPUT                             | VARIABLE_INPUT
0xA03BEF0E3EC96CC7C413C6646D3FEC6174DA530F | 0x74B55C42E1E0AB5C5CDF10B28567590B240355C3

這是 SQL Server 2012。這個特定的數據庫正在執行 SQL Server Express,所以我也很好奇這個問題是否與版本無關。

如果你想要一個帶引號的字元串NVARCHAR(被視為 Unicode),你需要在它前面加上 N。

DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'

SELECT HASHBYTES('SHA1', N'password5baa61e4c9b93f3f0682250b6') AS NVARCHAR_INPUT, 
      HASHBYTES('SHA1', @hash) AS VARIABLE_INPUT

這將顯示匹配的雜湊。

NVARCHAR_INPUT                               |VARIABLE_INPUT
0xCF01AF0DCECF41BA0106A264666544C2590A4660   |0xCF01AF0DCECF41BA0106A264666544C2590A4660

這裡不需要前綴,因為它被聲明為NVARCHAR並且字元串將被轉換。

DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'

雖然我遇到了一些問題,但我通常會說清楚:

DECLARE @hash NVARCHAR(MAX) = N'password5baa61e4c9b93f3f0682250b6'

如果您想了解為什麼它們可以以不同方式散列,請從以下範例開始:

DECLARE @n NVARCHAR(1) = N'N'
DECLARE @v VARCHAR(1) = 'N'

SELECT DATALENGTH(@n), DATALENGTH(@v)

引用自:https://dba.stackexchange.com/questions/177590