Sql-Server
使用 HASHBYTES() 為 nvarchar 和變數產生不同的結果
我使用伺服器端雜湊來傳輸密碼,然後在數據庫中執行 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)