【问题标题】:SHA256 in Swift - Importing framework issueSwift 中的 SHA256 - 导入框架问题
【发布时间】:2014-12-14 12:06:26
【问题描述】:

我正在尝试在 Swift 中的一个函数中使用 CC_SHA256_DIGEST_LENGTH,但它会引发错误,因为它找不到该符号。我已经尝试了所有方法,在桥头文件中导入 CommonCrypto 并尝试使用 .map 解决方案。没有任何效果。

如何在 Swift 中使用 CC_SHA256_DIGEST_LENGTH?所有解决方案似乎都已停止工作。 谢谢!

【问题讨论】:

  • 在问题中包含问题代码和准确完整的错误消息总是有帮助的。
  • 在这种情况下,框架版本也会很好。

标签: ios security swift


【解决方案1】:

将以下行添加到您的桥接头:
#import <CommonCrypto/CommonHMAC.h>

Swift 2.x 示例:

func doSha256(#dataIn:NSData) -> NSData {
    var shaOut: NSMutableData! = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH));
    CC_SHA256(dataIn.bytes, CC_LONG(dataIn.length), UnsafeMutablePointer<UInt8>(shaOut.mutableBytes));

    return shaOut;
}

Swift 3.0 示例:

func hashSHA256(data:Data) -> Data? {
    var hashData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
    _ = hashData.withUnsafeMutableBytes {digestBytes in
        data.withUnsafeBytes {messageBytes in
            CC_SHA256(messageBytes, CC_LONG(data.count), digestBytes)
        }
    }
    return hashData
}

let clearData   = "clearData0123456".data(using:String.Encoding.utf8)!
print("clearData: \(clearData.map { String(format: "%02hhx", $0) }.joined())")

let hash = hashSHA256(data:clearData)
print("hash: \(hash!.map { String(format: "%02hhx", $0) }.joined())")

输出:

clearData:636c6561724461746130313233343536
哈希:aabc766b6b357564e41f4f912d494bccbfa16924b574abbdba9e3e9da0c8920a

我没有在目标构建阶段中添加任何框架。
您确定桥接头设置正确吗?我通过添加一个 .m 文件来添加我的,并让系统自动添加桥接头并更新任何目标设置。

从废止文档部分移出的通用哈希方法:

此函数采用哈希名称和要哈希的数据并返回一个数据:

name:哈希函数的名称,作为字符串 data:要散列的数据 返回:作为数据的散列结果
func hash(name:String, data:Data) -> Data? {
    let algos = ["MD2":    (CC_MD2,    CC_MD2_DIGEST_LENGTH),
                 "MD4":    (CC_MD4,    CC_MD4_DIGEST_LENGTH),
                 "MD5":    (CC_MD5,    CC_MD5_DIGEST_LENGTH),
                 "SHA1":   (CC_SHA1,   CC_SHA1_DIGEST_LENGTH),
                 "SHA224": (CC_SHA224, CC_SHA224_DIGEST_LENGTH),
                 "SHA256": (CC_SHA256, CC_SHA256_DIGEST_LENGTH),
                 "SHA384": (CC_SHA384, CC_SHA384_DIGEST_LENGTH),
                 "SHA512": (CC_SHA512, CC_SHA512_DIGEST_LENGTH)]
    guard let (hashAlgorithm, length) = algos[name]  else { return nil }
    var hashData = Data(count: Int(length))

    _ = hashData.withUnsafeMutableBytes {digestBytes in
        data.withUnsafeBytes {messageBytes in
            hashAlgorithm(messageBytes, CC_LONG(data.count), digestBytes)
        }
    }
    return hashData
}

注意:MD2、MD4、MD5 和 SHA1 不应在新工作中使用,它们对于消息摘要的使用不再安全。

【讨论】:

  • 仍然收到错误“使用未解析的标识符 'CC_SHA256_DIGEST_LENGTH'”以及 CC_LONG 和 CC_SHA256 的相同错误。我在桥头文件中有 CommonCrypto 导入。我需要在项目中添加任何框架吗?无法让它工作:(
  • 终于!问题是当我导入 .m 文件以生成桥接头时,其中一个目标没有被勾选。感谢您的帮助!
  • @Panda 感谢您找到日落文档部分的链接。我已将其添加到答案中。
  • 在 Swift 4.X 中 "import CommonCrypto" 不是 #import
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2011-07-24
相关资源
最近更新 更多