node.js - Swift 中生成的 HMAC 不等于 NodeJS 中的 HMAC 有时
问题描述
我在我的代码中发现了一个巨大的问题,我根本不知道是什么原因造成的。
所以,当我向我的服务器发送请求时,我会对请求中的字符串进行哈希处理。这有时是用户输入。
我的应用程序是多语言的,所以我必须支持所有“ä”字符等。
因此,对于普通的英文字母/字符数字等,这种散列方法就像做梦一样。但是,当被散列和比较的字符串包含“ä”或“ö”(不是特别是那些,字面上可能是任何不在 Base64 集中的字符都会导致这种情况)时,哈希不匹配!
这是一场绝对彻底的灾难,我至今没有注意到它。我基本上已经尝试了我所知道的一切来尝试解决这个问题,并在谷歌上搜索,到目前为止我很不走运。
我在 Swift 中生成哈希,将字符串和 secretToken 输入到这个函数中,并将输出保存为 HTTP 标头:
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
}
提前致谢!
解决方案
推荐阅读
- hive - 如何以“。”分隔的字符串形式比较版本号?
- angular - 即使应用程序运行良好,NgRx Redux devtools 也没有显示存储和状态详细信息
- php - 如何仅返回在 Twig 模板、Rainlab.Translate 模块中具有翻译的文章
- javascript - 在 node.js 上使用 jqplot?
- java - OSGI 缓存目录
- c# - 实体框架 - 同时使用 FK 插入父模型和子模型
- c# - ASPX 页面有重复的行,即使它们在 SQL 中没有重复
- c++ - 将函数作为参数传递以避免重复代码
- oracle - APEX 5.1,在列链接中设置项目值不喜欢特殊字符...比如逗号或#
- python - 如何在 PyQt 中创建可折叠的盒子