【问题标题】:SQL Server : Hashbytes with UmlautsSQL Server:带有变音符号的哈希字节
【发布时间】:2017-12-01 19:56:48
【问题描述】:

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

我在 SQL Server 中运行示例代码:

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

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

结果是:

9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08

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

我的问题:当我尝试加密例如“müller”时,SQL Server 中的结果是:

26A45113433596C5DD53643C7652381202E8009E532A280E513D887174A9ED14

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

2dbd218072117713f2d5996a726a9b216ed791ffd0783b6ba4ab6d61b8333192

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

感谢您为解决此问题提供的任何帮助。

【问题讨论】:

    标签: sql sql-server database sha256 hashbytes


    【解决方案1】:

    你有这个:

    declare @cryptString varchar(50) 
    

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

    müller
    

    这很糟糕。对于任何可能超出基本 ascii 字符的内容,您都需要 nvarchar

    但这只是初学者。 nvarchar uses UTF-16(请参阅页面一半左右标题为“补充字符”的部分)。该网站可能正在使用 UTF-32 或(可能)UTF-8 对这些字符进行编码。任何一个都将使用稍微不同的字节表示,这将产生完全不同的哈希值。

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

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

    【讨论】:

    • 我做了完全相同的Demo。结果仍然不同。
    • @lad2025 现在答案中还有更多内容。
    • @lad2025 谢谢你的详细解释,我猜可能是这种问题。在我的正常应用程序流程中,前端会将字符串散列到 SHA256 并将其保存到数据库中,在接下来的步骤中,我只比较那些加密字符串。暂时我只使用这种方法将旧数据迁移到新数据,并且必须加密它们。我会在周一工作时弄清楚。
    • 修复了@lad2025的知识和这篇stackoverflow文章MD5-Hash-of-a-utf8-string的正确答案的问题。之前使用这个 TableFunction 对字符串进行哈希处理对我来说很有效。我认为这个函数在做什么很明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多