出乎意料的零散列密码

Unexpectedly nil hashing a password

我正在尝试使用 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([=10=], 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! 行中出现以下错误:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

为什么会这样?我该如何解决?

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

将 return 为 nil 值,并且您在 getHashedPassword 方法中使用 return hash! 常量末尾的 return hash! 感叹号强制编译一个值。

您可以通过接受可选值

修改 getHashedPassword 方法来修复它

例如:

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

发生崩溃是因为您无法从加密的 Data 创建 String。您必须使用 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([=10=], 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", [=10=]) }.joined()
    }
}

CryptoHandler.getHashedPassword(pwd:"0123456789")