上一篇課程中我們了解到的是很多關(guān)于信息系統(tǒng)安全的概念、等級(jí)、分類等內(nèi)容,今天的部分則更偏向于具體實(shí)現(xiàn)的技術(shù)。
為了保證信息的安全性(即秘密性、完整性和可用性)需要采用信息加密技術(shù)對(duì)信息進(jìn)行偽裝,使得信息非法竊取者無(wú)法理解信息的真實(shí)含義;需要采用加密算法提取信息的特征碼(校驗(yàn)碼)或特征矢量,并與有關(guān)信息封裝在一起,信息的合法擁有者可以利用特征碼對(duì)信息的完整性進(jìn)行校驗(yàn);需要采用加密算法對(duì)信息使用者的身份進(jìn)行認(rèn)證、識(shí)別和確認(rèn),以對(duì)信息的使用進(jìn)行控制。
其實(shí)說(shuō)白了,就是三件事,一個(gè)加密混淆讓別人看不懂,另一個(gè)加密解密雙方能看懂,最后一個(gè)權(quán)限控制不讓別人看。從這三件事可以看出,加解密技術(shù)是非常關(guān)鍵的內(nèi)容。加密就是把明文內(nèi)容弄成一堆亂七八糟正常人看不懂的數(shù)據(jù),然后解密就是把這堆東西再還原回?cái)?shù)據(jù)明文的過程。在這個(gè)過程中,就會(huì)牽涉到一系列的算法問題。我們接下來(lái)就來(lái)看一下比較常見的那些加解密方式,最后我們也會(huì)提到一些權(quán)限控制方面的內(nèi)容。
對(duì)稱加密采用了對(duì)稱密碼編碼技術(shù),特點(diǎn)是文件加密和解密使用相同的密鑰,即加密密鑰是可以當(dāng)做解密密鑰來(lái)使用的。這個(gè)和我們下面要說(shuō)的 非對(duì)稱加密 都會(huì)有一個(gè) 密鑰 的概念,密鑰是一個(gè)加密算法中的控制部分,能夠控制加密算法最后生成的密文結(jié)果,而且往往在解密中也扮演重要的角色。比如說(shuō)這個(gè)對(duì)稱加密,不管加還是解,都是使用同一套密鑰的,如果密鑰不對(duì),解密的結(jié)果也不會(huì)正確。
由于密鑰固定,算法簡(jiǎn)單,對(duì)稱加密的效率比較高、速度也比較快,但是相對(duì)來(lái)說(shuō)可能是不太安全的,因?yàn)榘呀饷苊荑€交給客戶終端實(shí)際上也等于是將加密密鑰給了客戶。在這種情況下,很容易通過反編譯等手段獲得客戶端代碼中的密鑰信息,非常不安全。而且,在下發(fā)也就是客戶第一次獲取密鑰的過程中,也可能會(huì)有中途被竊取的可能性。
對(duì)稱加密比較出名的包括:AES、DES、3DES、RC-5、IDEA等算法。相信 AES 和 DES 還是非常普及的,使用過的同學(xué)應(yīng)該也是比較多的,各個(gè)編程語(yǔ)言也都有非常簡(jiǎn)單地實(shí)現(xiàn)函數(shù)。
上面對(duì)稱加密我們知道是加密方和解密方都持有的是相同的一個(gè)密鑰用于加解密。那么其實(shí)非對(duì)稱加密你也能夠猜到,就是雙方持有的是不同的密鑰?;舅枷胧菍鹘y(tǒng)密碼的密鑰一分為二,也就是我們經(jīng)常會(huì)見到的 公鑰 和 私鑰 。通常,我們會(huì)用公鑰加密數(shù)據(jù),然后用私鑰來(lái)解密數(shù)據(jù),公鑰我們會(huì)發(fā)送給客戶,然后他們傳送給我們的信息就是用我們的公鑰加密的,只有我們自己能解開并獲得明文原文。同樣,我們要發(fā)給客戶的數(shù)據(jù),也使用客戶給我們的公鑰來(lái)進(jìn)行加密,數(shù)據(jù)發(fā)送給他們之后,他們也會(huì)使用他們自己的私鑰來(lái)解密。如果我們使用的不是他們的公鑰,那么數(shù)據(jù)也是無(wú)法被他們自己的私鑰解密的。
非對(duì)稱加密是不是感覺非常美好?但是,這個(gè)算法優(yōu)秀的安全性也是由代價(jià)換來(lái)的,它的計(jì)算量大,破解很難,相對(duì)的,效率也會(huì)比較差,完全無(wú)法和對(duì)稱加密的速度相媲美。
非對(duì)稱加密最常見的,也是現(xiàn)在基本已經(jīng)成為事實(shí)標(biāo)準(zhǔn)的,就是 RSA 算法。它是一種基于 大合數(shù)因子分解困難性 的原理而生成公開密鑰密碼的方式。我們?nèi)粘J褂玫?OpenSSL 生產(chǎn)的公私鑰,Linux/Github 的安全公鑰登錄,還有現(xiàn)在已經(jīng)完全普及的 HTTPS 等等應(yīng)用,都是基于 RSA 。
哈希算法(Hash)將任意長(zhǎng)度報(bào)文 M 映射為定長(zhǎng)的 Hash 碼 h ,也叫做 散列算法 。它的目的主要是生成指定數(shù)據(jù)、文件或數(shù)據(jù)塊的“系統(tǒng)”,也就是我們的 h 哈希碼。最常見的就是 MD5 和 SHA1 這兩種算法。這個(gè)算法是一種單向算法,也就是說(shuō),我們可以加密,但是無(wú)法解密。當(dāng)然,現(xiàn)在有彩虹表這種半人工的 Hash 數(shù)據(jù)庫(kù)可以用做 Hash 解密,但只要我們?cè)诩用軘?shù)據(jù)的時(shí)候略加變化,這個(gè)解密就非常難實(shí)現(xiàn)了。
哈希算法應(yīng)用最最常見的場(chǎng)景就是用戶密碼的加密。這個(gè)加密最好還不只是一次簡(jiǎn)單的 MD5 ,最后還能多套幾次 MD5 并且加 SALT 值。嗯,說(shuō)得可能比較專業(yè),開發(fā)同學(xué)可能都會(huì)明白什么意思,如果您不是開發(fā)同學(xué),那這一段不用管它。
簽名,就是證明當(dāng)事人的身份和數(shù)據(jù)真實(shí)性的一種信息。這個(gè)東西我們?cè)诤芏嘞螺d網(wǎng)站都會(huì)看到。當(dāng)你下載某個(gè)軟件的時(shí)候,這個(gè)下載頁(yè)面都會(huì)有一個(gè) MD5 校驗(yàn)碼,然后你下載的軟件可以使用一些 MD5 校驗(yàn)軟件獲得校驗(yàn)碼,如果是一樣的,就證明你下載的軟件是沒有問題的,而且也是完整的,和網(wǎng)站上的是同一款軟件。在這個(gè)過程中,這個(gè) MD5 校驗(yàn)碼其實(shí)就是一個(gè)雙方需要對(duì)應(yīng)的簽名。
同理,在信息傳輸?shù)倪^程中,如何確保對(duì)方和你所接收的數(shù)據(jù)都沒有問題呢?加一個(gè)數(shù)字簽名唄。這個(gè)數(shù)字簽名可以是 MD5 的哈希串,也可以是 RSA 的加密數(shù)據(jù),這都沒有問題,但目的只有一個(gè),就是你和你通信的對(duì)方,你們兩個(gè)對(duì)這個(gè)簽名可以達(dá)成共識(shí)。因此,這個(gè)數(shù)字簽名有保證信息傳輸?shù)耐暾?、提供發(fā)送者的身份驗(yàn)證以及防止交易中的抵賴情況發(fā)生的作用。
完整的數(shù)字簽名需要滿足三個(gè)條件,分別是:簽名者事后不能抵賴自己的簽名;任何其他人不能偽造簽名;有公正的仲裁解決真?zhèn)螁栴}。
在講數(shù)字簽名時(shí),往往還有一個(gè)更重要的內(nèi)容是我們不能錯(cuò)過的,那就是 數(shù)字信封 技術(shù)。它是將對(duì)稱密鑰通過非對(duì)稱加密(即:有公鑰和私鑰兩個(gè))的結(jié)果分發(fā)對(duì)稱密鑰的方法。什么意思呢?其實(shí)它就是結(jié)合上面我們學(xué)習(xí)過的對(duì)稱和非對(duì)稱加密兩種加密方式的特點(diǎn)而形成的一種獨(dú)特的數(shù)據(jù)安全傳輸?shù)姆绞健?/p>
前面我們提到過,對(duì)稱加密速度快,但是不安全,因?yàn)槊荑€在傳輸過程中以及在對(duì)端不可控都會(huì)帶來(lái)安全隱患。但是,這里需要注意一點(diǎn),這個(gè)對(duì)稱密鑰是我們控制的呀,而且往往這個(gè)對(duì)稱密鑰都不會(huì)太長(zhǎng),一般會(huì)是一些隨機(jī)的字符串,取 8、16、32、64 位長(zhǎng)度的字符串就夠了。那么,我們可以用非對(duì)稱加密來(lái)加密這個(gè)字符串。非對(duì)稱加密的特點(diǎn)是安全性高但速度慢,如果數(shù)據(jù)內(nèi)容非常少的話,其實(shí)它的計(jì)算效率還是可以接受的,即使是 128、256、512 個(gè)字符的對(duì)稱密鑰其實(shí)使用非對(duì)稱加密速度也是很快的。這樣,我們就形成了下圖這樣一個(gè)流程。
首先,發(fā)送方將 明文 數(shù)據(jù)通過 對(duì)稱密鑰 進(jìn)行加密,變成 密文 數(shù)據(jù)。
然后,來(lái)到左圖的下方,將 對(duì)稱密鑰 使用 對(duì)方的公鑰 進(jìn)行加密,變成一個(gè) 被加密過的密鑰 。
接著將 密文 和 被加密的密鑰 一起發(fā)送給接收方。
接收方首先通過 自己的私鑰 解密 被加密的密鑰 ,這樣就獲得了 對(duì)稱密鑰 。
最后,使用解密出來(lái)的 對(duì)稱密鑰 來(lái)解密 密文 獲得原始的 明文 數(shù)據(jù)。
上面這個(gè)過程務(wù)必要弄清楚,因?yàn)樗彩俏覀兘裉熳钪匾膬?nèi)容。類似于我們真實(shí)的普通信封寄信,普通信封在法律的約束下保證只有收信人才能閱讀信的內(nèi)容;數(shù)字信封則采用密碼技術(shù)保證了只有規(guī)定的接收人才能閱讀信息的內(nèi)容。
同樣的,如果接收方想要給發(fā)送方發(fā)送信息,只需要調(diào)換它們的位置就好,也就是接收方變成發(fā)送方,中間的步驟還是完全一樣的。雙方都要持有對(duì)方的公鑰證書,說(shuō)到這個(gè)問題,正好引出我們下面的內(nèi)容,那就是公鑰證書體系。
公鑰基礎(chǔ)設(shè)施 PKI(Public Key Infrastucture,公開密鑰基礎(chǔ)設(shè)施)是以不對(duì)稱密鑰加密技術(shù)為基礎(chǔ),以數(shù)據(jù)機(jī)密性、完整性、身份認(rèn)證和行為不可抵賴性為安全目的,來(lái)實(shí)施和提供安全服務(wù)的具有普適性的安全基礎(chǔ)設(shè)施。它包括 數(shù)字證書、不對(duì)稱密鑰密碼技術(shù)、認(rèn)證中心、證書和密鑰的管理、安全代理軟件、不可否認(rèn)性服務(wù)、時(shí)間郵戳服務(wù)、相關(guān)信息標(biāo)準(zhǔn)、操作規(guī)范等。
PKI 可以實(shí)現(xiàn) CA 和證書的管理,密鑰的備份與恢復(fù),證書、加密密鑰和簽名密鑰的分割,支持對(duì)數(shù)字簽名的不可抵賴性,密鑰歷史的管理等功能。其中,CA 就是 Certification Authority 認(rèn)證中心的簡(jiǎn)寫。配置過網(wǎng)站 HTTPS 的同學(xué)對(duì)這個(gè)東西一定不會(huì)陌生的。前面說(shuō)過,HTTPS 的基礎(chǔ)就是 OpenSSL 生成的加密公私鑰,那么我們自己生成的證書為什么不能直接使用配置到我們的網(wǎng)站上呢?其實(shí)是可以的,不信你可以試試,但是,我們的瀏覽器不認(rèn)啊。你的生成的證書是沒有問題,但是我們沒有辦法相信你,各個(gè)瀏覽器廠商需要有一些中間機(jī)構(gòu),并且是有信譽(yù)資質(zhì)的中間機(jī)構(gòu)來(lái)提供擔(dān)保,這些機(jī)構(gòu)其實(shí)就是實(shí)現(xiàn)了 PKI 的公司。而我們?cè)诟鱾€(gè)域名注冊(cè)商購(gòu)買的證書也都是由它們生成的,并且它們還有公鑰管理系統(tǒng)負(fù)責(zé)分配給客戶端的公鑰。這樣,就實(shí)現(xiàn)了一個(gè)包括第三方認(rèn)證并且可以做仲裁方的“公證人”機(jī)構(gòu)。
PKI 一般是通過數(shù)字證書的方式向客戶端或者對(duì)端發(fā)送公私鑰。數(shù)字證書其實(shí)可以看成是又一層加密的數(shù)據(jù),根據(jù)證書規(guī)則及相關(guān)的設(shè)置可以從證書中提取出主體信息、證書序號(hào)、有效期、密碼算法標(biāo)識(shí)、公私鑰信息等內(nèi)容。常見的證書格式有 X.509系列、PKCS系列、DER、PEM 等,這一塊做過開發(fā)的同學(xué)也不會(huì)陌生。
認(rèn)證(Authentication),又稱為鑒別、確認(rèn),它是證實(shí)某事是否名副其實(shí)或者是否有效的一個(gè)過程。認(rèn)證這個(gè)東西也是我們非常常見的,比如說(shuō)你登錄各個(gè)網(wǎng)站或者 App 的賬號(hào),你的網(wǎng)游賬號(hào)等等,在這些賬號(hào)體系中,都會(huì)有認(rèn)證授權(quán)功能的存在。比如說(shuō),為什么你登錄進(jìn)淘寶看到的是你自己的購(gòu)物訂單,而看不到別人的購(gòu)物訂單。這就是因?yàn)槟愕馁~號(hào)通過了屬于你的身份的認(rèn)證,而沒有其他人的身份認(rèn)證,當(dāng)然就不能看到別人的訂單啦,如果要是能看到那才真是亂了套了。
認(rèn)證系統(tǒng)常用的參數(shù)有口令、標(biāo)識(shí)符、密鑰、信物、智能卡、指紋、視網(wǎng)紋等。它與數(shù)字簽名的區(qū)別主要有:
認(rèn)證總是基于某種收發(fā)雙方共享的保密數(shù)據(jù)來(lái)認(rèn)證被鑒別對(duì)象的真實(shí)性,而數(shù)字簽名中用于驗(yàn)證簽名的數(shù)據(jù)是公開的。
認(rèn)證允許收發(fā)雙方互相驗(yàn)證其真實(shí)性,不準(zhǔn)許第三者驗(yàn)證,而數(shù)字簽名允許收發(fā)雙方和第三者都能驗(yàn)證。
數(shù)字簽名具有發(fā)送方不能抵賴、接收方不能偽造和具有在公證人前解決糾紛的能力,而認(rèn)證則不一定具備。
對(duì)于訪問控制來(lái)說(shuō),一定是跟登錄有關(guān)的,如果沒有登錄過程,那么就無(wú)法知道你這個(gè)用戶應(yīng)該是有哪些權(quán)限,也就無(wú)法通過這些權(quán)限信息來(lái)進(jìn)行訪問的控制。在登錄之后,我們常見的網(wǎng)絡(luò)授權(quán)方案包括以下 4 種:
DAC(Discretionary Access Control)自主訪問控制方式:該模型針對(duì)每個(gè)用戶指明能夠訪問的資源,對(duì)于不在指定的資源列表中的對(duì)象不允許訪問。
ACL(Access Control List)訪問控制列表:該模型是目前應(yīng)用最多的方式。目標(biāo)資源擁有訪問權(quán)限列表,指明允許哪些用戶訪問。如果某個(gè)用戶不在訪問控制列表中,則不允許該用戶訪問這個(gè)資源。
MAC(Mandatory Access Control)自主訪問控制方式:該模型在軍事和安全部門中應(yīng)用較多,目標(biāo)具有一個(gè)包含等級(jí)的安全標(biāo)簽(如:不保密、限制、秘密、機(jī)密、絕密);訪問者擁有包含等級(jí)列表的許可,其中定義了可以訪問哪個(gè)級(jí)別的目標(biāo),例如允許訪問秘密級(jí)信息,這時(shí)秘密級(jí)、限制級(jí)和不保密級(jí)的信息是允許訪問的,但機(jī)密和絕密級(jí)信息不允許訪問。
RBAC(Role-Based Access Control)基于角色的訪問控制方式:該模型首先定義一些組織內(nèi)的角色,如局長(zhǎng)、科長(zhǎng)、職員,再根據(jù)管理規(guī)定給這些角色分配相應(yīng)的權(quán)限,最后對(duì)組織內(nèi)的每個(gè)人根據(jù)具體業(yè)務(wù)和職位分配一個(gè)或多個(gè)角色。
其實(shí)不用我多說(shuō),現(xiàn)在大部分的比較復(fù)雜一點(diǎn)的后臺(tái)管理系統(tǒng)基本都是 RBAC 為主的,而一些小的比如說(shuō)小網(wǎng)站、官方網(wǎng)站之類的后臺(tái),直接使用 ACL 就可以了(就是用戶和目錄對(duì)應(yīng)上,哪些用戶有哪些目錄就在右邊目錄菜單就只展示這些目錄這種最簡(jiǎn)單的權(quán)限管理功能)。
總算到結(jié)尾了,你以為惡夢(mèng)結(jié)束了?不不不,今天的內(nèi)容基本都是重點(diǎn)。特別是對(duì)稱和非對(duì)稱加密、數(shù)字信封、PKI 和 訪問控制 這四個(gè)部分。如果你沒有接觸過開發(fā),那么這一篇估計(jì)是很崩潰的,一點(diǎn)也不亞于之前我們學(xué)習(xí)的計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)的內(nèi)容。即使很多做開發(fā)的同學(xué),如果沒有接觸過類似的加解密以及相關(guān)安全網(wǎng)絡(luò)傳輸?shù)臉I(yè)務(wù),估計(jì)也會(huì)有一點(diǎn)慒圈。就和其它的知識(shí)一樣,光加解密技術(shù)就可以寫一本厚厚的書,更不用說(shuō)整個(gè)信息安全體系了。所以,我們這才只是入個(gè)門,沾了點(diǎn)信息安全的皮毛而已,還是那句話,不管你是考試還是當(dāng)做談資,記下來(lái)多少還是會(huì)有好處的。
如果你有開發(fā)經(jīng)驗(yàn),可以看一下我之前的 PHP 加解密 相關(guān)的系列文章:https://www.zyblog.com.cn/t/加解密
參考資料:
《信息系統(tǒng)項(xiàng)目管理師教程》
《某機(jī)構(gòu)培訓(xùn)資料》
聯(lián)系客服