gpt4 book ai didi

hash - Swift HMAC 不匹配 NodeJS HMAC,但只是有时!

转载 作者:行者123 更新时间:2023-11-28 23:27:59 26 4
gpt4 key购买 nike

我在我的代码中发现了一个巨大的问题,我完全不知道是什么导致了这个问题。

所以,当我向我的服务器发送请求时,我对请求中的字符串进行哈希处理。这有时是用户输入。

我的应用是多语言的,所以我必须支持所有“ä”字符等。

因此对于普通的英文字母/字符数字等,这种散列方法就像做梦一样。但是,当被散列和比较的字符串包含“ä”或“ö”时(不是特定的那些,字面上可能是任何不在 Base64 集中的字符都会导致这种情况),散列不匹配!

这绝对是一场彻底的灾难,到目前为止我还没有注意到。我基本上已经尝试了我所知道的一切来尝试解决这个问题,并进行了谷歌搜索,但到目前为止我并不走运。

我在 Swift 中生成散列,将字符串和 secretToken 输入到此函数并将输出保存为 HTTP header :

func hmac(string: String, key: String) -> String {

var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))

CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), key, key.count, string, string.count, &digest)

let data = Data(digest)

return data.map { String(format: "%02hhx", $0) }.joined()

}

如何比较 NodeJS 中的哈希值:

if (hashInTheRequest === crypto.createHmac('sha256', secretToken).update(stringToHash).digest('hex')) {
//Good to go
}

提前致谢!

最佳答案

这可能是由于组成问题。您提到了非拉丁字符,但没有具体说明您遇到问题的具体示例。

什么是合成?

Unicode 旨在能够表示人类使用的任何字符。然而,许多字符是相似的,例如 uüûū。最初的想法是为每个可能的组合分配一个代码点。正如人们可能想象的那样,这不是最有效的存储方式。相反,使用“基本”字符,然后向其添加组合字符。

让我们看一个例子:ü

ü 可以表示为 U+00FC,也称为 LATIN SMALL LETTER U WITH DIAERESIS

ü 也可以表示为 U+0075 (u),后面跟着 U+0308 ( ◌̈),也称为 LATIN SMALL LETTER U,后跟 COMBINING DIARESIS

为什么会出现问题?

因为哈希函数不知道字符串是什么。他们只关心字节。因此,必须将字符串解码为字节串。如上所示,有多种不同的字符串解码方式,这意味着两个不同的系统可以将相同的逻辑字符串解码为不同的字节,从而导致不同的哈希值。

我该如何解决这个问题?

您必须明确定义字符串在两个平台上的解码方式,以确保两者以完全相同的方式解码字符串。

关于hash - Swift HMAC 不匹配 NodeJS HMAC,但只是有时!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58081482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com