When you CAST() short value to NVARCHAR then SQL Server adds some right-padding to the value, and this "some value" is then hashed:
-- CAST the whole value
SELECT HASHBYTES('SHA2_512','Password' + CAST('Salt' AS NVARCHAR(36)))
-- Concatenation w/o CAST
SELECT HASHBYTES('SHA2_512','Password' + 'Salt')
-- Concatenation with manual padding
SELECT HASHBYTES('SHA2_512','Password' + 'Salt' + CAST('' AS NVARCHAR(32)))
(No column name) |
0x3B2EF12DF03E5756286EB5B86BCABE6A838ED91578E6535F1427E51D79AAABC566A838C0BBF02E4ED87E9F645959D55AA4829D7A6D4FE74BAE2B035D3C8B0C47 |
(No column name) |
0x90668E67E68BBBEBC8310F435EE4CD667D43C1CC7BE78A882093DB461E8BC2AC54DA81B54AD4BDD804B838FBEF6A42A0DE24ED0DAA578361EC75748B32BCE9AF |
(No column name) |
0x3B2EF12DF03E5756286EB5B86BCABE6A838ED91578E6535F1427E51D79AAABC566A838C0BBF02E4ED87E9F645959D55AA4829D7A6D4FE74BAE2B035D3C8B0C47 |
fiddle
MySQL have soft datatype system, and it simply truncates the padding symbols before thay are provided to the hashing function.
SELECT SHA2(CONCAT('Password', CAST('Salt' AS CHAR(36))), 512);
SELECT SHA2(CONCAT('Password', 'Salt'), 512);
SELECT SHA2(CONCAT('Password', 'Salt', CAST('' AS CHAR(32))), 512);
SHA2(CONCAT('Password', CAST('Salt' AS CHAR(36))), 512) |
90668e67e68bbbebc8310f435ee4cd667d43c1cc7be78a882093db461e8bc2ac54da81b54ad4bdd804b838fbef6a42a0de24ed0daa578361ec75748b32bce9af |
SHA2(CONCAT('Password', 'Salt'), 512) |
90668e67e68bbbebc8310f435ee4cd667d43c1cc7be78a882093db461e8bc2ac54da81b54ad4bdd804b838fbef6a42a0de24ed0daa578361ec75748b32bce9af |
SHA2(CONCAT('Password', 'Salt', CAST('' AS CHAR(32))), 512) |
90668e67e68bbbebc8310f435ee4cd667d43c1cc7be78a882093db461e8bc2ac54da81b54ad4bdd804b838fbef6a42a0de24ed0daa578361ec75748b32bce9af |
fiddle
And I cannot find the solution...