我试图在Swift中创建一个字符串的HMAC SHA-1散列,但由于它似乎没有导入CommonCrypto框架,所以无法理解如何与API交互.我try 过各种不同形式的"导入CommonCrypto"和创建桥接头文件,但都没有效果.

奇怪的是,如果我创建一个Objective-C类,我就能够与API进行交互,而没有任何问题,所以这似乎是Swift独有的.

另外,如果有人能告诉我Swift中uint8_t digest[CC_SHA1_DIGEST_LENGTH]的类似功能是什么,我将非常感激

推荐答案

你可以用Swift .只需确保在Bridgeting Objective-C Bridgeting标题中添加#import <CommonCrypto/CommonHMAC.h>即可.

Update:对于Swift 4,请参阅使用Swift软件包管理器的更好解决方案:https://github.com/jernejstrasner/SwiftCrypto

enum Crypto算法rithm {
    case MD5, SHA1, SHA224, SHA256, SHA384, SHA512

    var HMAC算法rithm: CCHmac算法rithm {
        var result: Int = 0
        switch self {
        case .MD5:      result = kCCHmacAlgMD5
        case .SHA1:     result = kCCHmacAlgSHA1
        case .SHA224:   result = kCCHmacAlgSHA224
        case .SHA256:   result = kCCHmacAlgSHA256
        case .SHA384:   result = kCCHmacAlgSHA384
        case .SHA512:   result = kCCHmacAlgSHA512
        }
        return CCHmac算法rithm(result)
    }

    var digestLength: Int {
        var result: Int32 = 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)
    }
}

extension String {

    func hmac(algorithm: Crypto算法rithm, key: String) -> String {
        let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
        let strLen = Int(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
        let digestLen = algorithm.digestLength
        let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
        let keyStr = key.cStringUsingEncoding(NSUTF8StringEncoding)
        let keyLen = Int(key.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))

        CCHmac(algorithm.HMAC算法rithm, keyStr!, keyLen, str!, strLen, result)

        let digest = stringFromResult(result, length: digestLen)

        result.dealloc(digestLen)

        return digest
    }

    private func stringFromResult(result: UnsafeMutablePointer<CUnsignedChar>, length: Int) -> String {
        var hash = NSMutableString()
        for i in 0..<length {
            hash.appendFormat("%02x", result[i])
        }
        return String(hash)
    }

}

Swift相关问答推荐

在Swift中initt()完成后运行一个函数

如何在visionOS上删除PhotosPicker背景 colored颜色 ?

避免嵌套导航TabView

Swift:iVar + Equatable上的协议约束

通常从数组调用的SWIFT静态协议函数

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

Result类型的初始值设定项失败?

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

表视图插座单元测试失败

为什么 UITapGestureRecognizer 对于 Swift 集合视图中的单元格图像无法正常工作?

当字符串包含 \r\n 时,NSRegularExpression 不起作用

Swift 数组拆分成重叠的块

防止带有背景的文本扩展到 maxWidth

如何在 SWIFTUI 中旋转修剪?

如何更改 Picker 的边框 colored颜色

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

使 struct 可散列?

DispatchQueue:不能在非主线程上使用 asCopy = NO 调用

如何在 SwiftUI 中的一个视图上显示两个alert ?