出乎意料的是没有对密码进行哈希处理

时间:2018-08-03 11:20:20

标签: swift sha256

我正在尝试使用SHA256方法对密码进行哈希处理:

class CryptoHandler {

    static func sha256(_ str: String) -> String? {
        let data = str.data(using: String.Encoding.utf8)
        let shaData = sha256(data!)
        let rc = String(data: shaData, encoding: String.Encoding.utf8) as String?
        return rc
    }

     static func sha256(_ data: Data) -> Data { var res = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)); data.withUnsafeBytes { _ = CC_SHA256($0, CC_LONG(data.count), &res) }; return Data(bytes: res) }


    static func getHashedPassword (pwd: String) -> String{
        let hash = sha256(pwd)
        return hash!
    }
}

当我尝试执行getHashedPassword ("0123456789")时,在return hash!行中出现以下错误:

  

线程1:致命错误:展开包装时意外发现nil   可选值

为什么会这样?我该怎么解决?

2 个答案:

答案 0 :(得分:1)

发生崩溃是因为您无法从加密的String创建Data。您必须使用base64hex表示形式。

此代码创建一个hex编码的字符串,并且根本不使用可选参数。

class CryptoHandler {

    static func sha256(_ str: String) -> String {
        let data = Data(str.utf8)
        let shaData = sha256(data)
        return shaData.hexString
    }

    static func sha256(_ data: Data) -> Data {
        var res = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH));
        data.withUnsafeBytes { _ = CC_SHA256($0, CC_LONG(data.count), &res) };
        return Data(bytes: res)
    }

    static func getHashedPassword (pwd: String) -> String{
        let hash = sha256(pwd)
        return hash
    }
}

extension Data {
    var hexString : String {
        return self.map{ String(format:"%02x", $0) }.joined()
    }
}

CryptoHandler.getHashedPassword(pwd:"0123456789")

答案 1 :(得分:0)

let rc = String(data: shaData, encoding: String.Encoding.utf8) as String?

将返回nil值,并且您将强制使用return hash!方法中的hash常量结尾处的getHashedPassword感叹号来编译值。

您可以通过接受可选值来修改getHashedPassword方法来解决此问题

例如:

static func getHashedPassword (pwd: String) -> String? 
{
   let hash = sha256(pwd)
   return hash 
}