Shell 流程控制
1218
2022-05-29
【安全算法之概述】一文帶你簡要了解常見常用的安全算法
0 前言
筆者有多年從事金融POS機系統開發的經驗,對數據的安全理解較深,期間對各式各樣的安全算法也是經常打交道,現整理一些基本概念,僅供大家學習和參考。
1 算法的大致分類
這里所說的算法指的是常見的數據處理算法(國際/國標通用的那種),大致可分為:對稱加解密算法、非對稱加解密算法、信息摘要算法。下文將對這幾類算法做一個對比和總結。
2 對稱加解密算法
對稱加密算法,顧名思義,就是算法的執行過程是對稱的;用最簡單的話說,就是加密方和解密方使用的密鑰是一致的,只不過執行的過程是相反的,一方(A)對明文(P)使用密鑰K1進行加密得到密文(C),另一方(B)對密文(C)使用密鑰K2進行解密拿到明文(P’); 要想兩者的明文P和P’相等,必須保證密鑰K1等于K2,這就是對稱加密算法的基本要求。
常見的對稱算法有DES、TDES、AES、SM4、RC2/4等。
2.1 DES/TDES算法
DES全稱為Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。【摘自:百度百科 https://baike.baidu.com/item/DES/210508】
DES算法,有以下特點:密鑰長度適中、實現原理較為簡單、加解密過程較為高效。通常我們見到的DES密鑰長度為8字節,即64比特位,但是實際使用的密鑰的有效位是56比特位,即每個字節的最高位(第8、16、24、32、40、48、56、64比特位)實際都是不參與算法加解密運算的,我們稱之為校驗位,它們存在的目的是使得每個密鑰都有奇數個1。由此可知,有2組8字節不完全相同的密鑰,加解密結果是一致的這種情況是可能存在的。
算法對數據做加解密,都是以一定長度的數據塊作為輸入的;并且,對稱算法有個特點,輸入數據塊的長度一般等于密鑰的長度;也就是說,在進行DES運算(加密或解密)時,輸入的數據長度都必須是8字節。同時,在DES對稱算法中,輸出的數據長度等于輸入的數據長度,即8字節輸入8字節輸出。至此,有的童鞋會問,如果我們要執行加密的數據遠遠不止8字節呢,應該怎么辦?這個問題就已經涉及到加解密過程的數據分組問題了,常見的分組方式有ECB方式和CBC方式,后續會對這2種方式做更為詳細的介紹。
TDES全稱是Triple Data Encryption Standard,即我們常說的3DES;三重數據加密算法(TDEA,Triple Data Encryption Algorithm)。它是DES算法的加強版本。TDES的執行過程如下:其中C表示密文、P表示明文、E表示加密運算、D表示解密運算、Kx表示不同組別的密鑰。
TDES加密過程為:C=Ek3(Dk2(Ek1§))
TDES解密過程為:P=Dk1(EK2(Dk3?))
由上可知,標準的TDES的密鑰長度是24字節的,即K1-K2-K3;但在實際生產使用過程中,也常使用16字節長度的密鑰,此時密鑰的K3部分將由K1來充當,即K1-K2-K1,強制把16字節的密鑰轉換為24字節的密鑰。另一方面,從TDES加解密的過程,我們也可以發現當K1=K2,使用TDES的效果與單DES的效果是一致的。
注意的是,前面說到對稱算法加解密運算,輸入數據長度一般等于密鑰的長度,而TDES的密鑰長度是24字節,但這并不意味著執行TDES加解密時,輸入數據長度必須是24字節;相反,它的輸入數據長度還是8字節,與DES運算的輸入完全一樣。這也就是為什么說TDES是DES的加強版。同樣的8字節輸入數據經DES運算和TDES運算,通常是不一樣的,除非TDES的密鑰滿足K1=K2的關系。
2.2 AES算法
高級加密標準,全稱是Advanced Encryption Standard,縮寫:AES。在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。【摘自 百度百科 https://baike.baidu.com/item/aes/5903?fr=aladdin】它是一種不同于DES的另一類對稱算法,加密的強度比DES高,破解的難度也較大,同時實現它的加解密運算難度也高一些。
由于它也是對稱加密加密算法,所以前面對加密算法描述的特點它都有,不同的是,它的是密鑰長度有3種可能值,16字節、24字節、32字節,分別對應的密鑰強度為128比特位、192比特位和256比特位。執行加解密運算時,輸入數據的長度為16字節(128比特位),且輸出數據長度等于輸入數據長度。
2.3 SM4算法
SM算法是國密算法,國密即國家密碼局認定的國產密碼算法。主要有SM1、SM2、SM3、SM4,其中SM1 為對稱加密,其加密強度與AES相當,但該算法不公開,調用該算法時,需要通過特定的加密芯片的接口進行調用;SM4為對稱加密算法;SM3為信息摘要算法;SM2為非對稱加密算法。后續的文章會對SM算法做更為詳細的介紹。
SM4算法的特點是密鑰長度和分組長度均為128位;雖然密鑰長度跟DES類似,但加密強度卻能與AES媲美;并且在國家信息安全戰略的大背景下,國密算法的大力推廣得到了越來越多的支持。像目前國內出廠很多涉及金融安全的終端產品,如POS機、ATM機、密鑰鍵盤、金融交易后臺、商業銀行系統等等,都是強制要求必須支持國密相關算法,并且發售的機器或上線的系統都必須通過國家密碼局授權的國密認證,拿到對應的國密認證證書,才能最終商用,這或許能成為SM算法大放異彩的一個契機,若干年后指不定街邊的小小機器都在跑國密算法呢。
2.4 RC2、RC4算法
RC2是由著名密碼學家Ron Rivest設計的一種傳統對稱分組加密算法,它可作為DES算法的建議替代算法。它的輸入和輸出都是64比特。密鑰的長度是從1字節到128字節可變,但目前的實現是8字節(1998年)
RC4加密算法是大名鼎鼎的RSA三人組中的頭號人物Ronald Rivest在1987年設計的密鑰長度可變的流加密算法簇。之所以稱其為簇,是由于其核心部分的S-box長度可為任意,但一般為256字節。該算法的速度可以達到DES加密的10倍左右,且具有很高級別的非線性。
尤其RC算法的安全性比較低,在常見的安全場景下,一般都不會使用RC算法。
2.5 對稱加密算法對比總結
3 非對稱加解密算法
世界萬物都是平衡的,正如計算機的世界一樣,有0的地方就一定有1;同樣的,在算法理論上,既然有【對稱加密算法】,那肯定就會有【非對稱加密算法】。
非對稱算法,顧名思義:算法的執行過程是不對稱的,也就是說加解密雙方的密鑰是不對稱的。在非對稱算法的理論上,密鑰有公鑰和私鑰之分:其中私鑰是代表自己唯一身份的一組密鑰標識,不同的非對稱加密算法,采用不同的數學理論來標識這個“唯一性”,比如RSA算法,使用的是“很大的素數”這種方法來標識;通常來說,私鑰是不對外公開的,就好比藏在自己心里的秘密一樣,不能被外人知曉,否則,數據的加密就變得不可靠,存在密鑰泄露的風險。與私鑰對應的密鑰叫公鑰,公鑰與私鑰正好相反,它是允許對外公開的,也就是任何人都可以持有加密方的公鑰信息。看到這里,很多童鞋開始疑問:既然密鑰(公鑰)都公開了,那加密還有什么用,談何安全性可言?有這樣疑問的童鞋,大概思路還停留在【對稱加密算法】的基礎上,等我詳細講解完【非對稱加密算法】的加密和解密,你就一定明白到底是怎么一回事了。
非對稱算法的加密和解密的特點是:一段數據明文經私鑰加密后,則需要使用該私鑰對應的公鑰做解密;反之,一段數據明文經公鑰加密后,則需要使用該公鑰對應的私鑰做解密;即【公鑰加密對應私鑰解密,私鑰加密對應公鑰解密】。使用公式表達如下:其他E表示加密,D表示解密,PriKey表示私鑰,PubKey表示公鑰,A、B分別表示通訊雙方,P表示數據明文,C表示數據密文。
通訊方A 通訊方B
E(P) by PriKey[A] = C 對應 D(C) by PubKey[A] = P
E(P) by PubKey[B] = C 對應 D(C) by PriKey[B] = P
通過如上公式,我們可以很清晰的看到,通訊AB雙方需要使用非對稱算法加密通訊報文,必須想方設法獲取到對方的公鑰,這樣整個加密的通道才能完全打通。而前面我們也說到了,自己的公鑰一般都是公開的,允許任何人持有,只要保證自己的私鑰是保密的即可,這就是SSL通訊的理論基礎。在SSL通訊之前,通常會有通訊握手動作,這個握手動作就是為了取得對方可信任的公鑰,至于如何保證自己取得的公鑰就是對方的真實公鑰,而不是非法監聽報文的“中間人”的假公鑰,這就是SSL雙向認證要解決的核心問題。該部分的內容,后續會有更為詳細的文章做更近一步的介紹。
3.1 對稱加密算法與非對稱加密算法的本質區別
通過上面對非對稱算法的介紹,大家可以了解到非對稱算法核心的部分就是:密鑰分為公鑰和私鑰,私鑰保密公鑰公開,私鑰加密的密文需要使用公鑰解密,公鑰加密的密文需要私鑰解密。具體的非對稱算法和對稱算法的區別如下表所列:
3.2 非對稱加密算法的分類和對比
常見的非對稱加密算法有RSA算法、SM2算法;前者是國際通用的算法,后者是國密算法的一種。
3.2.1 RSA算法
RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。【摘自: 百度百科 RSA算法 】
RSA加密算法的密鑰長度不像我們所認知的對稱加密算法 ,它的密鑰長度是可變的,一般用位來表示,常見的有1024位和2048位,甚至4096位。密鑰的位數越長,理論上來說,解密的難度越大,加密的強度就越大。綜合加密級別和使用的便利性,【RSA2048】是我們最常見的。當RSA的密鑰位數確定了,那它的【模長】也就確定了,模長的值為密鑰位數對應的字節數;計算公式如下,其實M為模長,B為密鑰的長度:
M = (B + 7) / 8 當M等于1024位時,對應的模長為128字節;當M等于2048位時,對應的模長為256字節。
了解【模長】的概念之后,我們需要知道RSA算法執行加密解密操作時,基本的數據塊長度。在RSA算法中,執行加密和解密操作,輸入的數據塊長度都必須等于模長,否則算法內部無法處理;即RSA密鑰的長度不同,對應輸入數據塊的長度也是不同的,這一點與DES、AES等對稱加密算法是完全不一樣的。
假設我們有4個RSA接口:
RSA_prikey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
RSA_prikey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
RSA_pubkey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
RSA_pubkey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
有趣的是,當我們有一段固定的數據in,分別輸入RSA_pubkey_encrypt和RSA_pubkey_decrypt接口,得出的out居然是一樣的!同樣的在類似的私鑰接口,也有類似的現象。經過這個實驗,我么可以得出結論:根本沒有所謂的公鑰加密和公鑰解密之分,公鑰加密就是公鑰解密,私鑰加密也就是私鑰解密;所以我們應該對公鑰私鑰、加密解密做個統一叫法,應該就是私鑰運算和公鑰運算。所以以上的接口應改為:
RSA_prikey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
RSA_pubkey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
3.2.2 SM2算法
SM2算法是國產的非對稱算法,它的誕生就是為了取代RSA算法。SM2性能更優更安全:密碼復雜度高、處理速度快、機器性能消耗更小。SM2算法和RSA算法比較如下:
SM2算法與RSA算法類型,它也有公鑰和私鑰之分,它的密鑰特點是私鑰固定長度32字節,而公鑰有x和y兩個分量,每個分量都是32字節,總共是64字節。
在執行加密運算時,輸入數據塊的長度是變長的,而加密后的密文長度等于輸入長度+96字節。
在執行簽名運算時,輸入數據塊的長度也是變長的,但簽名后的數據長度則固定為64字節。
限于篇幅原因,后續再寫專門的文章來介紹SM2算法。
3.2.3 ECC算法
橢圓曲線密碼學(英語:Elliptic curve cryptography,縮寫為ECC),一種建立公開密鑰加密的演算法,基于橢圓曲線數學。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和[Victor Miller](https://baike.baidu.com/item/Victor Miller)分別獨立提出的。
ECC的主要優勢是在某些情況下它比其他的方法使用更小的密鑰——比如RSA加密算法——提供相當的或更高等級的安全。ECC的另一個優勢是可以定義群之間的雙線性映射,基于Weil對或是Tate對;雙線性映射已經在密碼學中發現了大量的應用,例如基于身份的加密。不過一個缺點是加密和解密操作的實現比其他機制花費的時間長。
安全性高:
有研究表示160位的橢圓密鑰與1024位的RSA密鑰安全性相同。
處理速度快:
在私鑰的加密解密速度上,ecc算法比RSA、DSA速度更快。
存儲空間占用小:
帶寬要求低。
第六屆國際密碼學會議對應用于公鑰密碼系統的加密算法推薦了兩種:基于大整數因子分解問題(IFP)的RSA算法和基于橢圓曲線上離散對數計算問題(ECDLP)的ECC算法。RSA算法的特點之一是數學原理簡單、在工程應用中比較易于實現,但它的單位安全強度相對較低。用國際上公認的對于RSA算法最有效的攻擊方法–一般數域篩(NFS)方法去破譯和攻擊RSA算法,它的破譯或求解難度是亞指數級的。ECC算法的數學理論非常深奧和復雜,在工程應用中比較難于實現,但它的單位安全強度相對較高。用國際上公認的對于ECC算法最有效的攻擊方法–Pollard rho方法去破譯和攻擊ECC算法,它的破譯或求解難度基本上是指數級的。正是由于RSA算法和ECC算法這一明顯不同,使得ECC算法的單位安全強度高于RSA算法,也就是說,要達到同樣的安全強度,ECC算法所需的密鑰長度遠比RSA算法低。這就有效地解決了為了提高安全強度必須增加密鑰長度所帶來的工程實現難度的問題。
根據ECC算法的數學原理,不同的橢圓參數曲線,就可以認為對應著不同的加解密方式,加解密雙方需要使用相同的橢圓參數曲線。
常見的橢圓參數曲線有:SECP256(NIST P-256)、BrainpoolP256、FRP256。
生成公私要對(ecc_generate_key_pair)
這個應用場景主要用于設備初始化,生成私鑰和公鑰。
私鑰運算(ecc_signature)
這個應用場景主要是用于數據簽名。
公鑰運算(ecc_verify)
這個應用場景主要是用于簽名驗證,即驗簽。
密鑰交互(ecc_ecdh)
這個應用場景主要是用于密鑰交換。
ECC算法的密鑰越長,安全度越高,破解的難度越大,當然運算的復雜度也較高。
一般來說,常用的ECC密鑰強度是64字節的私鑰,即所謂的256bits密鑰;
這個時候一般簽名出來的數據長度就是64字節。
3.3 非對稱加密算法的應用場景
值得注意的是,數據加解密的過程中,雖然公鑰和私鑰都可以用于加密,也都可以用于解密,并沒有嚴格的限制;但是,在實際的應用中,通常有:
私鑰加密,公鑰解密:通常應用有簽名、驗簽,即產生簽名的一方使用自己的私鑰對數據進行簽名操作,而驗簽簽名數據是否合法的一方使用簽名方的公鑰對簽名數據進行驗簽;所以這里可以簡單地認為,簽名就是私鑰加密,驗簽就是公鑰解密。
公鑰解密,私鑰解密:通常應用在對數據的加密傳輸,即加密方使用解密方的公鑰做加密動作,這樣就意味著這段加密數據只有解密方一人能解開,因為解密方的私鑰是不公開的,只有它自己知道,這樣就可以很好地保證的加密數據的安全性。
4 信息摘要算法
4.1 什么是信息摘要算法?
信息摘要算法是一種對“信息”進行【摘要化】處理的算法。通俗地來說,就好比本文,假設它很長,那么讀者在第一時間看到它的時候并不會完全閱讀全文,而是往往會先去讀一下文章的【摘要】,通過文章的摘要部分,簡要了解下文章的主要內容。類似地,在信息密碼學領域,同樣有這種的操作,這就是信息摘要算法的產生背景。
假設有一段數據(專業術語叫“消息”),經過【信息摘要算法】處理后,它將變成一段固定長度的【信息摘要】,用公式表示如下,其中M表示消息原文,D表示輸出的消息摘要,P表示信息摘要算法。
P(M with any length) = D(with fixed length)
通過公式,我們可以很直觀地看出,信息摘要算法的輸入數據長度是可以為任意長度,但是在實際使用的過程中,倘若輸入數據的長度過于長,我們會采用將輸入數據塊采用數據分組的方式一步步輸入,最后得到信息摘要結果的輸出。而輸出的信息摘要,通常都是固定長度的,至于信息摘要結果的固定長度是多少,是與具體的摘要算法相關的,下文會詳細介紹各種信息摘要算法的摘要輸出情況。
還有一點,公式中并沒有體現“加密和解密的相互過程”,也就是說【信息摘要算法是單向的,不可逆的】。嚴格來說,它并不是一種【加密】算法,僅僅是【摘要】算法。由于它計算的不可逆性,所以經信息摘要算法計算出來的信息摘要D,一定程度上就代表了信息原文M。倘若有原文M1和原文M2,經過相同的信息摘要算法P,得到相同的信息摘要D,這種情況在密碼學上,我們稱之為【碰撞】。一般而言, 好的摘要算法,沒有人能從中找到【碰撞】或者說極度難找到。雖然【碰撞】是肯定存在的(碰撞即不同的內容產生相同的摘要),但因目前信息科學發達程度非常高,計算機的運算能力得到了前所未有的提升,僅通過計算機運算的暴力破解,某些較弱的信息摘要算法就能被【碰撞】成功。
4.2 常見的信息摘要算法
常見的信息摘要算法有:MD2/4/5、SHA1/SHA224/SHA256/SHA384、SM3算法、MAC算法等。
4.2.1 MD(Message Digest):消息摘要
MD算法,是誕生于比較早的消息摘要算法,在網絡應用上也比較常見,比如在某個網站上下載一個文件,通常它會標識該文件的MD5值,當下載者完成下載文件到本地之后,使用工具對下載的文件執行MD5計算,求出一個MD5摘要值,與網站上給出的參考MD5值進行對比;如果兩者相等,則表示下載的文件是可靠的,沒有被篡改過的;反之,如果MD5值對不上,則表明下載的文件是被篡改過的,可能是網絡攻擊者投放的病毒攜帶文件或者是在下載的過程中文件出現了損壞等情況,此時應該對文件進行刪除操作。
4.2.2 SHA(Secure Hash Algorithm):安全散列
SHA系列的算法從版本上劃分有SHA-1和SHA-2;SHA-1和SHA-2是該算法的兩個不同版本。它們兩者之間在構造上(散列結果是怎樣被原始數據創建出來的)和簽名的位數上都有不同和簽名的位長。你應該把SHA-2看作是SHA-1的繼承者,因為這是一個整體上的改進。
SHA-1就是我們常見到的SHA1;SHA-2主要有SHA224、SHA256、SHA384、SHA512等等,不同的數字代表信息摘要輸出的位數。與MD系列算法類似,數字值越高表示摘要算法的安全性越高,計算的復雜性也越大;但不同于MD算法的是,SHA算法每個算法輸出的信息摘要長度是不一樣的。
SHA1,產生的信息摘要為160bits,即20字節
SHA224,產生的信息摘要為224bits,即28字節
SHA256,產生的信息摘要為256bits,即32字節
SHA384,產生的信息摘要為384bits,即48字節
SHA512,產生的信息摘要為512bits,即64字節
更為詳細的SHA算法介紹,可以參考: https://www.cnblogs.com/block2016/p/5632234.html
4.2.3 SM(Shangyong Mima):國密算法,即商用密碼
經查證,國密算法的英文字母縮寫SM,其實是【商用密碼】的中文拼音首字母簡寫。國密即國家密碼局認定的國產密碼算法,即商用密碼。
在國密算法的列表中,SM3算法就是實現了類似MD算法和SHA算法的信息摘要算法。它和其他2種摘要算法一樣,都是不同長度的信息輸入,產生固定長度的摘要輸出。不同的是,它輸出的信息摘要長度固定為256bits,即32字節。在實際使用過程中,SM3算法比較少會單獨使用,而是配合SM2【非對稱加密算法】配合使用,實現數字驗簽和消息驗簽的應用。
4.3.4 MAC(Message Authentication Code):消息認證碼
MAC算法不同于以上3種信息摘要算法;MAC算法是帶密鑰的Hash函數:消息的散列值由只有通信雙方才知道的秘密密鑰K來控制。此時Hash值稱作MAC。表達公式如下所示,其中M表示信息原文,P表示MAC算法,MAC表示輸出的MAC值,K表示MAC密鑰:
P(M with any length) by K = MAC(with fixed length)
通過公式我們可以發現,計算MAC通常會有KEY的參與,那么在信息安全通訊領域,接收方要想驗證收到的數據是否正確,就需要利用以上公式,輸入MAC密鑰重新計算一遍MAC值,然后對比計算值和收到的MAC值;若相等才認為數據是合法。這里涉及到一個MAC KEY,發送方和接收方對相同的數據進行MAC運算,能得到相同MAC值的前提,除了兩者需使用相同的MAC算法外,還需要保證兩者的MAC KEY是一致的(通常計算MAC采用的是對稱加密算法)。至于,在實際生產應用過程中,如何保證兩者的MAC KEY是一致的,或者說MAC KEY是如果從一方傳遞到另一方的,這又是另一個話題,這種應用場景,在POS機與銀行后臺信息交互的安全性,就是利用MAC KEY的。
MAC算法是一個統稱,它很多種實現,在POS行業,常用的MAC算法有CUP模式、EMV2000模式、或者自定義形式的MAC算法。MAC算法的核心是如何將輸入數據分組,利用MAC KEY做一些XOR、移位、加密等操作,使得輸入數據散列化,最后再利用MAC KEY執行加密操作(通常為對稱加密)得到MAC值。
值得注意的是,雖然MAC算法有MAC KEY的參與,但是它計算過程依然是單向的,不可逆的,這也是為什么會把它歸為【信息摘要算法】的主要原因。
4.3.4 常見信息摘要算法的對比
注:表中*表示輸入長度為“任意值”;此處的任意值,通常也是有限制的,比如SHA256,*應小于2的64次方,而SHA512,*應小于2的128次方。
4.3 信息摘要算法的應用場景
常見的信息摘要算法的應用場景有以下幾種:
4.3.1 網絡文件下載
前面也簡單提到了,在網絡文件下載的時候,通常會有附上對應下載文件的摘要值,常用的是MD5或SHA1值;這個主要目的是給下載者在下載完網絡文件后,做最后的文件正確性和完整性的確認。如果計算出來的摘要值,與網站上的摘要不相等,我們應認為下載的文件是不可信任的,應當做刪除處理。
4.3.2 數字簽名和信息驗簽
在產生數學簽名的過程中,通常會有一步是對輸入數據原文做摘要運算,這樣做的主要目的是將輸入數據原文迷你化。由于經摘要算法處理后,信息摘要的長度都是一定的,所以在做簽名運算的時候,只需要對信息摘要做簽名運算,在一定程度上就是輸入信息的原文做簽名運算。輸入數據簽名后,發送方會將簽名數據附在輸入信息的尾部,一同發送給接收方。而在驗簽流程中,接收方收到發送方的信息原文和簽名值,首先需要做的是根據雙方協商的信息摘要算法,做同樣的摘要運算,得到摘要值M’,然后使用密鑰對簽名數據進行解密運算,得到發送方的摘要M;如果M’ = M,則表示驗簽通過,接收的數據是可任性的。
關于數字簽名的具體細節,后續會有更為詳細的文章做更進一步的介紹,比如常見的簽名算法是怎么工作的,等等。
4.3.3 安全報文傳輸
這種應用場景,主要是MAC算法的應用,最常見的就是POS與銀行后臺的報文傳輸。由于涉及到金融風險,所以在POS機與銀聯后臺通訊的過程中,除了對個人賬戶的敏感信息(如卡號、卡密碼)等做加密處理外,還需要對整一個通訊報文做MAC計算,在發送報文的時候,MAC值附在原始的密文后面以供接收方對接收的密文做MAC校驗。至于為何要這樣做,就是為了保證通訊報文的其他信息要素不能被篡改,比如消費的金額。試想下,如果你在超市消費了1.00元,但是由于報文被截取了,攻擊者將報文中的消費金額篡改為100.00元;這種情況下,除非報文攻擊者拿到了POS與銀行后臺通訊的MAC KEY,否則它計算出來的MAC值必定與銀行后臺計算的MAC值對不上,進而被銀行后臺當做非法報文,做丟棄處理。但如果銀行后臺沒有MAC值校驗這一步操作,那么對于消費者而言,就是明明消費了1.00元卻被扣款100.00元;這個后果將變得不堪設想。
5 非對稱算法和信息摘要算法的核心應用:數字簽名和消息驗簽
5.1 數字簽名是什么?
簽名,一個在日常生活中,很經常聽到并使用的名字。在平時,我們經常會簽署各式各樣的文件,在我國的法律中,親筆簽名在一定程度上是具有法律效力的,表示當事人對簽署的文件知悉并且認可,一旦“簽名”生成后,它具備了法律意義。又比如,我們在POS機消費后打印的消費單據上簽署自己的姓名,則表示持卡人認同這筆消費交易,銀行或收單機構拿到這張經消費者簽名的單據,就可以完全最終消費款項的清算。在我國,POS機消費時,大部分時候,我們都要輸入銀行卡密碼,打印消費單據后還需要簽署自己的姓名;而在國外,由于他們的征信系統較為發達,往往在POS機消費時,是不需要輸入銀行卡密碼的,而消費的唯一憑證確認,就是消費單據上簽署的簽名。在此種情況下POS機的操作員,有義務確認消費者簽署的姓名與卡片背部的參照簽名筆跡是否一致;同時,操作員也有權利,當發現消費者簽署的姓名筆跡與卡片后背簽名筆跡差異較大時,拒絕此卡片消費。通過以上的一些生活例子,我們可以了解到【簽名】是一個很重要的玩意,一定程度就代表了本人的認可和無異議。
那么,在數字信息領域,究竟什么是【數字簽名】呢?數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用于鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。數字簽名,就是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。(摘自: 百度百科 數字簽名)。
從密碼學的角度來說,【數字簽名】主要解決了兩個核心問題:發送的消息是完整的,未被篡改的;接收的消息一定就是對應發送者發送的,別人無法仿制。前者體現的是數據的完整性,后者體現的是數據的不可抵賴性。
5.2 為什么數字簽名采用非對稱算法和信息摘要算法?
從上一小結,我們可以知道【數字簽名】的兩個核心特點:不可抵賴性和完整性。通過對之前學習的非對稱加密算法和信息摘要算法的基礎知識一對比,我們可以發現:
非對稱加密算法正好解決了不可抵賴性的問題,因為在非對稱算法體系中,經私鑰加密的數據只有私鑰對應的公鑰才能解開,別人的公鑰是無法解密出原文的,這就是不可抵賴的體現,即任何人都無法冒充發送者。
信息摘要算法恰好解決了數據完整性的問題,因為在信息摘要算法中,不同的數據輸入,產生的摘要是不一樣的;當摘要數據一樣時,我們就可以認為數據原文是一致的,也就認可了數據是完整的,沒有被篡改的。
兩者一結合,恰好就誕生了【數字簽名】這個最佳實踐,達到了數據傳輸中不可修改性的安全要求。
5.3 數字簽名的操作過程
前面的講解,我們知道了【數字簽名】的特性。在實際的應用過程中,數字簽名的應用公式如下所示,其中M表示消息原文,S表示數字簽名,P表示非對稱算法的私鑰運算,D表示信息摘要算法的運算。
P(D(M [with any length])) = S [with fixed length]
具體來說,發送方產生一個數據簽名,需要經過以下幾個步驟:
使用【信息摘要算法】,對任意長度的信息原文做摘要運算,得到一段固定長度的摘要數據;
如果該摘要數據的長度,沒有達到非對稱加密算法做加解密運算的輸入長度,通常還需要使用填充標準對摘要數據進行必要的填充,以達到非對稱算法的運算條件;常用的填充標準有PKCS1-padding;
使用【非對稱加密算法】的私鑰對填充后的摘要數據做加密運算,得到一段固定長度的數字簽名;
發送方將數字簽名拼接在信息原文的尾部,一同發送給接收方,完成數據的單方向傳輸。
經過以上的步驟后,發送方就成功將信息原文和對應的數字簽名,傳遞給了接收方;剩余的事,就是接收方對數據的驗簽操作。
5.4 消息驗簽的操作過程
接收方收到發送方發送的數據報文(信息原文+數字簽名)后,需要經歷以下步驟來完成對報文消息的驗簽操作:
首先,對數據報文進行分解,提取出信息原文部分和數字簽名部分;
與產生數字簽名流程一樣,使用相同的信息摘要算法對信息原文做摘要運算,得出消息原文的摘要D1;
與產生數字簽名流程相反,使用【非對稱加密算法】中簽名私鑰對應的公鑰對數字簽名部分做解密運算,解密后得到原始發送方發送的經填充后的摘要D2;
與產生數字簽名流程相反,使用相同的數據填充標準對摘要D2做去填充操作,得到原始消息的附帶的摘要D3;
比較D3和D1;如果兩者相等,則表示對數字簽名的驗簽是OK的,消息原文的數據是可信任的;反之,若D3不等于D1,則可以認為消息原文是不可信任的,數字簽名中的【完整性】和【不可抵賴性】可能遭到了破壞;我們應該摒棄信息原文。
5.5 數字簽名算法的分類
數字簽名算法,就是使用RSA、MD5、SM2、SHA、SM3等非對稱算法和信息摘要算法進行混搭組合。數字簽名算法的基本表示格式為:xxxWithYYYEncryption,其中xxx表示信息摘要算法,yyy表示非對稱加密算法。常見有的以下幾種:
md5WithRSAEncryption:摘要運算采用MD5,非對稱算法使用RSA;
sha1WithRSAEncryption:摘要運算采用SHA1,非對稱算法使用RSA;
sha256WithRSAEncryption:摘要運算采用SHA256,非對稱算法使用RSA;【常用】
sm3WithSM2Encryption:摘要運算采用SM3,非對稱算法使用SM2。
5.6 數字簽名的核心應用場景:https網絡通訊
經以上的各小結,我們基本掌握了數字簽名的主要內容,這一小節,我們介紹下數字簽名的核心應用:https網絡通訊。
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本傳輸安全協議),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
由它的定義可知,要想實現https,除了應用層需要有http的支持,還需要在傳輸層支持SSL。SSL正是為了解決網絡通訊的安全性問題而誕生的,簡單的說,通過SSL的加入,在瀏覽器和網頁服務器之間的數據都是加密的,而不像之前http那樣,數據完全在網絡上裸奔。目前網絡安全問題越來越突出,越來越多的網絡信息泄露的案例爆發出來,正是由于這些安全性問題的暴露,SSL的應用得到了越來越多的支持。
限于篇幅原因,本小結不對SSL的具體細節做闡述,僅僅是簡要描述數字簽名在SSL中的應用方法;后續筆者會寫一篇專門的文章來進一步解釋SSL通訊的前前后后,敬請關注。
說到數字簽名在SSL的應用,它主要是幫助發送方和接收方協商必要的數據,比如網絡通訊的加密密鑰。我們知道,網絡數據是龐大的,而非對稱算法的加密速度是遠遠比對稱加密算法慢的,所以在網絡通訊的報文不太適合直接使用非對稱算法做加密,比較合適的做法的通訊報文還是采用對稱加密算法加密,但是對稱加密算法使用的對稱密鑰是發送方和接收方在正式通訊前進行在線協商的;密鑰協商的過程使用數字簽名的技術,保證協商的密鑰是完整的(保證是沒被篡改的),并且是不可抵賴的(保證是發送方的)。在密鑰協商時,通訊雙方分別利用自己的私鑰和公鑰,結合數字簽名技術,完成協商動作。
上面講消息驗簽的時候,我們提到消息驗簽必須要使用簽名方的公鑰做解密運算,這個公鑰一定程度上代表了簽名方的身份;但是,我們如何知道我們拿到的公鑰,就是我們認為的那個簽名方的公鑰,而不是網絡攻擊“中間人”的公鑰呢?這就需要CA (Certificate Authority)幫助我們確認這個公鑰的合法性。具體的做法是,我們拿到簽名方的公鑰時,它并不僅僅是一個公鑰,而公鑰+經CA簽名的數字簽名,這叫做公鑰證書。我們對公鑰證書,先用CA的公鑰對公鑰證書的數字簽名進行驗簽,如果驗簽成功,則表示我們拿到的公鑰是可信任的。那么,CA的公鑰,我們又通過誰來保證它是可信任的呢?
這似乎是一個無窮無盡的問題?究竟是怎么回事呢?筆者在這里先賣個關子,有興趣的讀者,可以關注筆者后續有關SSL通訊的詳細介紹。
6 更多分享
歡迎關注我的github倉庫01workstation,日常分享一些開發筆記和項目實戰,歡迎指正問題。
同時也非常歡迎關注我的CSDN主頁和專欄:
【CSDN主頁:架構師李肯】
【RT-Thread主頁:架構師李肯】
【C/C++語言編程專欄】
【GCC專欄】
【信息安全專欄】
【網絡編程專利】
【RT-Thread開發筆記】
【freeRTOS開發筆記】
有問題的話,可以跟我討論,知無不答,謝謝大家。
數據加密服務 通用安全
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。