侵權(quán)投訴
訂閱
糾錯
加入自媒體

物聯(lián)網(wǎng)云平臺加密、證書的那些事

不可逆加密

顧名思義,不可逆加密就是說把明文加密之后得到密文,但是不能從密文還原得到明文。從術(shù)語上來說,一般不把這個加密結(jié)果稱作密文,而是稱作摘要或者指紋。

不可逆加密原理:把一個任意大小的數(shù)據(jù),經(jīng)過一定的算法,轉(zhuǎn)換成規(guī)定長度的輸出。如果數(shù)據(jù)的內(nèi)容發(fā)生了一絲絲的變化,再次加密就得到另一個不同的結(jié)果,而且是大不相同。從這個角度看,是不是稱作指紋更形象一些?

不可逆加密最常用的算法就是:MD5、SHA1。

回想一下:我們在下載一些軟件的時候,在服務器上除了看到軟件的下載地址,一般還會看到該軟件的MD5碼。我們把軟件下載到本地之后,計算得到MD5,也就是文件的指紋,然后把這個MD5與服務器上公布的MD5進行比較,如果這兩個MD5不一致,就說明下載的文件被別人修改過。

這是glib庫的下載頁面:

補充:SHA相關(guān)知識

SHA
SHA安全哈希算法,由美國國家標準技術(shù)研究院發(fā)布的一組加密函數(shù)。它是一種常用的摘要算法,就是輸入一段數(shù)據(jù),輸出合法的證書一個摘要信息,包括SHA0、SHA1、SHA2等不同的版本。SHA1
代表安全哈希算法1,接收輸入,輸出一個160位的哈希值,稱作信息摘要。在2005年之后,SHA1被認為不安全。SHA2
SHA2指的是具有兩個不同塊大小的相似哈希函數(shù)的族,其中包括:SHA256,SHA512。SHA256可以輸出一個256位的哈希值,安全級別更高。

一個實際的使用場景:OTA升級

首先服務器推送一個upgrate.json格式字符串給設備,文件中包括:新固件的下載地址URL,新固件的MD5值;設備根據(jù)URL下載新固件到本地;設備計算下載的新固件MD5值,與upgrade.json中的MD5值進行比較;如果這兩個MD5值一致,說明下載的固件沒有問題,那么就開始升級。

再來了解一下不可逆加密的特點:

不可逆:除非使用窮舉等手段,原則上不存在根據(jù)密文推斷出原文的算法;雪崩效應:對輸入數(shù)據(jù)敏感,原始數(shù)據(jù)的極小改動會造成輸出指紋的巨大差異;防碰撞:很難找到兩段不同的數(shù)據(jù),輸出相同的指紋。公鑰和私鑰

上面說到了非對稱加密,那么就必須再補充一下私鑰和公鑰。從字面上就可以看出:它倆是一對兄弟,都是秘鑰,必須成對使用,稱作:秘鑰對。我們可以通過一些軟件工具(例如:OpenSSL)生成自己的公鑰和私鑰。

公鑰:就是公開告訴別人的;私鑰:就是自己的,作為寶貝一樣自己私藏起來,千萬不要告訴別人。

公鑰和私鑰的作用有2個:

數(shù)據(jù)加密:公鑰加密,私鑰解密,用于通信場景;數(shù)字簽名:私鑰加密,公鑰解密,用于不可耍賴場景。

數(shù)據(jù)加密就是上面描述的非對稱加密,例如:

張三想發(fā)一個文件給我,為了防止文件被其他人看到,于是張三用我的公鑰對文件進行加密,然后把加密后的文件發(fā)給我。我拿到密文后,用我的私鑰就可以把密文還原成原始的文件,其他人即使拿到了密文,但是沒有我的私鑰,就解不開文件。如下面這張圖:

數(shù)字簽名與我們?nèi)粘I钪械慕钘l上的簽名類似,一旦簽名了,就具有法律效力,不能耍賴說:這個不是我簽名,我不認。具體流程是:我寫了一個文件,然后用我的私鑰對文件進行加密,那么如果以后我耍賴說:這個文件不是我寫的,其他人就可以用我的公鑰來嘗試對加密后的文件進行解密。如果成功解密了,就說明這個文件一定是用我的私鑰進行加密的,而私鑰只有我才有,那就說明這個文件一定是我寫的。如下圖:

證書

前面談到了公鑰是公開給別人的,本質(zhì)上就是一段數(shù)據(jù),那么這段數(shù)據(jù)是以什么樣的形式或者說以什么樣的載體發(fā)送給別人的呢?答案就是:證書。

如何申請證書

我們以一個網(wǎng)站為例,瀏覽器在訪問網(wǎng)站的時候,在握手階段,網(wǎng)站會把自己的證書發(fā)送給瀏覽器。那么這個證書是如何產(chǎn)生的呢?

Step1
在網(wǎng)站上線之初,需要把自己的相關(guān)信息放在一個請求文件中(server.req),把請求文件發(fā)送給一個權(quán)威的認證機構(gòu)。請求文件的內(nèi)容包括:

網(wǎng)站的域名
申請者信息
公鑰
以及其他一些相關(guān)信息

Step2
認證機構(gòu)通過其他途徑來確定申請者是合法的。

Step3
認證機構(gòu)使用某個算法,對請求文件server.req中的信息進行計算,得到一個數(shù)字摘要。

算法包括:

MD5
SHA-1
SHA-256

信息包括:

申請者的基本信息:網(wǎng)站使用的加密算法、網(wǎng)站使用的hash算法;
申請者的公鑰;
認證機構(gòu)的信息:認證機構(gòu)的名稱,證書到期時間。

Step4
認證機構(gòu)用自己的私鑰,對Step3中得到的數(shù)字摘要進行加密,得到數(shù)字簽名(也就證書簽名)。

Step5
認證機構(gòu)把以上這些信息進行匯總,得到最終的證書文件server.crt,然后發(fā)給申請者。

最終,證書server.crt中的內(nèi)容包括這幾個大類:

申請者的基本信息:網(wǎng)站使用的加密算法、網(wǎng)站使用的hash算法;申請者的公鑰;認證機構(gòu)的信息:認證機構(gòu)的名稱,證書到期時間。認證機構(gòu)的證書簽名。如何確認證書的合法性

現(xiàn)在,客戶端拿到了服務器發(fā)來的證書文件,應該如何驗證這是一個合法的證書呢?

Step1
讀取證書中的明文信息,包括:申請者的基本信息,申請者的公鑰,認證機構(gòu)的信息。

Step2
從瀏覽器或者操作系統(tǒng)中查找這個認證機構(gòu)的相關(guān)信息,得到這個認證機構(gòu)的公鑰。

補充:瀏覽器或者操作系統(tǒng)中,一般都會預裝一些可信任的權(quán)威認證機構(gòu)的證書列表,所以能拿到認證機構(gòu)的公鑰。

Step3
使用認證機構(gòu)相同的算法,對Step1中的明文信息進行計算,得到摘要1。

Step4
使用認證機構(gòu)的公鑰,對證書中認證機構(gòu)的數(shù)字簽名進行解密,得到摘要2。

Step5
比較摘要1與摘要2是否相同,如果相同,說明這個證書是合法的,也就證明當前訪問的是一個合法的服務器。

單向認證和雙向認證

上面描述的認證過程,是瀏覽器用來確認所訪問的網(wǎng)站是否是一個合法的網(wǎng)站;文章開頭所舉的例子:一個物聯(lián)網(wǎng)產(chǎn)品在連接云平臺的時候,是云平臺來驗證這個想連接進來的設備是否為一個合法的設備。

這兩個場景中都是單向認證,也就是通信的一方來驗證另一方是否合法。那么雙向認證就很好理解了:通信的每一方都要認證對方是否合法。

至于如何選擇使用單向認證或者雙向認證,甚至是不使用證書(只使用用戶名和密碼來鑒權(quán)),這就需要根據(jù)實際的使用場景、安全等級、操作的難易程度來決定了。比如:在物聯(lián)網(wǎng)產(chǎn)品中,每一個產(chǎn)品都需要在生產(chǎn)階段把動態(tài)生成的證書燒寫到設備中,增加了生產(chǎn)環(huán)節(jié)的流程和成本,為了安全性,萬萬不可偷懶。如果沒有證書來驗證,那么黑客就可以模擬無數(shù)個設備,頻繁的連接到云平臺,這就存在極大的安全隱患。

認證機構(gòu)

證書本質(zhì)上就是一個文件,只不過這個文件具有特殊的一個性質(zhì):可以被證明是合法的。那么應該如何來證明呢?這就要來說一下認證機構(gòu)。

認證機構(gòu)(CA: Certificate Authority)是一個權(quán)威的組織,是被國家、行業(yè)認可的權(quán)威結(jié)構(gòu),不是隨便一個機構(gòu)都有資格頒發(fā)證書,不然也不叫做權(quán)威機構(gòu)。只要能證明一個證書是由CA機構(gòu)頒發(fā)的,我們就認為這個證書是合法的,也就是說:證書的可信任性基于信任機制。

就像銀行貸款給個人一樣,銀行在放款之前,會到征信系統(tǒng)中查詢這個人的信用報告,如果征信系統(tǒng)中表明這個人的信用沒有問題,銀行相信征信系統(tǒng),所以銀行就相信這個人,可以貸款給他,這是一個信任鏈的傳遞。

CA認證機構(gòu)就類似于征信系統(tǒng),相當于CA結(jié)構(gòu)給證書進行了背書,它保證從它手里頒發(fā)的證書都是合法有效的,那么我們只要能證明證書是從CA認證機構(gòu)頒發(fā)的,就可以認為證書是有效的。

證書鏈

CA認證機構(gòu)是一個樹狀的結(jié)構(gòu),最頂部的稱為根認證機構(gòu)。往下層是:二級認證機構(gòu)、三級認證機構(gòu)...。

根認證機構(gòu)給二級認證機構(gòu)頒發(fā)證書,二級認證機構(gòu)給三級認證結(jié)構(gòu)頒發(fā)證書...。不同等級的認證機構(gòu)對審核的要求也不一樣,于是證書也分為免費的、便宜的和貴的。

你可能會問:那么根認證機構(gòu)的證書是由誰簽名的?答案是:根認證機構(gòu)自己簽名的,這也叫做自簽名。因為根認證機構(gòu)是由國家或者行業(yè)組織認可的,已經(jīng)是一個可以信賴的權(quán)威機構(gòu),所以可以為自己簽名。

另外,我們在測試的過程中,也常常利用OpenSSL中提供的程序來產(chǎn)生自簽名的證書,當然,這個測試的自簽名證書只能你自己玩,因為別人不信任你。

證書文件的后綴名

剛接觸到證書概念的小伙伴,常常被眼花繚亂的后綴名所迷惑。

首先要明確一點:證書文件的后綴名只是為了見名識意,實際上可以取任意的名字。常見的后綴名包括:

.crt:per格式的證書
.der: der格式的證書
.key:pem格式的私鑰
.pub:pem格式的公鑰
.req:申請證書時發(fā)送給CA認證機構(gòu)的請求文件
.csr:也表示請求文件

證書文件的格式

所有證書內(nèi)容格式有兩種:pem格式和der格式,這兩種格式的證書文件可以相互轉(zhuǎn)換,利用OpenSSL中的程序就可以完成。

PEM格式(Privacy Enhanced Mail)

pem格式的證書內(nèi)容是經(jīng)過加密的文本文件,一般是base64格式,可以用記事本來打開一個base64格式的證書,例如下面這個證書文件的內(nèi)容:

-----BEGIN CERTIFICATE-----
MIIGbzCCBFegAwIBAgIICZftEJ0fB/wwDQYJKoZIhvcNApQELBQAwfDELMAkGA1UE
BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
...
Nztr2Isaaz4LpMEo4mGCiGxec5mKr1w8AE9n6D91CvxR5/zL1VU1JCVC7sAtkdki
vnN1/6jEKFJvlUr5/FX04JXeomIjXTI8ciruZ6HIkbtJup1n9Zxvmr9JQcFTsP2c
bRbjaT7JD6MBidAWRCJWClR/5etTZwWwWrRCrzvIHC7WO6rCzwu69a+l7ofCKlWs
y702dmPTKEdEfwhgLx0LxJr/Aw==
-----END CERTIFICATE-----

補充:base64算法就是把原始數(shù)據(jù)中按照每3個字節(jié)進行拆分,3個字節(jié)是24bit,然后把24bit分成4組,每組6bit,最后在每個6bit的簽名添加2個0,這樣得到的4組字節(jié)碼就可以用ascII碼來表示了。

DER格式(Distinguished Encoding Rules)

der格式的證書文件內(nèi)容是經(jīng)過加密的二進制數(shù)據(jù),也就是說文件內(nèi)容打開后是亂碼。

X.509標準

上面說到證書中包含了必要的信息,那么這些信息在文件中并不是隨意擺放的,而是要根據(jù)固定的格式來存儲,只有這樣才能通過軟件生成或解析。那么這個固定的格式是由誰來規(guī)定的呢?這就是X.509標準與公共秘鑰證書。

X.509是一個體系、標準,用來規(guī)定一個證書的格式標準,CA認證結(jié)構(gòu)在生成證書的時候,就根據(jù)這個標準把每部分信息寫入到證書文件中。

X.509包括3個版本:V1, V2和V3。每一個版本中頒發(fā)證書時,必須包含下列信息:

版本號:用來區(qū)分版本;
系列號:由CA認證機構(gòu)給每一個證書分配一個唯一的數(shù)字編號;
算法簽名標識符:用來指定CA認證機構(gòu)在頒發(fā)證書時使用的簽名算法;
認證機構(gòu):頒發(fā)證書的機構(gòu)唯一名稱;
有效期限:證書有效期(開始時間和結(jié)束時間);
主題信息:證書持有人的基本信息;
公鑰信息:證書持有者的公鑰;
認證結(jié)構(gòu)簽名:以確保這個證書在頒發(fā)之后沒有被篡改過;

證書格式

總之:證書的核心功能就是安全的傳遞公鑰!

<上一頁  1  2  3  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

安防 獵頭職位 更多
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號