【问题标题】:Sha 256 Encryption syntax error in swift 3.0swift 3.0 中的 Sha 256 加密语法错误
【发布时间】:2016-10-07 15:42:21
【问题描述】:
    func SHA256() -> String {

    let data = self.data(using: String.Encoding.utf8)
    let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))
    CC_SHA256((data! as NSData).bytes, CC_LONG(data!.count), UnsafeMutablePointer(res!.mutableBytes))
    let hashedString = "\(res!)".replacingOccurrences(of: "", with: "").replacingOccurrences(of: " ", with: "")
    let badchar: CharacterSet = CharacterSet(charactersIn: "\"<\",\">\"")
    let cleanedstring: String = (hashedString.components(separatedBy: badchar) as NSArray).componentsJoined(by: "")
    return cleanedstring

}

我正在使用这个函数来加密它在 swift 2 中运行良好的字符串, 现在它不能在 swift 3.0 中工作

【问题讨论】:

标签: ios xcode swift3


【解决方案1】:

完美解决方案 Swift 3+:

 extension String {

    // MARK: - SHA256
    func get_sha256_String() -> String {
        guard let data = self.data(using: .utf8) else {
            print("Data not available")
            return ""
        }
        return getHexString(fromData: digest(input: data as NSData))
    }

    private func digest(input : NSData) -> NSData {
        let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
        var hashValue = [UInt8](repeating: 0, count: digestLength)
        CC_SHA256(input.bytes, UInt32(input.length), &hashValue)
        return NSData(bytes: hashValue, length: digestLength)
    }

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

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

使用方法:

let desiredSHA256 = "yourString".get_sha256_String()

【讨论】:

    【解决方案2】:
    func sha256(string: String) -> Data? {
        guard let messageData = string.data(using:String.Encoding.utf8) else { return nil; }
       var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
    
        _ = digestData.withUnsafeMutableBytes {digestBytes in
            messageData.withUnsafeBytes {messageBytes in
                CC_SHA256(messageBytes, CC_LONG(messageData.count), digestBytes)
            }
        }
        return digestData
    }
    

    例子:

    let testString = "sha me"
    print("testString: \(testString)")
    let shaData = sha256(string: testString)
    let shaHex = shaData!.map { String(format: "%02hhx", $0) }.joined()
    print("shaHex: \(shaHex)")
    

    输出:

    testString: sha me
    shaData: a60e0eee 30a3a4f1 c4f8b93f 16ad22cb 0339447b 1653f331 edbda55f eee00789
    

    新功能是 .withUnsafeMutableBytes 闭包。

    【讨论】:

      【解决方案3】:
      func SHA256() -> String {
      
          let data = self.data(using: String.Encoding.utf8)
          let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))
          CC_SHA256(((data! as NSData)).bytes, CC_LONG(data!.count), res?.mutableBytes.assumingMemoryBound(to: UInt8.self))
          let hashedString = "\(res!)".replacingOccurrences(of: "", with: "").replacingOccurrences(of: " ", with: "")
          let badchar: CharacterSet = CharacterSet(charactersIn: "\"<\",\">\"")
          let cleanedstring: String = (hashedString.components(separatedBy: badchar) as NSArray).componentsJoined(by: "")
          return cleanedstring
      
      }
      

      替换了 CC_SHA256((data! as NSData).bytes, CC_LONG(data!.count), UnsafeMutablePointer(res!.mutableBytes))

      【讨论】:

      • 请格式化您的代码,尤其是在将其添加到网站时。这只是不可读、执行不力的文本代码墙。 ...这是做什么的....replacingOccurrences(of: "", with: "")?
      • Use of unresolved identifier 'CC_SHA256_DIGEST_LENGTH' Use of unresolved identifier 'CC_SHA256' 这些错误显示给我
      • @RajAnjana 这是 Swift,而不是 Objective-C。
      • @Alejandro Iván - 是的,我接受了。但等效的标题不存在。所以我只是将该标题导入到我的 Bridge 文件中。只有它对我有用之后
      猜你喜欢
      • 2019-02-24
      • 2014-07-16
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2017-03-02
      • 1970-01-01
      相关资源
      最近更新 更多