对称加密
对称加密意思就是加密与解密使用的是同一把秘钥且只有一个秘钥, 叫做私钥. 常见的对称加密有DES, 3DES, AES等
非对称加密
加密与解密使用的是不同的秘钥, 一把公钥, 一把私钥, 公钥加密的信息只有对应的私钥才能解密, 私钥加密的信息只有对应的公钥才能解密
常见是非对称加密如RSA(支付包使用的加密), ECC等
对称加密效率要明显高于非对称加密, 在秘钥管理以及通讯时, 秘钥交换的安全性不能保障, 大多数情况会混合进行使用.
https协议就是结合对称加密与非对称加密进行通讯.
先看看https协议需要的数字证书结构
对称加密效率要明显高于非对称加密, 在秘钥管理以及通讯时, 秘钥交换的安全性不能保障, 大多数情况会混合进行使用.
数字证书是由CA机构所签发的,签发数字证书时,申请者会产生一对公钥和私钥, 私钥自己存储, 公钥和网站域名等相关信息经过哈希算函数生成信息摘要, 有公信力的认证中心CA用它的私钥对摘要信息进行加密生成数字证书, CA在审核了用户身份后结合公钥与数字签名一同制作出一张数字签名证书并公布在互联网上。
客户端拿到证书开始验证签名:
- 当开始通讯的时候, 客户端向服务器发出加密请求
- 服务器返回自己的CA证书
- 客户端会按照下边的流程验证. 客户端会存有受信人的根证书颁发机构的列表, 去找对应机构的公钥
- 使用公钥对证书中的数字签名进行解密, 因为数组签名之前是由CA机构使用自己的私钥加密而成的, 所以对应的公钥可以解密数字证书, 得到原始摘要信息. 客户端继续使用相同的散列算法计算”网站,公钥等信息”的哈希值. 最后判断两处的哈希值是否一致来判断信息是否被篡改.
由于非对称加密相对来说比较慢, 效率不高, 对称加密效率较高, HTTPS协议是结合两种加密方式进行通讯的, 使用非对称加密来安全的分发公钥. 然后传递对称加密的秘钥, 最后使用对称加密处理信息.
也就是只利用RSA传输密钥,保证密钥的安全。然后利用对称加密进行信息传输
哈希函数
哈希函数,又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表
数字签名,就是对数据的哈希值进行非对称加密,即对数据的哈希值使用私钥进行数据加密。
数字证书是由CA机构所签发的,签发数字证书时,申请者会产生一对公钥和私钥,然后把公钥发送给CA,CA在审核了用户身份后结合公钥一同制作出一张数字签名证书并公布在互联网上。
iOS 中常用加密算法
MD5
let text = "this is a test message"
let text_c = text.cString(using: .utf8) //convert to C string
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 16)
CC_MD5(text_c, CC_LONG(strlen(text_c!)), buffer) // md5
var md5String_16 = NSMutableString.init()
var md5String_32 = NSMutableString.init()
// 16位MD5 取中间段
for x in 4..<12{
md5String_16.appendFormat("%02x", buffer[x])
}
print(md5String_16) //e04ac9a8b461f9f3
// 32位MD5
for x in 0..<Int(CC_MD5_DIGEST_LENGTH){
md5String_32.appendFormat("%02x", buffer[x])
}
print(md5String_32) //905ed04ee04ac9a8b461f9f3b10eec6d
base64
// "my name is dany." --> "bXkgbmFtZSBpcyBkYW55Lg=="
print("native string is: my name is dany.")
let nativeString = "my name is dany."
let data = nativeString.data(using: .utf8)
var base64 = data?.base64EncodedString()
print(base64!) //bXkgbmFtZSBpcyBkYW55Lg==
print(base64!.count) //24
base64 = base64?.replacingOccurrences(of: "=", with: "")
print(base64!) //bXkgbmFtZSBpcyBkYW55Lg
var complete64 = base64!
if base64!.count % 4 != 0{
// 在iOS base64解码的时候, 原始字符串长度必须是4的倍数, 否则需要补"=" 为4的倍数为止
let remainder = base64!.count % 4
for _ in 0..<(4-remainder) {
complete64.append("=")
}
}
let base64Data = Data.init(base64Encoded: complete64, options: Data.Base64DecodingOptions.init(rawValue: 0))
let finalString = String.init(data: base64Data!, encoding: .utf8)
print(finalString!) //my name is dany.
sha256
// test sha256 for "my name is daany."
let text = "my name is dany."
let text_c = text.cString(using: .utf8)
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: Int(CC_SHA256_DIGEST_LENGTH))
CC_SHA256(text_c!, CC_LONG(strlen(text_c!)), buffer)
let result = NSMutableString.init()
for x in 0..<Int(CC_SHA256_DIGEST_LENGTH){
result.appendFormat("%02x", buffer[x])
}
print(result)