SQL 服务器:带变音符号的哈希字节

SQL Server : Hashbytes with Umlauts

我发现了一个奇怪的情况,当 SQL 服务器的 Hashbyte 函数在将其转换为 SHA2_256 并使用包含元音符号的字符串时未输出正确的结果 (ä ,ö,ü,ß)。

我运行示例代码在SQL服务器:

 declare @cryptString varchar(50) 
 set @cryptString = 'test'

 select convert(Varchar(64), Hashbytes('SHA2_256', @cryptstring), 2)

结果是:

9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08

当我检查 https://hashgenerator.de/ 上的 SHA256 转换时,结果是一样的。

我的问题:当我尝试加密时 'müller',SQL 服务器中的结果是:

26A45113433596C5DD53643C7652381202E8009E532A280E513D887174A9ED14

当我检查 https://hashgenerator.de/ 上的 SHA256 转换时,结果不同。

2dbd218072117713f2d5996a726a9b216ed791ffd0783b6ba4ab6d61b8333192

我认为这可能是一个编码问题,但我搜索了几个小时也没有找到任何线索来解决这个问题。

感谢任何帮助解决此问题的帮助。

你有这个:

declare @cryptString varchar(50) 

然后你尝试用它来保存这个值:

müller

太糟糕了。对于超出基本 ascii 字符范围的任何内容,您都需要一个 nvarchar

但这只是初学者。 nvarchar uses UTF-16(请参阅页面中部标题为 "Supplementary Characters" 的部分)。该网站可能使用 UTF-32 或(可能)UTF-8 来对这些字符进行编码。任何一个都将使用略有不同的字节表示,这将产生完全不同的哈希值。

我相信您在 https://hashgenerator.de/ 看到的是 UTF-8,因为 UTF-8 在仅使用 ASCII 字符时与 ASCII 匹配。使用 UTF-8,像 test 这样的简单值将对网站和数据库产生相同的结果。

要解决此问题,请了解 SQL 散列 使用 ASCII 或 UTF-16,因此您必须在任何其他平台上更改编码用于匹配数据库。最简单的选择可能是始终对这些值使用 UTF-16,但您也可以选择在数据库上坚持使用 varchar 并将文本转换为 ascii,然后再在其他地方计算哈希值(理解为您将失去一些保真度)。