【问题标题】:Correct SHA256 implementation with UTF-8 characters使用 UTF-8 字符正确实现 SHA256
【发布时间】:2016-09-22 09:55:57
【问题描述】:

我在比较不同语言/函数生成的 SHA256 哈希时遇到了问题。

例如,SHA256("í") 要么返回:

f3df1f9c358ae8eceb8fce7c00614288d113ad55315f4ebb909774a7daadfc84

-或-

127035a8ff26256ea0541b5add6dcc3ecdaeea603e606f84e0fd63492fbab2c5

上面哪个哈希值对于一个字符的字符串是正确的,处理 UTF-8 字符串的正确方法是什么?

【问题讨论】:

  • 没有“UTF-8 字符”这样的东西。有 Unicode 字符,如果您愿意,可以将它们编码为 UTF-8。您根本没有告诉我们您对哪种语言感兴趣,但基本上该过程是使用您选择的编码(例如 UTF-8)将字符串编码为二进制数据,获取 SHA-256 哈希,然后然后使用 hex 或 base64 将该哈希转换回字符串。

标签: hash utf-8 character-encoding sha


【解决方案1】:

对于一个字符的字符串,上面哪个哈希是正确的

没有“正确”的答案。被散列的是 bytes,而不是“字符”。哪些字节被散列完全取决于字符串的编码。

Windows-1252 中的"í" 是字节ED,其哈希为:

f3df1f9c358ae8eceb8fce7c00614288d113ad55315f4ebb909774a7daadfc84

UTF-8 中的"í" 是字节C3 AD,其散列为:

127035a8ff26256ea0541b5add6dcc3ecdaeea603e606f84e0fd63492fbab2c5

"í" 在 UTF-16LE 中是字节 ED 00,其哈希为:

430e2ca27910b5ee6e0ec56a12b81325c763376cb8e25a60362dce9444424f95

这在各种编程语言中的具体工作方式取决于它们用于字符串的语言和编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多