簡體   English   中英

Swift中的SHA256 - 導入框架問題

[英]SHA256 in Swift - Importing framework issue

我試圖在Swift中的一個函數中使用CC_SHA256_DIGEST_LENGTH,它會拋出一個錯誤,因為它無法找到該符號。 我已經嘗試了一切,在橋頭中導入CommonCrypto並嘗試使用.map解決方案。沒有任何作用。

如何在Swift中使用CC_SHA256_DIGEST_LENGTH? 所有解決方案似乎都停止了工作。 謝謝!

將以下行添加到橋接標頭:
#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

我沒有在目標Build Phases中添加任何框架。
你確定橋接頭設置正確嗎? 我通過添加.m文件添加了我的內容,讓系統自動添加橋接頭並更新任何目標設置。

從日落文檔部分移動的常規哈希方法:

此函數采用哈希名稱和數據進行哈希處理並返回數據:

name: A name of a hash function as a String  
data: The Data to be hashed  
returns: the hashed result as 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 BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM