學(xué)習(xí)路線(內(nèi)部分享內(nèi)容)
- 加密解密(對稱加密、非對稱加密呀袱、混合加密)
- 單向散列函數(shù)
- 數(shù)字簽名
- 證書
- iOS簽名機(jī)制
參考資料與圖片來源:
《圖解密碼技術(shù)第三版》
iOS App 簽名的原理
Apple簽名機(jī)制官方指南
深入理解代碼簽名機(jī)制
1. 加密解密
為什么需要加密贸毕?
對稱加密
-
什么是對稱加密?
- 就是指加密和解密時(shí)使用的密鑰都是同一個(gè)夜赵,是“對稱”的明棍。
- 常見算法:
- DES(數(shù)據(jù)加密標(biāo)準(zhǔn),Data Encryption Standard)<不安全>
- 3DES(3次DES加密解密)<不安全寇僧,性能不好>
- AES(高級加密標(biāo)準(zhǔn)摊腋,Advanced Encryption Standard)<安全、目前首選>
- 存在密鑰配送問題:
- 對稱加密看上去好像完美地實(shí)現(xiàn)了機(jī)密性嘁傀,但其中有一個(gè)很大的問題:如何把密鑰安全地傳遞給對方兴蒸,術(shù)語叫“密鑰交換”,因?yàn)橹型居锌赡鼙缓诳蛿r截细办,黑客知道了密鑰橙凳,那就能解密,也不安全笑撞。
- 如何解決密鑰配送問題:
- 事先共享密鑰(線下安全方式)
- 密鑰分配中心
- Diffie-Hellman密鑰交換算法
- 非對稱加密(公鑰密碼)
非對稱加密 (也叫 公鑰密碼加密)
非對稱加密代表加密和解密使用不同的密鑰岛啸。具體的加解密過程就是,由發(fā)送方生成一對公鑰與私鑰娃殖,公鑰可以公開給所有發(fā)送方值戳,私鑰自己保存。發(fā)送方使用公鑰對信息進(jìn)行加密炉爆,接收方收到密文后,使用私鑰進(jìn)行解密即可
- 加密密鑰,一般是公開的芬首,因此該密鑰稱為公鑰(public key)
- 解密密鑰赴捞,由消息接收者自己保管的,不能公開郁稍,因此也稱為私鑰(private key)
- 公鑰和私鑰是一 一對應(yīng)的赦政,是不能單獨(dú)生成的,一對公鑰和密鑰統(tǒng)稱為密鑰對(key pair)
- 由公鑰加密的密文耀怜,必須使用與該公鑰對應(yīng)的私鑰才能解密
-
由私鑰加密的密文恢着,必須使用與該私鑰對應(yīng)的公鑰才能解密
- 常用算法:
- RSA(RSA 加密算法,RSA Algorithm)
- RSA 的數(shù)學(xué)難題是:兩個(gè)大質(zhì)數(shù) p财破、q 相乘的結(jié)果 n 很容易計(jì)算掰派,但是根據(jù) n 去做質(zhì)因數(shù)分解得到 p、q左痢,則需要很大的計(jì)算量靡羡。RSA 是比較經(jīng)典的非對稱加密算法,它的主要優(yōu)勢就是性能比較快俊性,但想獲得較高的加密強(qiáng)度略步,需要使用很長的密鑰。
- ECC(橢圓加密算法定页,Elliptic Curve Cryptography)
- ECC 是基于橢圓曲線的一個(gè)數(shù)學(xué)難題設(shè)計(jì)的趟薄。目前學(xué)術(shù)界普遍認(rèn)為,橢圓曲線的難度高于大質(zhì)數(shù)難題典徊,160 位密鑰的 ECC 加密強(qiáng)度竟趾,相當(dāng)于 1088 位密鑰的 RSA,比 RSA 所需的密鑰長度短宫峦。ECC 是目前國際上加密強(qiáng)度最高的非對稱加密算法岔帽。
- RSA(RSA 加密算法,RSA Algorithm)
- 存在問題:
- 公鑰密碼雖然解決了密鑰配送的問題,但是存在以下問題:1导绷、性能問題犀勒,處理速度不到對稱加密的十分之一(使用混合加密的方式解決);2妥曲、公鑰認(rèn)證問題(證書技術(shù))
混合加密(HTTPS中SSL/TLS使用這種方式)
- 加密步驟(發(fā)送消息)
- 首先贾费,消息發(fā)送者要擁有消息接收者的公鑰
- 生成會(huì)話密鑰,作為對稱密碼的密鑰檐盟,加密消息
- 用消息接收者的公鑰褂萧,加密會(huì)話密鑰
- 將前2步生成的加密結(jié)果,一并發(fā)給消息接收者
會(huì)話密鑰(session key)
為本次通信隨機(jī)生成的臨時(shí)密鑰(偽隨機(jī)數(shù)生成器)
作為對稱密碼的密鑰葵萎,用于加密消息导犹,提高速度
- 發(fā)送出去的內(nèi)容包括
- 用會(huì)話密鑰加密的消息(加密方法:對稱密碼)
-
用公鑰加密的會(huì)話密鑰(加密方法:公鑰密碼)
- 解密步驟(收到消息)
- 消息接收者用自己的私鑰解密出會(huì)話密鑰
-
再用第1步解密出來的會(huì)話密鑰唱凯,解密消息
2. 單向散列函數(shù)(消息摘要函數(shù)、指紋谎痢、哈希函數(shù))
-
單向函數(shù)(One-way Function)是正向計(jì)算容易磕昼,逆向運(yùn)算困難的函數(shù)。也就是說节猿,給定你一個(gè)輸入票从,你很容易計(jì)算出輸出;但是給定你一個(gè)輸出滨嘱,你卻很難計(jì)算出輸入是什么峰鄙。顧名思義,滿足“單向”和“散列”的特性
- 特點(diǎn)
- 正向計(jì)算容易太雨,逆向運(yùn)算困難
- 運(yùn)算結(jié)果均勻分布吟榴,構(gòu)造碰撞困難(已知源數(shù)據(jù)和散列值,想找到一個(gè)具有相同值得數(shù)據(jù)非常困難)
- 給定的數(shù)據(jù)散列值是確定的躺彬,長度是固定的
- 常用算法
- MD5(消息摘要算法煤墙,Message-Digest Algorithm 5)(不安全了)
- SHA(安全散列算法,Secure Hash Algorithm)<目前流行SHA-256宪拥、SHA-384仿野、SHA-512>
- 解決什么問題?(應(yīng)用場景)
-
防止數(shù)據(jù)被篡改(校驗(yàn)數(shù)據(jù)完整性)
- 口令密碼(密碼為散列值存儲而非明文存儲)
-
3. 數(shù)字簽名
-
基本概念
- 數(shù)字簽名是解決如何能證明數(shù)據(jù)內(nèi)容沒有竄改她君,防止抵賴脚作。
-
數(shù)字簽名的實(shí)現(xiàn)原理
- 把公鑰私鑰的用法反過來,之前是公鑰加密缔刹、私鑰解密球涛,現(xiàn)在是私鑰加密、公鑰解密校镐。
- 因?yàn)樗借€只有消息發(fā)送者擁有亿扁,公鑰任何人都有消息接收者也有。
- 用公鑰解密后比對一致就沒有被篡改
-
在數(shù)字簽名技術(shù)中鸟廓,有以下2種行為
- 生成簽名:由消息的發(fā)送者完成从祝,通過“簽名密鑰”生成
- 驗(yàn)證簽名:由消息的接收者完成,通過“驗(yàn)證密鑰”驗(yàn)證
-
簽名過程圖
-
存在問題(無法解決的問題)
要正確使用簽名引谜,前提是用于驗(yàn)證簽名的公鑰必須屬于真正的發(fā)送者
-
如果遭遇了中間人攻擊牍陌,那么公鑰將是偽造的,數(shù)字簽名將失效
-
所以在驗(yàn)證簽名之前员咽,首先得先驗(yàn)證公鑰的合法性(真實(shí)性毒涧,沒被中間人攻擊)
- 使用證書技術(shù)
4. 數(shù)字證書和CA
-
公鑰證書(Public-Key Certificate,PKC)記錄著個(gè)人信息(姓名贝室、組織契讲、郵箱地址等個(gè)人信息)和個(gè)人公鑰仿吞,并由認(rèn)證機(jī)構(gòu)(Certification Authority、Certifying Authority怀泊,CA)施加數(shù)字簽名茫藏。公鑰證書也簡稱為證書(certificate)误趴。
-
CA 怎么證明自己呢霹琼?
-
信任鏈的問題。小一點(diǎn)的 CA 可以讓大 CA 簽名認(rèn)證凉当,但鏈條的最后枣申,也就是 Root CA(操作系統(tǒng)內(nèi)置),就只能自己證明自己了看杭,這個(gè)就叫“自簽名證書”(Self-Signed Certificate)或者“根證書”(Root Certificate)
-
-
有了這個(gè)證書體系忠藤,操作系統(tǒng)和瀏覽器都內(nèi)置了各大 CA 的根證書,順著證書鏈(Certificate Chain)一層層地驗(yàn)證楼雹,直到找到根證書模孩,就能夠確定證書是可信的,從而里面的公鑰也是可信的
5. iOS簽名機(jī)制
-
iOS簽名機(jī)制的作用
- 保證安裝到用戶手機(jī)上的APP都是經(jīng)過Apple官方允許的
-
不管是真機(jī)調(diào)試贮缅,還是發(fā)布APP榨咐,開發(fā)者都需要經(jīng)過一系列復(fù)雜的步驟
- 生成CertificateSigningRequest.certSigningRequest文件
- 獲得ios_development.cer\ios_distribution.cer證書文件
- 注冊device、添加App ID
4.獲得*.mobileprovision文件
-
真機(jī)調(diào)試驗(yàn)證流程
流程步驟:
①. Mac生成了一把公鑰和私鑰谴供;
②. Apple后臺存著私鑰块茁,每臺iOS設(shè)備內(nèi)置公鑰
⑤. 使用Mac的私鑰對APP進(jìn)行簽名,存放到APP包內(nèi)
③. 蘋果CA利用Apple的私鑰對Mac公鑰進(jìn)行認(rèn)證桂肌,并簽發(fā)證書 数焊,然后加上設(shè)備id...打包一起再使用Apple私鑰進(jìn)行一次簽名④,生成.mobileprovision文件
驗(yàn)證操作:
⑥. 利用Apple公鑰驗(yàn)證③簽名崎场,驗(yàn)證通過證明Mac公鑰合法佩耳,就可以使用公鑰驗(yàn)證APP代碼沒被篡改。-
從AppStore下載的應(yīng)用簽名驗(yàn)證流程
- 從合法渠道下載的谭跨,省去了很多其他步驟
- App Store 已經(jīng)完成了對 App 的驗(yàn)證(類似于上述測試包的驗(yàn)證過程)干厚。當(dāng) App 通過驗(yàn)證后,Apple Store 會(huì)對 App 進(jìn)行重新簽名饺蚊。重新簽名的內(nèi)容將不再包含 Provisioning Profile萍诱,最終的 ipa 文件也不包含它
-
當(dāng)設(shè)備從 App Store 下載 App 時(shí),會(huì)直接使用設(shè)備上的 CA 公鑰對 ipa 進(jìn)行簽名驗(yàn)證污呼。與上述測試包的簽名驗(yàn)證相比裕坊,正式包的簽名驗(yàn)證簡化了很多,因?yàn)橛幸徊糠烛?yàn)證工作已經(jīng)由 App Store 完成了
-
CertificateSigningRequest.certSigningRequest文件
- 包含了開發(fā)者信息和Mac設(shè)備的公鑰
-
ios_development.cer燕酷、ios_distribution.cer文件
- 利用Apple后臺的私鑰籍凝,對Mac設(shè)備的公鑰進(jìn)行簽名后的 證書文件
-
.mobileprovision
- 利用Apple私鑰周瞎,對【.cer證書+devices+AppID+entitlements】進(jìn)行數(shù)字簽名
P12文件:本地私鑰,可以導(dǎo)入到其他電腦(以前的在多臺電腦進(jìn)行真機(jī)調(diào)試)