我们需要验证来自服务器的哈希值。Android 部分正在运行。在 iOS 端,我们使用 CryptoKit 来生成哈希值。作为参数传递“jsonString”,需要从中生成哈希键和需要匹配的“hasValue”。虽然这两个函数使用相同的算法,但结果总是不同的。
让摘要 = SHA512.hash(数据:jsonStringWithSaltBytes)
让 hasBytes = digest.bytes
在 computeHas 函数中,当我们尝试获取let hasBytes = digest.bytes
SHA512.hash 字节转换后它总是给出不同的 HashBytes。
import CryptoKit
extension Digest {
var bytes: [UInt8] { Array(makeIterator()) }
var data: Data { Data(bytes) }
}
func generateHasKey(jsonString: String, hasValue: String) -> Bool {
let data = Data(base64Encoded: hasValue)
let hashWithSaltByte: [UInt8] = Array(data!)
let hashSizeByts: Int = 512 / 8
if hashWithSaltByte.count < hashSizeByts {
return false
}
var saltBytesArr: [UInt8] = Array(repeating: 0, count: (hasWithSaltByte.count - hashSizeInByts))
for index in 0..<saltBytes.count {
saltBytesArr[index] = hasWithSaltByte[hashSizeInByts + index]
}
let expectedHasString = computeHas(jsonString: jsonString, saltBytes: saltBytesArr)
if expectedHashString == hasValue {
print("Hash value match..")
return true
}else {
print("Hash value did not match..")
return false
}
}
func computeHash(jsonString: String, saltBytes: [UInt8]) -> String {
let saltBytes = saltBytes
let jsonStringBytes: [UInt8] = Array(jsonString.utf8)
var jsonStringWithSaltBytes: [UInt8] = Array(repeating: 0, count: (jsonStringBytes.count + saltBytes.count))
for index in 0..<jsonStringBytes.count {
jsonStringWithSaltBytes[index] = jsonStringBytes[index]
}
for index in 0..<saltBytes.count {
jsonStringWithSaltBytes[jsonStringBytes.count + index] = saltBytes[index]
}
let digest = SHA512.hash(data: jsonStringWithSaltBytes)
let hashBytes = digest.bytes
var hashWithSaltBytes: [UInt8] = Array(repeating: 0, count: (hashBytes.count + saltBytes.count))
for index in 0..<hasBytes.count {
hashWithSaltBytes[index] = hashBytes[index]
}
for index in 0..<saltBytes.count {
hashWithSaltBytes[hashBytes.count + index] = saltBytes[index]
}
let FinalsaltData = Data(hasWithSaltBytes)
let finalHashString = FinalsaltData.base64EncodedString()
return finalHashString ?? ""
}