美文网首页
swift 加密

swift 加密

作者: AgoniNemo | 来源:发表于2017-08-28 11:44 被阅读200次
pic.jpg

前言

好些时间没有更新了,最近在用swift的vapor框架来做server,项目已经完成了大部分,可以上线了,也就整理下在项目中遇到的问题。

正文

相信现在(时间:2017.8.28)大多数的swift 项目的加密都是用到CommonCrypto这个库,但在使用swift build命令编译时,会报错,说找不到里面函数,面对这样的问题首先google看看有没有解决的方法。在google了一天后,果断放弃。从根本出发,google下看看有什么第三方的swift库,结果还真找到了一个swift的加密框架----CryptoSwift
这个库可以使用HMAC MD5, SHA1, SHA256等等。这个使用字节数组(Array <UInt8>)作为所有操作的基础类型(也就是说入参与返回值大多数都是字节数组)。当然,也提供了一些比较方便的api给你调用,但是这些api的内部也是转换为字节数组来进行操作的,具体安装方法就不说了,下面就说说使用。

具体使用

// md5 加密(字符串)
let hash = "加密字符".md5()

// md5 加密(字体数组)
let bytes:Array<UInt8> = [0x01, 0x02, 0x03]
// 返回的类型为字体数组,这个库基本的数组类型都有做扩展
let digest = input.md5()

// HMAC 加密(示例为:SHA1),先把密钥和消息给转换成字节数组
let key:Array<UInt8> = Array("based".utf8);
let value:Array<UInt8> = Array("message".utf8);

do {
// variant为加密方式,有sha1, sha256, sha384, sha512, md5可以选择
    let h = try HMAC(key: key, variant: .sha1).authenticate(value)
    let result = h.toBase64()
    debugPrint(result as Any);
} catch{
    debugPrint(error)
}


最后贴上CommonCrypto的文件

先要创建Bridging文件,过程可以看这里。在头文件里导入两个库#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonHMAC.h>,再创建一个swift 文件,复制下面的代码即可

import Foundation
enum HMACAlgorithm {
    case MD5, SHA1, SHA224, SHA256, SHA384, SHA512
    
    func toCCHmacAlgorithm() -> CCHmacAlgorithm {
        var result: Int = 0
        switch self {
        case .MD5:
            result = kCCHmacAlgMD5
        case .SHA1:
            result = kCCHmacAlgSHA1
        case .SHA224:
            result = kCCHmacAlgSHA224
        case .SHA256:
            result = kCCHmacAlgSHA256
        case .SHA384:
            result = kCCHmacAlgSHA384
        case .SHA512:
            result = kCCHmacAlgSHA512
        }
        return CCHmacAlgorithm(result)
    }
    
    func digestLength() -> Int {
        var result: CInt = 0
        switch self {
        case .MD5:
            result = CC_MD5_DIGEST_LENGTH
        case .SHA1:
            result = CC_SHA1_DIGEST_LENGTH
        case .SHA224:
            result = CC_SHA224_DIGEST_LENGTH
        case .SHA256:
            result = CC_SHA256_DIGEST_LENGTH
        case .SHA384:
            result = CC_SHA384_DIGEST_LENGTH
        case .SHA512:
            result = CC_SHA512_DIGEST_LENGTH
        }
        return Int(result)
    }
}

extension String {

    func hmac(algorithm: HMACAlgorithm, key: String) -> String {
        let cKey = key.cString(using: String.Encoding.utf8)
        let cData = self.cString(using: String.Encoding.utf8)
        var result = [CUnsignedChar](repeating: 0, count: Int(algorithm.digestLength()))
        CCHmac(algorithm.toCCHmacAlgorithm(), cKey!, Int(strlen(cKey!)), cData!, Int(strlen(cData!)), &result)
        
        let hmacData = Data.init(bytes: result, count: (Int(algorithm.digestLength())));
        let hmacBase64 = hmacData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength76Characters)
        
        return String(hmacBase64)
    }
    func md5() -> String {
        
        let str = self.cString(using: String.Encoding.utf8)
        let strLen = CUnsignedInt(self.lengthOfBytes(using: String.Encoding.utf8))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        
        for i in 0 ..< digestLen {
            hash.appendFormat("%02x", result[i])
        }
        result.deinitialize()
        
        return String(format: hash as String)
        
    }
}

使用方法

// md5 加密
let hash = "based".md5()

// HMAC 加密(示例为:SHA1)有MD5, SHA1, SHA224, SHA256, SHA384, SHA512可以选择
let hash ="message".hmac(algorithm: HMACAlgorithm.SHA1, key: "based")

结尾

就说一些比较常用的加密方式,如果还有不懂的童鞋可以去点击这里进行查看相关的api。如果还有不明白的可以在下方留言。

相关文章

  • 最近用到的一些String的一些常用方法

    string的Base64加密/解密 oc 加密 oc解密 swift 加密 swift 解密 oc字典转jso...

  • swift 加密

    前言 好些时间没有更新了,最近在用swift的vapor框架来做server,项目已经完成了大部分,可以上线了,也...

  • 开源框架 RSA_Swift

    RSA_Swift RSA_Swift 是一款轻量级的 Swift 版本的框架,框架功能包括:RSA 加密/解密字...

  • AES 加密

    使用Swift原生进行AES加密处理: 一、导入: 二、 使用方法: 三、打印结果: 四、加密代码

  • swift实现字符串的MD5加密

    (1)自定义swift文件StringHelper.swift (2)字符串的MD5加密测试 结果:

  • iOS开发笔记-85:AES加密

    OC: [AES128CBC_PKCS5] swift:[CryptoSwift 多种加密方式]

  • RSA 加密

    使用Swift原生进行RSA加密处理: 一、导入: 二、 使用方法: 三、打印结果: 四、加密代码 转载自[htt...

  • swift 3.0 加密

    加密算法的类别 线性散列加密(MD5):只生成一串不可逆的密文,经常用其效验数据传输过程中是否经过修改,因为相同的...

  • Swift加密笔记

    摘要: https://github.com/SwiftP2P/SwiftSSL https://github.c...

  • Swift5加密解密RSA算法

    Swift5加密解密RSA算法适配 https://github.com/StevenGardnerGMJ/GMJ...

网友评论

      本文标题:swift 加密

      本文链接:https://www.haomeiwen.com/subject/nsbwdxtx.html