1

I am following a simple example from this question:

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

It returns a correct hashed value: K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=

Now I tried to declare secret as a variable following Microsoft Hashbytes documentation example:

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)');

it returns a wrong hash:

s6jeuSg7FUrj9WBqMj0GbSRudEDi2NTJqHqmG5UYOiY=

Is there any way to declare a secret as a variable to get the correct hash?

I am new to this Hashbytes stuff in SQL. I am using it on SQL Server 2017.

Maytham Fahmi
  • 31,138
  • 14
  • 118
  • 137
Maya Rager
  • 25
  • 2
  • 11

1 Answers1

2

The issue is that you are using nvarchar to declare your secret. but it should be varchar and it would solve the problem.

So let's test it:

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)');

Will return what you expected initially:

K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=

By the way, you do not need to CONVERT, you can pass the secret as varchar. something like:

DECLARE @HashThis varchar(32);
SET @HashThis = 'secret';
Maytham Fahmi
  • 31,138
  • 14
  • 118
  • 137