Alamofire安全认证策略

作为一个有牌面的人, 肯定不只是学会怎么用它的方法就行了. 得建立起系统的知识体系.

那么我们就先来知道一下 HTTPS 以及加密的相关知识, 毕竟这也是面试比较常问到的点.

HTTP 与 HTTPS

HTTP 协议中,发送的内容是以明文的形式传递的。这就导致了以下几个 HTTP 的不足:

  • 参数, 头信息等全为明文内容,很容易被窃听
  • 不对双方的身份作验证,容易被伪装
  • 无法验证数据的完整性,数据容易被篡改

也就是说很容易会被抓包, cookie等问题.但通过 SSLSecure Socket Layer,安全套接层)或 TLSTransport Layer Security ,安全层传输协议)的组合使用,加密 HTTP 的通信内容。与 SSL 组合使用的 HTTP 被称为 HTTPSHTTP Secure,超文本传输安全协议)或 HTTP over SSL

HTTPS的特点
  • HTTPS 在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。

  • TLS / SSL 中使用了非对称加密,对称加密以及 HASH 算法。其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而 HASH 算法用于验证数据的完整性。

  • TLS 握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。

需要注意的是 HTTPS 并非是一种新的协议, 只是基于 HTTP 协议之上通信接口部分用 SSLTLS 协议代替而已。

HTTPS的执行过程
对称加密和非对称加密
  • 对称加密:

即加密的密钥和解密的密钥相同. 也就是所说的私钥加密, 信息的发送方和接收方使用同一个密钥去加密和解密数据。

  • 非对称加密

非对称加密将密钥分为公钥和私钥,公钥可以公开,私钥需要保密,客户端公钥加密的数据,服务端可以通过私钥来解密.

个人建议理解方法: 非对称性加密理解为锁是公开的. 任何人通过公钥把数据锁到里面, 只有服务器 (拥有私钥的人可以打开锁.)

HTTPS采用的加密方式

HTTPS 采用混合加密, 值得一提的是 SSL 使用的是非对称性加密.

SSL加密并不保护数据中心本身,而是确保了SSL加密设备的数据中心安全,可以监控企业中来往于数据中心的最终用户流量。

🙋‍♂️问: 为什么 HTTPS 采用混合加密的模式呢?为什么不全用公开密钥加密?

答: 因为非对称性加密效率低, 占用资源高, 但因其利用的往往是数学难题, 因此安全性更好。所以 HTTPS 充分利用两者优势,在交换秘钥环节使用公开密钥加密方式,之后的简历通信交换报文阶段则用时共享秘钥加密方式.


上图步骤一就是非对称性加密秘钥, 步骤二数据交互时采用对称性加密方式.
简单来说就是通过非对称性加密 加密一个随机数, 这个随机数为对称性加密的钥匙.

举个例子: AES256 对称性加密, 他有一个 key, 这个 key 我们使用 RSA 去加密, 那么就构成了上述这种结构, 通过非对称性加密去加密对称性加密的钥匙.

Alamofire中的安全认证

直接找 ServerTrustPolicy 文件.
步骤 1️⃣: ServerTrustPolicyManager 初始化创建了一个
[String:ServerTrustPolicy] 属性.
步骤 2️⃣: 找到 ServerTrustPolicy, 是一个枚举

public enum ServerTrustPolicy {
    case performDefaultEvaluation(validateHost: Bool)
    case performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags)
    case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)
    case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)
    case disableEvaluation
    case customEvaluation((_ serverTrust: SecTrust, _ host: String) -> Bool)
  • .performDefaultEvaluation 默认策略,只有合法证书才能通过验证

  • .performRevokedEvaluation 对注销证书做的一种额外设置

  • .pinCertificates 证书验证模式,代表客户端会将服务器返回的证书和本地保存的证书中的 所有内容 全部进行校验,如果正确,才继续执行。

pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)

参数1:certificates 证书
参数2:validateCertificateChain 代表是否验证证书链, false 则只验证根证书.
参数3:validateHost 代表是否验证子地址

使用 🌰:

let serverTrustPlolicies:[String: ServerTrustPolicy] = [
    hostUrl: .pinCertificates(
        certificates: ServerTrustPolicy.certificates(),
        validateCertificateChain: true,
        validateHost: true)
]
let sessionManger = SessionManager(serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPlolicies))

sessionManger.request(urlString).response { (defaultResponse) in
    print(defaultResponse)
}
  • .pinPublicKeys 公钥验证模式,代表客户端会将服务器返回的证书和本地保存的证书中的 PublicKey部分 进行校验,如果正确,才继续执行。
pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)

参数1: 第一个参数传公钥
参数2:validateCertificateChain 代表是否验证证书链, false 则只验证根证书.
参数3:validateHost 代表是否验证子地址

公钥验证模式的好处是,只要公钥不变,就可以一直使用,不用担心证书问题。

  • .disableEvaluation 该选项下验证一直都是通过的,无条件信任。

  • .customEvaluation 自定义验证,需要返回一个布尔类型的结果。


主要方法:

public func evaluate(_ serverTrust: SecTrust, forHost host: String) -> Bool

该方法是在 SessionDelegatedidReceive challenge 方法中调用的.


该类中还提供了一些辅助方法:

  • 读取证书
public static func certificates(in bundle: Bundle = Bundle.main) -> [SecCertificate] 

private func certificateData(for certificates: [SecCertificate]) -> [Data]

private func certificateData(for trust: SecTrust) -> [Data] 
  • 读取公钥
public static func publicKeys(in bundle: Bundle = Bundle.main) -> [SecKey]

private static func publicKeys(for trust: SecTrust) -> [SecKey] 

private static func publicKey(for certificate: SecCertificate) -> SecKey? 
  • 获取验证结果
private func trustIsValid(_ trust: SecTrust) -> Bool

以上就是 HTTPS 的流程以及 Alamofire 中安全验证流程. 总结完毕

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容