在swift中使用SHA512哈希字符串
任何人都知道如何在
swift中重现
PHP哈希方法哈希(‘SHA512’,$value,true)?我尝试使用此代码使用CommonCrypto C库:
extension String { func digest(length:Int32,gen:(data: UnsafePointer<Void>,len: CC_LONG,md: UnsafeMutablePointer<UInt8>) -> UnsafeMutablePointer<UInt8>) -> String { var cStr = [UInt8](self.utf8) var result = [UInt8](count:Int(length),repeatedValue:0) gen(data: &cStr,len: CC_LONG(cStr.count),md: &result) let output = NSMutableString(capacity:Int(length)) for r in result { output.appendFormat("%02x",r) } return String(output) } } 并像这样使用它: var digest = salted.digest(CC_SHA512_DIGEST_LENGTH,gen: {(data,len,md) in CC_SHA512(data,md)}) 但我没有得到正确的输出 编辑: 我有一些PHP代码: echo base64_encode(hash('sha512','8yOrBmkd',true)); // output: rlltLWeWaQCrfNTYMa0CcIs0mfLoHGAynrd+d8H65+rGAzHS/BSWsumwSmcxF9aAG9TIzXx+HOjArPyLL3herg== 我希望我的快速代码能够输出相同的代码. Base64编码没问题: let utf8str = input.dataUsingEncoding(NSUTF8StringEncoding)!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) let base64Encoded = utf8str!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) print("Encoded: (base64Encoded)") 但散列部分返回的输出与此PHP代码的值相同: echo base64_encode(hash('sha512',false)); // output: YWU1OTZkMmQ2Nzk2NjkwMGFiN2NkNGQ4MzFhZDAyNzA4YjM0OTlmMmU4MWM2MDMyOWViNzdlNzdjMWZhZTdlYWM2MDMzMWQyZmMxNDk2YjJlOWIwNGE2NzMxMTdkNjgwMWJkNGM4Y2Q3YzdlMWNlOGMwYWNmYzhiMmY3ODVlYWU=
Swift 3在底部实现.
代码不需要那么复杂或扩展: func sha512Hex(string string: String) -> String { var digest = [UInt8](count: Int(CC_SHA512_DIGEST_LENGTH),repeatedValue: 0) if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { CC_SHA512(data.bytes,CC_LONG(data.length),&digest) } var digestHex = "" for index in 0..<Int(CC_SHA512_DIGEST_LENGTH) { digestHex += String(format: "%02x",digest[index]) } return digestHex } //测试: let hexDigest = sha512Hex(string:"8yOrBmkd") print("hexDigest:n(hexDigest)") 输出:
只需返回字节数组: func sha512(string string: String) -> [UInt8] { var digest = [UInt8](count: Int(CC_SHA512_DIGEST_LENGTH),repeatedValue: 0) let data = string.dataUsingEncoding(NSUTF8StringEncoding)! CC_SHA512(data.bytes,&digest) return digest } //测试: let digestRaw = sha512(string:"8yOrBmkd") print("decimal array:n(digestRaw)") print("hexadecimal:n(NSData(bytes:digestRaw,length:digestRaw.count).description)") 输出:
Base64输出: func sha512Base64(string string: String) -> String { let digest = NSMutableData(length: Int(CC_SHA512_DIGEST_LENGTH))! if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { CC_SHA512(data.bytes,UnsafeMutablePointer<UInt8>(digest.mutableBytes)) } return digest.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([])) } //测试: let digestBase64 = sha512Base64(string:"8yOrBmkd") print("Base64:n(digestBase64)") 输出: Base64编码:
func hashSHA512(data:Data) -> String? { var hashData = Data(count: Int(CC_SHA512_DIGEST_LENGTH)) _ = hashData.withUnsafeMutableBytes {digestBytes in data.withUnsafeBytes {messageBytes in CC_SHA512(messageBytes,CC_LONG(data.count),digestBytes) } } // For hexadecimal output: return hashData.map { String(format: "%02hhx",$0) }.joined() // For Base64 output use this instead of the above: // return data.base64EncodedString() } 不推荐使用的文档部分示例: HMAC与MD5,SHA1,SHA224,SHA256,SHA384,SHA512(Swift 3)
name参数将散列函数名称指定为String 此示例需要Common Crypto 这些函数采用哈希名称,要散列的消息,密钥并返回摘要: hashName: name of a hash function as String message: message as Data key: key as Data returns: digest as Data func hmac(hashName:String,message:Data,key:Data) -> Data? { let algos = ["SHA1": (kCCHmacAlgSHA1,CC_SHA1_DIGEST_LENGTH),"MD5": (kCCHmacAlgMD5,CC_MD5_DIGEST_LENGTH),"SHA224": (kCCHmacAlgSHA224,CC_SHA224_DIGEST_LENGTH),"SHA256": (kCCHmacAlgSHA256,CC_SHA256_DIGEST_LENGTH),"SHA384": (kCCHmacAlgSHA384,CC_SHA384_DIGEST_LENGTH),"SHA512": (kCCHmacAlgSHA512,CC_SHA512_DIGEST_LENGTH)] guard let (hashAlgorithm,length) = algos[hashName] else { return nil } var macData = Data(count: Int(length)) macData.withUnsafeMutableBytes {macBytes in message.withUnsafeBytes {messageBytes in key.withUnsafeBytes {keyBytes in CCHmac(CCHmacAlgorithm(hashAlgorithm),keyBytes,key.count,messageBytes,message.count,macBytes) } } } return macData } hashName: name of a hash function as String message: message as String key: key as String returns: digest as Data func hmac(hashName:String,message:String,key:String) -> Data? { let messageData = message.data(using:.utf8)! let keyData = key.data(using:.utf8)! return hmac(hashName:hashName,message:messageData,key:keyData) } hashName: name of a hash function as String message: message as String key: key as Data returns: digest as Data func hmac(hashName:String,key:Data) -> Data? { let messageData = message.data(using:.utf8)! return hmac(hashName:hashName,key:key) } // 例子 let clearString = "clearData0123456" let keyString = "keyData8901234562" let clearData = clearString.data(using:.utf8)! let keyData = keyString.data(using:.utf8)! print("clearString: (clearString)") print("keyString: (keyString)") print("clearData: (clearData as NSData)") print("keyData: (keyData as NSData)") let hmacData1 = hmac(hashName:"SHA1",message:clearData,key:keyData) print("hmacData1: (hmacData1! as NSData)") let hmacData2 = hmac(hashName:"SHA1",message:clearString,key:keyString) print("hmacData2: (hmacData2! as NSData)") let hmacData3 = hmac(hashName:"SHA1",key:keyData) print("hmacData3: (hmacData3! as NSData)") 输出: clearString: clearData0123456 keyString: keyData8901234562 clearData: <636c6561 72446174 61303132 33343536> keyData: <6b657944 61746138 39303132 33343536 32> hmacData1: <bb358f41 79b68c08 8e93191a da7dabbc 138f2ae6> hmacData2: <bb358f41 79b68c08 8e93191a da7dabbc 138f2ae6> hmacData3: <bb358f41 79b68c08 8e93191a da7dabbc 138f2ae6> MD2,MD4,MD5,SHA512(Swift 3)
name参数将散列函数名称指定为String 此函数将哈希名称和字符串进行哈希处理并返回一个数据: name: A name of a hash function as a String string: The String to be hashed returns: the hashed result as Data func hash(name:String,string:String) -> Data? { let data = string.data(using:.utf8)! return hash(name:name,data:data) } 例子: let clearString = "clearData0123456" let clearData = clearString.data(using:.utf8)! print("clearString: (clearString)") print("clearData: (clearData as NSData)") let hashSHA256 = hash(name:"SHA256",string:clearString) print("hashSHA256: (hashSHA256! as NSData)") let hashMD5 = hash(name:"MD5",data:clearData) print("hashMD5: (hashMD5! as NSData)") 输出: clearString: clearData0123456 clearData: <636c6561 72446174 61303132 33343536> hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a> hashMD5: <4df665f7 b94aea69 695b0e7b baf9e9d6> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |