我正在尝试使用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 可选值
为什么会这样?我该怎么解决?
答案 0 :(得分:1)
发生崩溃是因为您无法从加密的String
创建Data
。您必须使用base64
或hex
表示形式。
此代码创建一个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
}