我在我的代码中发现了一个很大的问题,我真的不知道是什么导致了这个问题。
因此,当我向我的服务器发送请求时,我散列了请求中的一个字符串。这有时是用户输入。
我的应用程序是多语言的,所以我必须支持所有的"ä“字符等。
因此,对于普通的英文字母/字符数字等,这种散列方法就像做梦一样工作。但是,当被散列和比较的字符串包含"ä“或"ö”(不是特别的,字面上可能是任何不在Base64集合中的字符都会导致这种情况)时,散列不匹配!
这绝对是一场彻底的灾难,我到目前为止还没有注意到它。我基本上已经尝试了我所知道的所有方法来解决这个问题,并搜索了一下,但到目前为止我还是不走运。
我在Swift中生成散列,将字符串和secretToken输入到此函数中,并将输出保存为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
}提前感谢!
发布于 2019-09-18 19:33:37
这可能是由于组成问题。您提到了非拉丁字符,但没有指定任何遇到问题的具体示例。
什么是组合?
Unicode的目标是能够表示人类使用的任何字符。但是,许多字符是相似的,例如u、ü、û和ū。最初的想法是为每个可能的组合分配一个代码点。正如人们可能想象的那样,这不是存储东西的最有效的方式。相反,使用"base“字符,然后向其添加一个组合字符。
让我们看一个例子:ü
ü可以表示为U+00FC,也称为LATIN SMALL LETTER U WITH DIAERESIS。
ü也可以表示为U+0075 (u),然后是U+0308 (◌̈),也称为LATIN SMALL LETTER U,然后是COMBINING DIARESIS。
为什么这是有问题的?
因为哈希函数不知道字符串是什么。他们关心的只是字节。因此,必须将字符串解码为字节字符串。如上所述,有多种不同的方法来解码字符串,这意味着两个不同的系统可以将相同的逻辑字符串解码为不同的字节,从而产生不同的散列。
我该如何解决这个问题呢?
您必须显式定义字符串在两个平台上的解码方式,以确保两个平台都以完全相同的方式解码字符串。
https://stackoverflow.com/questions/58081482
复制相似问题