說到簽名機(jī)制,首先要了解一下加密解密,簽名文件就是加密解密的過程。
加密解密
加密是將明文信息改變?yōu)殡y以讀取的密文內(nèi)容,使之不可讀的過程。
解密是通過特殊的對象,將密文還原為正??勺x的內(nèi)容的過程。而在這個(gè)過程中,我們所使用的方法,就是加密解密算法。
加密分為對稱加密與非對稱加密(公開密鑰加密)。
對稱加密
對稱加密就是加密和解密使用的都是同一套密鑰
作為一個(gè)開發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要,這是一個(gè)我的iOS交流群:834688868,不管你是大牛還是小白都?xì)g迎入駐 ,分享BAT,阿里面試題、面試經(jīng)驗(yàn),討論技術(shù), 大家一起交流學(xué)習(xí)成長!
常見的對稱密碼算法有:
-
DES:(Data Encryption Standard)是最常見的對稱密碼算法,DES是一種將64bit明文加密成64bit密文的對稱密碼算法,密鑰長度是56bit;規(guī)格上來說,密鑰長度是64bit,但每隔7bit會(huì)設(shè)置一個(gè)用于錯(cuò)誤檢查的bit,因此密鑰長度實(shí)質(zhì)上是56bit;
由于DES每次只能加密64bit的數(shù)據(jù),遇到比較大的數(shù)據(jù),需要對DES加密進(jìn)行迭代(反復(fù)) 目前已經(jīng)可以在短時(shí)間內(nèi)被破解,所以不建議使用
3DES : 將DES重復(fù)3次所得到的一種密碼算法,也叫做3重DES 目前還被一些銀行等機(jī)構(gòu)使用,但處理速度不高,安全性逐漸暴露出問題
-
AES:取代DES成為新標(biāo)準(zhǔn)的一種對稱密碼算法
AES的密鑰長度有128、192、256bit三種 在2000年時(shí)選擇Rijindael算法作為AES的實(shí)現(xiàn) 目前AES,已經(jīng)逐步取代DES、3DES,成為首選的對稱密碼算法
對稱加密存在的問題:秘鑰配送問題
如下圖,在使用對稱密碼時(shí),一定會(huì)遇到密鑰配送問題, 假設(shè),Alice將使用對稱密碼加密過的消息發(fā)給了Bob, 只有將密鑰發(fā)送給Bob,Bob才能完成解密, 在發(fā)送密鑰過程中,可能會(huì)被Eve竊取密鑰,最后Eve也能完成解密。
非對稱加密算法
加密和解密使用的不是同一個(gè)密鑰,即為非對稱加密算法,也稱公開密鑰加密;
公鑰密碼中,密鑰分為加密密鑰、解密密鑰2種,它們并不是同一個(gè)密鑰, 公鑰密碼也被稱為非對稱密碼(Asymmetric Cryptography)
在公鑰密碼中:
加密密鑰,一般是公開的,因此該密鑰稱為公鑰(public key)
解密密鑰,由消息接收者自己保管的,不能公開,因此也稱為私鑰(private key) 公鑰和私鑰是一 一對應(yīng)的,是不能單獨(dú)生成的,一對公鑰和密鑰統(tǒng)稱為密鑰對(key pair)
- 由公鑰加密的密文,必須使用與該公鑰對應(yīng)的私鑰才能解密
- 由私鑰加密的密文,必須使用與該私鑰對應(yīng)的公鑰才能解密
這樣就能解決秘鑰配送的問題了,如下圖:
上圖解析:
1、 Bob生成一個(gè)公鑰一個(gè)密鑰
2、 Bob將公鑰發(fā)送給Alice,密鑰自己保存,公鑰是公開出來的,所有人都可以知道,不怕被竊取
3 、Alice用Bob的公鑰對消息加密
4、 Alice將加密的消息發(fā)送給Bob
5 、Bob用自己的私鑰解密消息。
這其中如果有第三者竊聽,只有第2步和第4步能夠監(jiān)聽數(shù)據(jù),由于Bob公鑰是公開的誰都可以獲取,那么第二步也不用擔(dān)心被誰獲取,第4步如果數(shù)據(jù)被第三者截獲,那么他看到的也是加密后的數(shù)據(jù),由于他沒有Bob的私鑰,那么他也無法知道消息的真實(shí)內(nèi)容。而且他即使篡改密文消息也無任何意義。
混合密碼系統(tǒng)
雖然非對稱加密解決了密鑰配送問題,但是它的加解密速度較慢,下面我們總結(jié)一下對稱和非對稱加密的優(yōu)缺點(diǎn):
| 加密算法 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| 對稱加密 | 加密解密速度比較快 | 不能很好地解決密鑰配送問題 |
| 非對稱加密 | 加密解密速度比較慢 | 能很好地解決密鑰配送問題 |
混合密碼系統(tǒng),是將對稱密碼和公鑰密碼的優(yōu)勢相結(jié)合的方法:
1 它解決了公鑰密碼速度慢的問題
2 并通過公鑰密碼解決了對稱密碼的密鑰配送問題
混合密碼-加密
會(huì)話密鑰(session key)
為本次通信隨機(jī)生成的臨時(shí)密鑰; 作為對稱密碼的密鑰,用于加密消息,提高速度
加密步驟(發(fā)送消息)
首先,消息發(fā)送者要擁有消息接收者的公鑰; 生成會(huì)話密鑰,作為對稱密碼的密鑰,加密消息; 用消息接收者的公鑰,加密會(huì)話密鑰; 將前2步生成的加密結(jié)果,一并發(fā)給消息接收者。
發(fā)送出去的內(nèi)容包括
用會(huì)話密鑰加密的消息(加密方法:對稱密碼)
用公鑰加密的會(huì)話密鑰(加密方法:公鑰密碼)
混合密碼-解密
解密步驟(收到消息)
1 消息接收者用自己的私鑰解密出會(huì)話密鑰
2 再用第1步解密出來的會(huì)話密鑰,解密消息
發(fā)送過程,加密過程
1.Bob先生成一對公鑰、私鑰
2.Bob把公鑰共享給Alice
3.Alice隨機(jī)生成一個(gè)會(huì)話密鑰(臨時(shí)密鑰)
4.Alice用會(huì)話密鑰加密需要發(fā)送的消息(使用的是對稱密碼加密)
5.Alice用Bob的公鑰加密會(huì)話密鑰(使用的是公鑰密碼加密,也就是非對稱密碼加密)
6.Alice把第4、5步的加密結(jié)果,一并發(fā)送給Bob
接收過程,解密過程
1.Bob利用自己的私鑰解密會(huì)話密鑰(使用的是公鑰密碼解密,也就是非對稱密碼解密)
2.Bob利用會(huì)話密鑰解密發(fā)送過來的消息(使用的是對稱密碼解密)
上面的加密算法解決了數(shù)據(jù)傳輸?shù)陌踩珕栴},那么數(shù)據(jù)的完整性是沒法驗(yàn)證的,就是我這個(gè)數(shù)據(jù)有沒有被改過,因?yàn)楣€大家都能獲取,如果有中間人攔截了消息,并改動(dòng)了內(nèi)容。那么我們?nèi)绾悟?yàn)證這個(gè)消息有沒有變動(dòng)呢?
單項(xiàng)散列函數(shù)
單向散列函數(shù),又稱單向Hash函數(shù)、雜湊函數(shù),就是把任意長的輸入消息串變化成固定長的輸出串且由輸出串難以得到輸入串的一種函數(shù)。這個(gè)輸出串稱為該消息的散列值。一般用于產(chǎn)生消息摘要,密鑰加密等
單向散列函數(shù),可以根據(jù)根據(jù)消息內(nèi)容計(jì)算出散列值 散列值的長度和消息的長度無關(guān),無論消息是1bit、10M、100G,單向散列函數(shù)都會(huì)計(jì)算出固定長度的散列值。
單項(xiàng)散列函數(shù)的特點(diǎn)
- 根據(jù)任意長度的消息,計(jì)算出固定長度的散列值
- 計(jì)算速度快,能快速計(jì)算出散列值
- 消息不同,散列值也不同
- 具備單向性
單向散列函數(shù),又被稱為消息摘要函數(shù)(message digest function),哈希函數(shù)輸出的散列值,也被稱為消息摘要(message digest)、指紋(fingerprint)
常見的幾種單項(xiàng)散列函數(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)
單項(xiàng)散列函數(shù)如何防篡改的
不同的數(shù)據(jù)生成的散列值是不一樣的,只要你對一個(gè)文件改動(dòng)過,那么它的散列值就會(huì)發(fā)生變化,要想確定我們的數(shù)據(jù)有沒有發(fā)生變化,只要對比兩次散列值相不相同就可以了,我們常常做的登錄功能,在保存用戶密碼的時(shí)候就采用單項(xiàng)散列函數(shù)生成的值來進(jìn)行保存,防止第三方人員串改密碼。
數(shù)據(jù)防篡改的技術(shù)我們知道了,在數(shù)據(jù)傳輸?shù)倪^程中,我們對數(shù)據(jù)生成一個(gè)散列值,和發(fā)送的數(shù)據(jù)一并發(fā)給接收者,當(dāng)接收者收到這個(gè)數(shù)據(jù)的時(shí)候,它拿接收到的數(shù)據(jù)重新生成散列值,然后跟接收到的散列值進(jìn)行比較,就可以判斷這個(gè)數(shù)據(jù)有沒有被人改過。
到此我們通過混合密碼技術(shù)解決的傳輸數(shù)據(jù)的保密性,通過單項(xiàng)散列函數(shù)確定數(shù)據(jù)的一致性,但是還是沒有解決中間人截獲篡改的問題,因?yàn)樯⒘泻瘮?shù)中間人也可以重新生成一次,接下來我們就要講數(shù)字簽名了,他可以對消息發(fā)送者的真實(shí)性進(jìn)行認(rèn)證。
數(shù)字簽名
數(shù)字簽名(又稱公鑰數(shù)字簽名)是只有信息的發(fā)送者才能產(chǎn)生的別人無法偽造的一段數(shù)字串,這段數(shù)字串同時(shí)也是對信息的發(fā)送者發(fā)送信息真實(shí)性的一個(gè)有效證明。
它是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)來實(shí)現(xiàn)的,用于鑒別數(shù)字信息的方法。一套數(shù)字簽名通常定義兩種互補(bǔ)的運(yùn)算,一個(gè)用于簽名,另一個(gè)用于驗(yàn)證。數(shù)字簽名是非對稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。
說白了就是用用消息發(fā)送者的私鑰進(jìn)行簽名就是數(shù)字簽名

在數(shù)字簽名中,任何人都可以使用公鑰驗(yàn)證簽名
在數(shù)字簽名技術(shù)中,有以下2種行為:
生成簽名 由消息的發(fā)送者完成,通過“簽名密鑰”生成
驗(yàn)證簽名 由消息的接收者完成,通過“驗(yàn)證密鑰”驗(yàn)證
數(shù)字簽名由于是消息發(fā)送者的私鑰進(jìn)行簽名,消息發(fā)送者的私鑰只有他自己擁有,別人是沒有的,從而我們通過私鑰進(jìn)行簽名,別人通過消息發(fā)送者的公鑰就能確定消息發(fā)送者的真實(shí)身份。
接下來我們看一下數(shù)字簽名和公鑰密碼的對比:
| 私鑰 | 公鑰 | |
|---|---|---|
| 公鑰密碼 | 接收者解密時(shí)使用 | 發(fā)送者加密是使用 |
| 數(shù)字簽名 | 簽名者生成簽名時(shí)使用 | 驗(yàn)證著驗(yàn)證簽名時(shí)使用 |
| 誰持有密鑰 | 個(gè)人持有 | 只要有需要,任何人都可以持有 |
數(shù)字簽名過程:

上圖Alice將要發(fā)送的消息用自己的私鑰加密,發(fā)送給Bob,Bob用Alice的公鑰解密消息,這里其實(shí)有一個(gè)不好的點(diǎn),就是如果Alice如果發(fā)送的消息比較大,比如發(fā)1GB的視頻文件,那這個(gè)簽名過程就太慢了,本身非對稱加密的速度就是比較慢的,
下面我們來看一個(gè)改進(jìn)版的:


這里我們將要發(fā)送的消息先生成固定大小的散列值,然后再簽名,這樣簽名文件就小的多了,然后我們將消息和簽名一同發(fā)送該Bob,然后Bob再用公鑰解密 對比等。
下面有關(guān)數(shù)字簽名的一些點(diǎn)進(jìn)行一下說明:
1 如果有人篡改了文件內(nèi)容或者簽名內(nèi)容,會(huì)是什么結(jié)果? 結(jié)果是:簽名驗(yàn)證失敗,證明內(nèi)容會(huì)篡改
2 數(shù)字簽名不能保證機(jī)密性? 數(shù)字簽名的作用不是為了保證機(jī)密性,僅僅是為了能夠識別內(nèi)容有沒有被篡改
3 數(shù)字簽名的作用
- 確認(rèn)消息的完整性
- 識別消息是否被篡改
- 防止消息發(fā)送人否認(rèn)
數(shù)字簽名是能確定消息發(fā)送者,前提是你要確定你獲取的公鑰是確定是消息發(fā)送者的,如果你拿到的公鑰是中間人偽造的,那么你就無法驗(yàn)證消息發(fā)送者的真實(shí)性了,就如下圖:
[圖片上傳中...(image-b6d6e1-1614756605461-3)]
A問B要公鑰,M從監(jiān)聽到了中間,B給A發(fā)的公鑰被M攔截了并保存,M把他自己的公鑰給了A,A以為這個(gè)公鑰是B的,A用公鑰加密發(fā)消息給B,M攔截然后用自己的私鑰解密,修改消息內(nèi)容后,然后用保存的公鑰加密把消息發(fā)送給B,B解密消息。A,和B都以為是正常通信的,但消息確實(shí)不是那個(gè)消息了,那么如何確定公鑰合法?也就是如何確定這個(gè)公鑰就是B的呢?
接下來就是我們要講的證書了,我們引入一個(gè)第三方權(quán)威機(jī)構(gòu)來認(rèn)正,說這個(gè)公鑰就是B的。接下來我們來看一下。
證書
CA是證書的簽發(fā)機(jī)構(gòu),它是公鑰基礎(chǔ)設(shè)施(Public Key Infrastructure,PKI)的核心。CA是負(fù)責(zé)簽發(fā)證書、認(rèn)證證書、管理已頒發(fā)證書的機(jī)關(guān)。
CA 擁有一個(gè)證書(內(nèi)含公鑰和私鑰)。網(wǎng)上的公眾用戶通過驗(yàn)證 CA 的簽字從而信任 CA ,任何人都可以得到 CA 的證書(含公鑰),用以驗(yàn)證它所簽發(fā)的證書,密碼學(xué)中的證書,全稱叫公鑰證書(Public-key Certificate,PKC),跟駕駛證類似 里面有姓名、郵箱等個(gè)人信息,以及此人的公鑰; 并由認(rèn)證機(jī)構(gòu)(Certificate Authority,CA)施加數(shù)字簽名。


圖已經(jīng)表示的很清楚了,消息發(fā)送者先向CA機(jī)構(gòu) 注冊自己的證書,那么任何拿到消息發(fā)送者的公鑰都可以向CA進(jìn)行驗(yàn)證公鑰的真實(shí)性。
iOS中的簽名機(jī)制
首先我們要知道iOS簽名機(jī)制的作用是什么?
保證安裝到用戶手機(jī)上的APP都是經(jīng)過Apple官方允許的
不管是真機(jī)調(diào)試,還是發(fā)布APP,開發(fā)者都需要經(jīng)過一系列復(fù)雜的步驟:
1 生成CertificateSigningRequest.certSigningRequest文件
2 獲得ios_development.cer\ios_distribution.cer證書文件
3 注冊device、添加App ID
4 獲得.mobileprovision文件
大致如下圖:
[圖片上傳中...(image-169a4f-1614756605461-0)]
1、 我們在自己的電腦上生成一對公鑰和私鑰,操作就是我們通過鑰匙串去生成CertificateSigningRequest.certSigningRequest文件
2、 用我們mac上的私鑰對App進(jìn)行簽名。
3、把我們的公鑰文件上傳到Apple后臺
4、 apple后臺用它的私鑰對我們的公鑰進(jìn)行簽名
5、 讓我們選這設(shè)備列表 appid 權(quán)限等
6、 再次對我們選著的這幾項(xiàng)以及第四步生成的簽名,再用Apple后臺的私鑰進(jìn)行簽名,生成描述文件mobileprovision
7、 當(dāng)我們app安裝到手機(jī)或運(yùn)行的時(shí)候,首先我們的手機(jī)都內(nèi)置了Apple后臺的公鑰
8、 首先那手機(jī)里的Apple后臺公鑰驗(yàn)證mobileprovision文件,完事后會(huì)拿到第六步的幾個(gè)信息,接著再用apple公鑰驗(yàn)證第四步的信息,這步驗(yàn)證完成它就那到了我們開發(fā)時(shí)電腦上的公鑰
9、 用Mac公鑰對App進(jìn)行簽名驗(yàn)證。
總結(jié):
1、.cerSigningRequest文件 : Mac公鑰
2、.cer文件:利用Apple私鑰(CA),對Mac公鑰生成了數(shù)字簽名
3、.mobileprovision : 利用Apple私鑰,對【.cer證書 + devices + AppID + entitlements】進(jìn)行數(shù)字簽名
作為一個(gè)開發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要,這是一個(gè)我的iOS交流群:834688868,不管你是大牛還是小白都?xì)g迎入駐 ,分享BAT,阿里面試題、面試經(jīng)驗(yàn),討論技術(shù), 大家一起交流學(xué)習(xí)成長!
以上若有錯(cuò)誤,歡迎指正。轉(zhuǎn)載請注明出處。
作者:ibiaoma
鏈接:https://juejin.cn/post/6932245628021899277
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。