Swift中Blake2B 128哈希结果不匹配问题求助
问题:Blake2B 128哈希结果不符的解决方法
我有如下十六进制字符串:0x6469643a737369643a7465737432343700000000000000000000000000000000,尝试通过Blake2B 128进行哈希转换。
预期结果:0x017d8f165615146b5af43b037ee14db4
但我的代码运行后得到的结果是:6a3f369054a2150757e7a4a8a6f59996
代码实现:
let newData = try encodedHexData.blake2b(128) let newHex = newData.toHexString() print("HEX::: ", newHex) func blake2b(_ size: Int) throws -> Data { do { var hasher = try Blake2(.b2b, size: size / 8) hasher.update(self) return try hasher.finalize() } catch { throw error } }
请问正确的实现方式应该是什么?
参考了substrate-client-swift和fearless-utils-iOS的内容。
问题原因与修正方案
结果不符的核心原因是:Substrate生态中使用的Blake2b-128是带**空密钥+个人化参数"SSHA256"**的定制版本,而非标准无参数的Blake2b哈希。
正确的Swift实现
extension Data { func blake2b128Substrate() throws -> Data { // Substrate专属Blake2b-128配置:空密钥,个人化参数为"SSHA256" let personalization = "SSHA256".data(using: .utf8)! var hasher = try Blake2(.b2b, size: 16, key: Data(), personalization: personalization) hasher.update(self) return try hasher.finalize() } } // 使用示例 let targetHex = "6469643a737369643a7465737432343700000000000000000000000000000000" guard let inputData = Data(hexString: targetHex) else { fatalError("无效的十六进制字符串") } do { let hashData = try inputData.blake2b128Substrate() let resultHex = "0x" + hashData.toHexString() print("HEX::: ", resultHex) // 输出预期的0x017d8f165615146b5af43b037ee14db4 } catch { print("哈希失败:", error) }
关键说明
- 必须指定个人化参数
"SSHA256",这是Substrate对Blake2b-128的定制要求,也是和标准哈希结果差异的根本原因。 - 确保使用的Blake2库支持设置个人化参数(比如substrate-client-swift或fearless-utils-iOS中封装的实现)。
内容的提问来源于stack exchange,提问作者Abhishek Thapliyal
相关产品推荐
相关产品推荐

