1

我正在关注这个问题的简单示例:

DECLARE @HASHBYTES VARBINARY(128) = hashbytes('sha2_256', 'secret')
SELECT cast(N'' as xml).value('xs:base64Binary(sql:variable("@HASHBYTES"))', 'varchar(128)');

它返回一个正确的散列值:K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=

现在我尝试按照 Microsoft Hashbytes 文档示例将 secret 声明为变量:

DECLARE @HashThis nvarchar(32);  
SET @HashThis = CONVERT(nvarchar(32),'secret');
DECLARE @HASHBYTES VARBINARY(128) = hashbytes('sha2_256', @HashThis)
SELECT cast(N'' as xml).value('xs:base64Binary(sql:variable("@HASHBYTES"))', 'varchar(128)');

它返回一个错误的哈希:

s6jeuSg7FUrj9WBqMj0GbSRudEDi2NTJqHqmG5UYOiY=

有没有办法将秘密声明为变量以获得正确的哈希?

我是 SQL 中这个 Hashbytes 的新手。我在 SQL Server 2017 上使用它。

4

1 回答 1

2

问题是你nvarchar用来声明你的秘密。但它应该是varchar,它会解决问题。

所以让我们测试一下:

DECLARE @HashThis varchar(32);  
SET @HashThis = CONVERT(varchar(32),'secret');
DECLARE @HASHBYTES VARBINARY(128) = hashbytes('sha2_256', @HashThis)
SELECT cast(N'' as xml).value('xs:base64Binary(sql:variable("@HASHBYTES"))', 'varchar(128)');

将返回您最初的预期:

K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=

顺便说一句,您不需要转换,您可以将秘密作为 varchar 传递。就像是:

DECLARE @HashThis varchar(32);
SET @HashThis = 'secret';
于 2021-07-28T19:19:12.300 回答