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,然后再在其他地方计算哈希值(理解为您将失去一些保真度)。
我发现了一个奇怪的情况,当 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,然后再在其他地方计算哈希值(理解为您将失去一些保真度)。