【问题标题】:How to pass key in HMAC as HEX Swift iOS如何将 HMAC 中的密钥作为 HEX Swift iOS 传递
【发布时间】:2019-12-20 22:45:36
【问题描述】:

所以我要为 HMAC-SHA1 生成此代码

let key = "foo".toSHA1()
let data = "bar"
var results = [CUnsignedChar](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))

CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), key, key.count, data, data.count, &results)

let hmacData:NSData = NSData(bytes: results, length: (Int(CC_SHA1_DIGEST_LENGTH)))

var bytes = [UInt8](repeating: 0, count: hmacData.length)
hmacData.getBytes(&bytes, length: hmacData.length)

var hexString = ""
for byte in bytes {
    hexString += String(format:"%02hhx", UInt8(byte))
}

print(hexString)

以及将密钥字符串转换为 SHA1 的代码

func toSHA1() -> String {
        let data = self.data(using: String.Encoding.utf8)!
        var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))
        data.withUnsafeBytes {
            _ = CC_SHA1($0, CC_LONG(data.count), &digest)
        }
        let hexBytes = digest.map { String(format: "%02x", $0) }

        return hexBytes.joined()
    }

结果是

faa3c04b058d38cecf1243421a596742a6cf1188

所以使用这个onlineHMAC Generator 输出相同的结果。但我想要的输出应该是

38b24d28d64f2459d42d1ecd1c9fa375ffeb369f

我可以通过在我提供的页面中将 Key 类型更改为 HEX 来实现。

所以我现在的问题是如何在我的代码中获得相同的输出?我需要将 key 转换为十六进制吗?

【问题讨论】:

    标签: ios swift hex hmac


    【解决方案1】:

    通过将 digest 作为键而不是将其转换为字符串来修复它。

    这是更新后的代码

    let key = "foo".toSHA1()
    let data = "bar"
    var results = [CUnsignedChar](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
    
    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), key, key.count, data, data.count, &results)
    
    let hmacData:NSData = NSData(bytes: results, length: (Int(CC_SHA1_DIGEST_LENGTH)))
    
    var bytes = [UInt8](repeating: 0, count: hmacData.length)
    hmacData.getBytes(&bytes, length: hmacData.length)
    
    var hexString = ""
    for byte in bytes {
        hexString += String(format:"%02hhx", UInt8(byte))
    }
    
    print(hexString)
    
    
    func toSHA1() -> [UInt8] {
            let data = self.data(using: String.Encoding.utf8)!
            var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))
            data.withUnsafeBytes {
                _ = CC_SHA1($0, CC_LONG(data.count), &digest)
            }
    
            return digest
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多