【问题标题】:HMAC SHA512 using CommonCrypto in Swift 3.1 [duplicate]在 Swift 3.1 中使用 CommonCrypto 的 HMAC SHA512 [重复]
【发布时间】:2017-06-07 18:26:06
【问题描述】:

我正在尝试加密数据以发送到 API。

API 要求数据以hmac_sha512 加密哈希的形式发送。

我找到了各种示例,说明如何在 sha1 和其他人(不是 sha512)以及旧版本的 Swift 中完成此操作。

我尝试过的示例均不适用于swift 3.1

我们将不胜感激。

编辑:

在 PHP 中,我使用以下方法成功发送:

    $sign = hash_hmac('sha512', $post_data, $this->secret);

编辑 2:

did add briding header,不知道接下来该怎么办!由于之后的代码示例不适用于 swift 3.1 :(

编辑 3:

已解决!猜猜看,我错误地创建了桥接头! :(

P.S 我试图避免 CryptoSwift,专注于 CommonCrypto。

下面给出的答案是不正确的,因为它不允许 hmac 获取加密密钥。我做了研究,终于让它工作了。这篇文章包含 hmac 的工作示例项目:https://github.com/nabtron/hmacTest

【问题讨论】:

  • 您不能将数据作为散列发送...您是在发送签名还是他们想要对其进行 sha512 加密?
  • 在 php 中我使用:$sign = hash_hmac('sha512', $post_data, $this->secret);
  • 查看答案Swift HMAC

标签: swift xcode hmac sha512 commoncrypto


【解决方案1】:

我认为最好的办法是使用Crypto pod,它是普通加密的包装器。如果您想直接使用 commonCrypto,您应该将桥接头添加到项目中并使用以下命令导入 common crypto:#import <CommonCrypto/CommonCrypto.h>

编辑 1

创建一个 swift 类并向其中添加以下代码:

import Foundation

extension String {
    var md5: String {
        return HMAC.hash(inp: self, algo: HMACAlgo.MD5)
    }

    var sha1: String {
        return HMAC.hash(inp: self, algo: HMACAlgo.SHA1)
    }

    var sha224: String {
        return HMAC.hash(inp: self, algo: HMACAlgo.SHA224)
    }

    var sha256: String {
        return HMAC.hash(inp: self, algo: HMACAlgo.SHA256)
    }

    var sha384: String {
        return HMAC.hash(inp: self, algo: HMACAlgo.SHA384)
    }

    var sha512: String {
        return HMAC.hash(inp: self, algo: HMACAlgo.SHA512)
    }
}

public struct HMAC {

    static func hash(inp: String, algo: HMACAlgo) -> String {
        if let stringData = inp.data(using: String.Encoding.utf8, allowLossyConversion: false) {
            return hexStringFromData(input: digest(input: stringData as NSData, algo: algo))
        }
        return ""
    }

    private static func digest(input : NSData, algo: HMACAlgo) -> NSData {
        let digestLength = algo.digestLength()
        var hash = [UInt8](repeating: 0, count: digestLength)
        switch algo {
        case .MD5:
            CC_MD5(input.bytes, UInt32(input.length), &hash)
            break
        case .SHA1:
            CC_SHA1(input.bytes, UInt32(input.length), &hash)
            break
        case .SHA224:
            CC_SHA224(input.bytes, UInt32(input.length), &hash)
            break
        case .SHA256:
            CC_SHA256(input.bytes, UInt32(input.length), &hash)
            break
        case .SHA384:
            CC_SHA384(input.bytes, UInt32(input.length), &hash)
            break
        case .SHA512:
            CC_SHA512(input.bytes, UInt32(input.length), &hash)
            break
        }
        return NSData(bytes: hash, length: digestLength)
    }

    private static func hexStringFromData(input: NSData) -> String {
        var bytes = [UInt8](repeating: 0, count: input.length)
        input.getBytes(&bytes, length: input.length)

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

        return hexString
    }
}

enum HMACAlgo {
    case MD5, SHA1, SHA224, SHA256, SHA384, SHA512

    func digestLength() -> Int {
        var result: CInt = 0
        switch self {
        case .MD5:
            result = CC_MD5_DIGEST_LENGTH
        case .SHA1:
            result = CC_SHA1_DIGEST_LENGTH
        case .SHA224:
            result = CC_SHA224_DIGEST_LENGTH
        case .SHA256:
            result = CC_SHA256_DIGEST_LENGTH
        case .SHA384:
            result = CC_SHA384_DIGEST_LENGTH
        case .SHA512:
            result = CC_SHA512_DIGEST_LENGTH
        }
        return Int(result)
    }
}

然后通过stringName.sha512简单地使用它
这个类扩展了 String 类,它提供了在字符串类中使用散列作为函数的能力。

【讨论】:

  • 我确实添加了briding header,我不知道下一步该做什么!
  • 检查编辑并联系我寻求帮助!
  • 它给出的错误如下:“使用未解析的标识符 CC_MD5”等等:(
  • 已解决! 你猜怎么着,我错误地创建了桥接头! :(
  • 如何将字符串和密钥同时传递给它?像上面的 PHP 例子一样?
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2019-01-05
  • 1970-01-01
相关资源
最近更新 更多