iOS簽名機(jī)制

一、預(yù)備知識(shí)

1、常見英文
encrypt:加密
decrypt:解密
plaintext:明文
ciphertext:密文

2、為了便于學(xué)習(xí),設(shè)計(jì)4個(gè)虛擬人物
Alice、Bob:互相通信
Eve:竊聽者
Mallory:主動(dòng)攻擊者

image
image

如何防止被竊聽?

image

如何加密解密?

image

二、密碼的類型

根據(jù)密鑰的使用方法,可以將密碼分為2種

  • 對(duì)稱密碼
  • 公鑰密碼(非對(duì)稱密碼)
image
image

三、對(duì)稱密碼(Symmetric Cryptography)

在對(duì)稱密碼中,加密、解密時(shí)使用的是同一個(gè)密鑰
常見的對(duì)稱密碼算法有

  • DES
  • 3DES
  • AES
image

1、DES(Data Encryption Standard)
DES是一種將64bit明文加密成64bit密文的對(duì)稱密碼算法,密鑰長度是56bit
規(guī)格上來說,密鑰長度是64bit,但每隔7bit會(huì)設(shè)置一個(gè)用于錯(cuò)誤檢查的bit,因此密鑰長度實(shí)質(zhì)上是56bit
由于DES每次只能加密64bit的數(shù)據(jù),遇到比較大的數(shù)據(jù),需要對(duì)DES加密進(jìn)行迭代(反復(fù))
目前已經(jīng)可以在短時(shí)間內(nèi)被破解,所以不建議使用

image
image

2、3DES
3DES,將DES重復(fù)3次所得到的一種密碼算法,也叫做3重DES
目前還被一些銀行等機(jī)構(gòu)使用,但處理速度不高,安全性逐漸暴露出問題
3個(gè)密鑰都是不同的,也稱為DES-EDE3

image
image

如果所有密鑰都使用同一個(gè),則結(jié)果與普通的DES是等價(jià)的

image

如果密鑰1、密鑰3相同,密鑰2不同,稱為DES-EDE2

image

3、AES(Advanced Encryption Standard)
取代DES成為新標(biāo)準(zhǔn)的一種對(duì)稱密碼算法
AES的密鑰長度有128、192、256bit三種
在2000年時(shí)選擇Rijindael算法作為AES的實(shí)現(xiàn)
目前AES,已經(jīng)逐步取代DES、3DES,成為首選的對(duì)稱密碼算法

一般來說,我們也不應(yīng)該去使用任何自制的密碼算法,而是應(yīng)該使用AES,它經(jīng)過了全世界密碼學(xué)家所進(jìn)行的高品質(zhì)驗(yàn)證工作

4、密鑰配送問題
在使用對(duì)稱密碼時(shí),一定會(huì)遇到密鑰配送問題
假設(shè),Alice將使用對(duì)稱密碼加密過的消息發(fā)給了Bob
只有將密鑰發(fā)送給Bob,Bob才能完成解密
在發(fā)送密鑰過程中,可能會(huì)被Eve竊取密鑰,最后Eve也能完成解密

image

如何解決密鑰配送問題
有以下幾種解決密鑰配送的方法

  • 事先共享密鑰
  • 密鑰分配中心
  • Diffie-Hellman密鑰交換
  • 公鑰密碼

四、公鑰密碼(Public-key Cryptography)

公鑰密碼中,密鑰分為加密密鑰、解密密鑰2種,它們并不是同一個(gè)密鑰
公鑰密碼也被稱為非對(duì)稱密碼(Asymmetric Cryptography)

在公鑰密碼中
加密密鑰,一般是公開的,因此該密鑰稱為公鑰(public key)
解密密鑰,由消息接收者自己保管的,不能公開,因此也稱為私鑰(private key)
公鑰和私鑰是一 一對(duì)應(yīng)的,是不能單獨(dú)生成的,一對(duì)公鑰和密鑰統(tǒng)稱為密鑰對(duì)(key pair)
由公鑰加密的密文,必須使用與該公鑰對(duì)應(yīng)的私鑰才能解密
由私鑰加密的密文,必須使用與該私鑰對(duì)應(yīng)的公鑰才能解密

image

解決密鑰配送問題
由消息的接收者,生成一對(duì)公鑰、私鑰
將公鑰發(fā)給消息的發(fā)送者
消息的發(fā)送者使用公鑰加密消息

image

RSA
目前使用最廣泛的公鑰密碼算法是RSA
RSA的名字,由它的3位開發(fā)者,即Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母組成

五、混合密碼系統(tǒng)(Hybrid Cryptosystem)

1、對(duì)稱密碼的缺點(diǎn)
不能很好地解決密鑰配送問題

2、公鑰密碼的缺點(diǎn)
加密解密速度比較慢

3、混合密碼系統(tǒng),是將對(duì)稱密碼和公鑰密碼的優(yōu)勢相結(jié)合的方法
解決了公鑰密碼速度慢的問題
并通過公鑰密碼解決了對(duì)稱密碼的密鑰配送問題

網(wǎng)絡(luò)上的密碼通信所用的SSL/TLS都運(yùn)用了混合密碼系統(tǒng)

4、混合密碼-加密
會(huì)話密鑰(session key)
為本次通信隨機(jī)生成的臨時(shí)密鑰
作為對(duì)稱密碼的密鑰,用于加密消息,提高速度

加密步驟(發(fā)送消息)
首先,消息發(fā)送者要擁有消息接收者的公鑰
生成會(huì)話密鑰,作為對(duì)稱密碼的密鑰,加密消息
用消息接收者的公鑰,加密會(huì)話密鑰
將前2步生成的加密結(jié)果,一并發(fā)給消息接收者

發(fā)送出去的內(nèi)容包括
用會(huì)話密鑰加密的消息(加密方法:對(duì)稱密碼)
用公鑰加密的會(huì)話密鑰(加密方法:公鑰密碼)

image

5、混合密碼-解密
解密步驟(收到消息)

  • 消息接收者用自己的私鑰解密出會(huì)話密鑰

  • 再用第1步解密出來的會(huì)話密鑰,解密消息

    image

6、混合密碼-加密解密流程
Alice >>>>> Bob
發(fā)送過程,加密過程
1.Bob先生成一對(duì)公鑰、私鑰
2.Bob把公鑰共享給Alice
3.Alice隨機(jī)生成一個(gè)會(huì)話密鑰(臨時(shí)密鑰)
4.Alice用會(huì)話密鑰加密需要發(fā)送的消息(使用的是對(duì)稱密碼加密)
5.Alice用Bob的公鑰加密會(huì)話密鑰(使用的是公鑰密碼加密,也就是非對(duì)稱密碼加密)
6.Alice把第4、5步的加密結(jié)果,一并發(fā)送給Bob

接收過程,解密過程
1.Bob利用自己的私鑰解密會(huì)話密鑰(使用的是公鑰密碼解密,也就是非對(duì)稱密碼解密)
2.Bob利用會(huì)話密鑰解密發(fā)送過來的消息(使用的是對(duì)稱密碼解密)

六、單向散列函數(shù)(One-way hash function)

單向散列函數(shù),可以根據(jù)根據(jù)消息內(nèi)容計(jì)算出散列值

散列值的長度和消息的長度無關(guān),無論消息是1bit、10M、100G,單向散列函數(shù)都會(huì)計(jì)算出固定長度的散列值

image
image

1、單向散列函數(shù)的特點(diǎn)
根據(jù)任意長度的消息,計(jì)算出固定長度的散列值
計(jì)算速度快,能快速計(jì)算出散列值
消息不同,散列值也不同
具備單向性

image
image

2、單向散列函數(shù)
單向散列函數(shù),又被稱為消息摘要函數(shù)(message digest function),哈希函數(shù)
輸出的散列值,也被稱為消息摘要(message digest)、指紋(fingerprint)

常見的幾種單向散列函數(shù)
MD4、MD5
產(chǎn)生128bit的散列值,MD就是Message Digest的縮寫,目前已經(jīng)不安全
Mac終端上默認(rèn)可以使用md5命令

SHA-1
產(chǎn)生160bit的散列值,目前已經(jīng)不安全

SHA-2
SHA-256、SHA-384、SHA-512,散列值長度分別是256bit、384bit、512bit

SHA-3
全新標(biāo)準(zhǔn)

3、如何防止數(shù)據(jù)被篡改

image
image

4、單向散列函數(shù)的應(yīng)用 – 防止數(shù)據(jù)被篡改

image
image

5、單向散列函數(shù)的應(yīng)用 – 口令加密

image

七、數(shù)字簽名

想象以下場景

image

Alice發(fā)的內(nèi)容有可能是被篡改的,或者有人偽裝成Alice發(fā)消息,或者就是Alice發(fā)的,但她可以否認(rèn)

問題來了:Bob如何確定這段消息的真實(shí)性?如何識(shí)別篡改、偽裝、否認(rèn)?
解決方案

  • 數(shù)字簽名

1、數(shù)字簽名
在數(shù)字簽名技術(shù)中,有以下2種行為

  • 生成簽名
    由消息的發(fā)送者完成,通過“簽名密鑰”生成

  • 驗(yàn)證簽名
    由消息的接收者完成,通過“驗(yàn)證密鑰”驗(yàn)證

思考
如何能保證這個(gè)簽名是消息發(fā)送者自己簽的?

答案
用消息發(fā)送者的私鑰進(jìn)行簽名

image
image

2、數(shù)字簽名和公鑰密碼
數(shù)字簽名,其實(shí)就是將公鑰密碼反過來使用

image

3、數(shù)字簽名的過程

image

4、數(shù)字簽名的過程 – 改進(jìn)

image
image

5、數(shù)字簽名 – 疑惑

  • 思考一下
    如果有人篡改了文件內(nèi)容或者簽名內(nèi)容,會(huì)是什么結(jié)果?
    結(jié)果是:簽名驗(yàn)證失敗,證明內(nèi)容會(huì)篡改

  • 數(shù)字簽名不能保證機(jī)密性?
    數(shù)字簽名的作用不是為了保證機(jī)密性,僅僅是為了能夠識(shí)別內(nèi)容有沒有被篡改

  • 數(shù)字簽名的作用
    確認(rèn)消息的完整性
    識(shí)別消息是否被篡改
    防止消息發(fā)送人否認(rèn)

6、數(shù)字簽名無法解決的問題

  • 要正確使用簽名,前提是
    用于驗(yàn)證簽名的公鑰必須屬于真正的發(fā)送者

  • 如果遭遇了中間人攻擊,那么
    公鑰將是偽造的
    數(shù)字簽名將失效

  • 所以在驗(yàn)證簽名之前,首先得先驗(yàn)證公鑰的合法性

  • 如何驗(yàn)證公鑰的合法性?
    證書

    image

八、證書(Certificate)

  • 證書,聯(lián)想的是駕駛證、畢業(yè)證、英語四六級(jí)證等等,都是由權(quán)威機(jī)構(gòu)認(rèn)證的

  • 密碼學(xué)中的證書,全稱叫公鑰證書(Public-key Certificate,PKC),跟駕駛證類似
    里面有姓名、郵箱等個(gè)人信息,以及此人的公鑰
    并由認(rèn)證機(jī)構(gòu)(Certificate Authority,CA)施加數(shù)字簽名

  • CA就是能夠認(rèn)定“公鑰確實(shí)屬于此人”并能夠生成數(shù)字簽名的個(gè)人或者組織
    有國際性組織、政府設(shè)立的組織
    有通過提供認(rèn)證服務(wù)來盈利的企業(yè)
    個(gè)人也可以成立認(rèn)證機(jī)構(gòu)

1、證書的利用

image

2、證書的注冊(cè)和下載

image

九、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證書文件
    注冊(cè)device、添加App ID
    獲得*.mobileprovision文件

  • 對(duì)于真機(jī)調(diào)試,現(xiàn)在的Xcode已經(jīng)自動(dòng)幫開發(fā)者做了以上操作

  • 思考
    每一步的作用是什么?
    .certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用處?

1、iOS簽名機(jī)制 – 流程圖

image

2、iOS簽名機(jī)制 – 生成Mac設(shè)備的公私鑰
CertificateSigningRequest.certSigningRequest文件
就是Mac設(shè)備的公鑰

image

3、iOS簽名機(jī)制 – 獲得證書

image

4、ios_development.cer、ios_distribution.cer文件
利用Apple后臺(tái)的私鑰,對(duì)Mac設(shè)備的公鑰進(jìn)行簽名后的證書文件

image

5、iOS簽名機(jī)制 – 生成mobileprovision

image
image

6、iOS簽名機(jī)制 – 安全檢測

image

7、iOS簽名機(jī)制 - AppStore
如果APP是從AppStore下載安裝的,你會(huì)發(fā)現(xiàn)里面是沒有mobileprovision文件的
它的驗(yàn)證流程會(huì)簡單很多,大概如下所示

image

十、重簽名

  • 如果希望將破壞了簽名的安裝包,安裝到非越獄的手機(jī)上,需要對(duì)安裝包進(jìn)行重簽名的操作

  • 注意
    安裝包中的可執(zhí)行文件必須是經(jīng)過脫殼的,重簽名才會(huì)有效
    .app包內(nèi)部的所有動(dòng)態(tài)庫(.framework、.dylib)、AppExtension(PlugIns文件夾,拓展名是appex)、WatchApp(Watch文件夾)都需要重新簽名

  • 重簽名打包后,安裝到設(shè)備的過程中,可能需要經(jīng)常查看設(shè)備的日志信息
    程序運(yùn)行過程中:Window -> Devices and Simulators -> View Device Logs
    程序安裝過程中: Window -> Devices and Simulators -> Open Console

1、重簽名步驟

  • 準(zhǔn)備一個(gè)embedded.mobileprovision文件(必須是付費(fèi)證書產(chǎn)生的,appid、device一定要匹配),并放入.app包中
    可以通過Xcode自動(dòng)生成,然后在編譯后的APP包中找到
    可以去開發(fā)者證書網(wǎng)站生成下載

  • 從embedded.mobileprovision文件中提取出entitlements.plist權(quán)限文件
    security cms -D -i embedded.mobileprovision > temp.plist
    /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist

  • 查看可用的證書
    security find-identity -v -p codesigning

  • 對(duì).app內(nèi)部的動(dòng)態(tài)庫、AppExtension等進(jìn)行簽名
    codesign -fs 證書ID xxx.dylib

  • 對(duì).app包進(jìn)行簽名
    codesign -fs 證書ID --entitlements entitlements.plist xxx.app

2、重簽名GUI工具

3、動(dòng)態(tài)庫注入

有2個(gè)常用參數(shù)選項(xiàng)
--weak,即使動(dòng)態(tài)庫找不到也不會(huì)報(bào)錯(cuò)
--all-yes,后面所有的選擇都為yes

  • insert_dylib的本質(zhì)是往Mach-O文件的Load Commands中添加了一個(gè)LC_LOAD_DYLIB或LC_LOAD_WEAK_DYLIB

  • 可以通過otool查看Mach-O的動(dòng)態(tài)庫依賴信息
    otool -L Mach-O文件

4、更改動(dòng)態(tài)庫加載地址

  • 可以使用install_name_tool修改Mach-O文件中動(dòng)態(tài)庫的加載地址
    install_name_tool -change 舊地址 新地址 Mach-O文件

  • 通過Theos開發(fā)的動(dòng)態(tài)庫插件(dylib)
    默認(rèn)都依賴于/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
    如果要將動(dòng)態(tài)庫插件打包到ipa中,也需要將CydiaSubstrate打包到ipa中,并且修改下CydiaSubstrate的加載地址

  • 2個(gè)常用環(huán)境變量
    @executable_path代表可執(zhí)行文件所在的目錄
    @loader_path代表動(dòng)態(tài)庫所在的目錄

鏈接:http://www.itdecent.cn/p/47facc920fb5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容