程序員必備基礎:加簽驗簽
密碼學相關概念
明文、密文、密鑰、加密、解密
-
明文:指沒有經過加密的信息/數據。
密文:明文被加密算法加密之后,會變成密文,以確保數據安全。
密鑰:是一種參數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的參數。密鑰分為對稱密鑰與非對稱密鑰。
加密:將明文變成密文的過程。
解密:將密文還原為明文的過程。
對稱加密、非對稱加密
對稱加密:加密和解密使用相同密鑰的加密算法。
非對稱加密:非對稱加密算法需要兩個密鑰(公開密鑰和私有密鑰)。公鑰與私鑰是成對存在的,如果用公鑰對數據進行加密,只有對應的私鑰才能解密。
什么是公鑰私鑰?
公鑰與私鑰是成對存在的密鑰,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。
其實,公鑰就是公開的秘鑰,私鑰就是要你私自保存好的秘鑰。
非對稱加密算法需要有一對公私鑰~
?假設你有一個文件,你用字母a加密,只有字母b才能解密;或者你用b加密,只有a才能解密,那么a和b就是一對公私鑰。如果密鑰a公開,密鑰b你就要私自保存好啦,這時候密鑰a就是公鑰,密鑰b就是私鑰。相反,如果b公開,a就要保存好,這時候呢,秘鑰b就是公鑰,秘鑰a就是私鑰。?
加簽驗簽概念
「加簽」:用Hash函數把原始報文生成 報文摘要,然后用私鑰對這個摘要進行加密,就得到這個報文對應的數字簽名。通常來說呢,請求方會把「數字簽名和報文原文」一并發(fā)送給接收方。
「驗簽」:接收方拿到原始報文和數字簽名后,用「同一個Hash函數」從報文中生成摘要A。另外,用對方提供的公鑰對數字簽名進行解密,得到摘要B,對比A和B是否相同,就可以得知報文有沒有被篡改過。
為什么需要加簽驗簽
上小節(jié)中,加簽和驗簽我們已經知道概念啦,那么,為什么需要加簽和驗簽呢?有些朋友可能覺得,我們不是用「公鑰加密,私鑰解密」就好了嘛?
接下來呢,舉個demo吧。
?假設現在有A公司,要接入C公司的轉賬系統(tǒng)。在一開始呢,C公司把自己的公鑰寄給A公司,自己收藏好私鑰。A公司這邊的商戶,發(fā)起轉賬時,A公司先用C公司的公鑰,對請求報文加密,加密報文到達C公司的轉賬系統(tǒng)時,C公司就用自己的私鑰把報文揭開。假設在加密的報文在傳輸過程中,被中間人Actor獲取了,他也郁悶,因為他沒有私鑰,看著天鵝肉,又吃不了。本來想修改報文,給自己賬號轉一個億的,哈哈。這個實現方式看起來是天衣無縫,穩(wěn)得一匹的。?
但是呢,如果一開始,C公司把公鑰發(fā)給公司A的時候,就被中間人Actor獲取到呢,醬紫就出問題了。
?中間人Actor截取了C的公鑰,他把自己的公鑰發(fā)給了A公司,A誤以為這就是C公司的公鑰。A在發(fā)起轉賬時,用Actor的公鑰,對請求報文加密,加密報文到在傳輸過程,Actor又截取了,這時候,他用自己的私鑰解密,然后修改了報文(給自己轉一個億),再用C的公鑰加密,發(fā)給C公司,C公司收到報文后,繼續(xù)用自己的私鑰解密。最后是不是A公司的轉賬賬戶損失了一個億呢~?
C公司是怎么區(qū)分報文是不是來自A呢,還是被中間人修改過呢?為了表明身份和報文真實性,這就需要「加簽驗簽」啦!
?A公司把自己的公鑰也發(fā)送給C公司,私鑰自己保留著。在發(fā)起轉賬時,先用自己的私鑰對請求報文加簽,于是得到自己的數字簽名。再把數字簽名和請求報文一起發(fā)送給C公司。C公司收到報文后,拿A的公鑰進行驗簽,如果原始報文和數字簽名的摘要內容不一致,那就是報文被篡改啦~?
有些朋友可能有疑問,假設A在發(fā)自己的公鑰給C公司的時候,也被中間人Actor截取了呢。嗯嗯,我們來模擬一波Actor又截取了公鑰,看看Actor能干出什么事情來~哈哈
?假設Actor截取到A的公鑰后,隨后也截取了到A發(fā)往C的報文。他截取到報文后,第一件想做的事肯定是修改報文內容。但是如果單單修改原始報文是不可以的,因為發(fā)過去C公司肯定驗簽不過啦。但是呢,數字簽名似乎解不開,因為消息摘要算法(hash算法)無法逆向解開的,只起驗證的作用呢....?
所以呢,公鑰與私鑰是用來加密與加密的,「加簽與驗簽是用來證明身份」,以免被篡改的。
常見加密相關算法簡介
-
消息摘要算法
對稱加密算法
非對稱加密算法
國密算法
消息摘要算法:
-
相同的明文數據經過相同的消息摘要算法會得到相同的密文結果值。
數據經過消息摘要算法處理,得到的摘要結果值,是無法還原為處理前的數據的。
數據摘要算法也被稱為哈希(Hash)算法或散列算法。
消息摘要算法一般用于簽名驗簽。
消息摘要算法主要分三類:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息認證碼算法)。
MD家族算法
MD(Message Digest,消息摘要算法)家族,包括MD2,MD4,MD5。
-
MD2,MD4,MD5 計算的結果都是是一個128位(即16字節(jié))的散列值,用于確保信息傳輸完整一致。
MD2的算法較慢但相對安全,MD4速度很快,但安全性下降,MD5則比MD4更安全、速度更快。
MD5被廣泛應用于數據完整性校驗、數據(消息)摘要、數據加密等。
MD5,可以被破解,對于需要高度安全性的數據,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞攻擊,因此不適用于安全性認證,如SSL公開密鑰認證或是數字簽名等用途。
舉個例子,看看如何獲取字符串的MD5值吧:
運行結果:
ShA家族算法
SHA(Secure Hash Algorithm,安全散列算法),包括SHA-0、SHA-1、SHA-2(SHA-256,SHA-512,SHA-224,SHA-384等)、SHA-3。它是在MD算法基礎上實現的,與MD算法區(qū)別在于「摘要長度」,SHA 算法的摘要「長度更長,安全性更高」。
?SHA-0發(fā)布之后很快就被NSA撤回,因為含有會降低密碼安全性的錯誤,它是SHA-1的前身。
SHA-1在許多安全協(xié)議中廣為使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后繼者。
SHA-2包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。它的算法跟SHA-1基本上相似,目前還沒有出現明顯弱點。
SHA-3是2015年正式發(fā)布,由于對「MD5出現成功的破解」,以及對SHA-0和SHA-1出現理論上破解的方法,SHA-3應運而生。它與之前算法不同的是,它是可替換的加密散列算法。?
SHA-1、SHA-2(SHA-256,SHA-512,SHA-224,SHA-384)等算法是比較常用的,我們來看看跟MD5的對比吧
MAC算法家族
MAC算法 MAC(Message Authentication Code,消息認證碼算法),是帶密鑰的Hash函數。輸入密鑰和消息,輸出一個消息摘要。它集合了MD和SHA兩大系列消息摘要算法。
MD 系列算法: HmacMD2、HmacMD4 和 HmacMD5 ;
SHA 系列算法:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384 和 HmacSHA512 。
對稱加密算法
加密和解密使用「相同密鑰」的加密算法就是對稱加密算法。常見的對稱加密算法有AES、3DES、DES、RC5、RC6等。
DES
數據加密標準(英語:Data Encryption Standard,縮寫為 DES)是一種對稱密鑰加密塊密碼算法。DES算法的入口參數有三個:Key、Data、Mode。
Key: 7個字節(jié)共56位,是DES算法的工作密鑰;
Data: 8個字節(jié)64位,是要被加密或被解密的數據;
Mode: 加密或解密。
3DES
三重數據加密算法(英語:Triple Data Encryption Algorithm,又稱3DES(Triple DES),是一種對稱密鑰加密塊密碼,相當于是對每個數據塊應用三次數據加密標準(DES)算法。
AES
AES,高級加密標準(英語:Advanced Encryption Standard),在密碼學中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準。
采用對稱分組密碼體制,密鑰長度為 128 位、 192 位、256 位,分組長度128位
相對于DES ,AES具有更好的 安全性、效率 和 靈活性。
非對稱加密算法
非對稱加密算法需要兩個密鑰:公鑰和私鑰。公鑰與私鑰是成對存在的,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。主要的非對稱加密算法有:RSA、Elgamal、DSA、D-H、ECC。
RSA算法
RSA加密算法是一種非對稱加密算法,廣泛應用于加密和數字簽名
RSA算法原理:兩個大素數的乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
RSA是被研究得最廣泛的公鑰算法,從提出到現在,經歷了各種攻擊的考驗,普遍認為是目前最優(yōu)秀的公鑰方案之一。
DSA
DSA(Digital Signature Algorithm,數字簽名算法),也是一種非對稱加密算法。
DSA和RSA區(qū)別在,DSA僅用于數字簽名,不能用于數據加密解密。其安全性和RSA相當,但其性能要比RSA好。
ECC 算法
ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學),基于橢圓曲線加密。
Ecc主要優(yōu)勢是,在某些情況下,它比其他的方法使用更小的密鑰,比如RSA加密算法,提供相當的或更高等級的安全級別。
它的一個缺點是,加密和解密操作的實現比其他機制時間長 (相比RSA算法,該算法對CPU 消耗嚴重)。
國密算法
國密即國家密碼局認定的國產密碼算法。為了保障商用密碼的安全性,國家商用密碼管理辦公室制定了一系列密碼標準,即SM1,SM2,SM3,SM4等國密算法。
SM1
-
SM1,為對稱加密算法,加密強度為128位,基于硬件實現。
SM1的加密強度和性能,與AES相當。
SM2
-
SM2主要包括三部分:簽名算法、密鑰交換算法、加密算法
SM2用于替換RSA加密算法,基于ECC,效率較低。
SM3
-
SM3,即國產消息摘要算法。
適用于商用密碼應用中的數字簽名和驗證,消息認證碼的生成與驗證以及隨機數的生成。
SM4
-
SM4是一個分組算法,用于無線局域網產品。
該算法的分組長度為128比特,密鑰長度為128比特。
加密算法與密鑰擴展算法都采用32輪非線性迭代結構。
解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
它的功能類似國際算法的DES。
加簽驗簽相關Java的API
這個小節(jié)先介紹一下加簽驗簽需要用到的API吧~
加簽相關API
「Signature.getInstance(String algorithm);」
-
根據對應算法,初始化簽名對象
algorithm參數可以取SHA256WithRSA或者MD5WithRSA等參數,SHA256WithRSA表示生成摘要用的是SHA256算法,簽名加簽用的是RSA算法
「KeyFactory.getInstance(String algorithm);」
-
根據對應算法,生成KeyFactory對象,比如你的公私鑰用的是RSA算法,那么就傳入RSA
「KeyFactory.generatePrivate(KeySpec keySpec)」
-
生成私鑰,加簽用的是私鑰哈,所以需要通過KeyFactory先構造一個私鑰對象。
「Signature.initSign(PrivateKey privateKey)」
-
加簽用的是私鑰,所以傳入私鑰,初始化加簽對象
「Signature.update(byte[] data)」
-
把原始報文更新到加簽對象
「java.security.Signature.sign();」
-
進行加簽操作
驗簽相關API
「Signature.getInstance(String algorithm)」
-
根據對應算法,初始化簽名對象,注意驗簽和加簽是需要用相同的algorithm算法參數哦~
「KeyFactory.getInstance(String algorithm);」
-
根據對應算法,生成KeyFactory對象
「KeyFactory.generatePublic(KeySpec keySpec);」
-
生成公鑰,驗簽用的是公鑰,通過KeyFactory先構造一個公鑰對象
「Signature.initVerify(publicKey);」
-
公鑰驗簽,所以傳入公鑰對象參數,初始化驗簽對象
「Signature.update(byte[] data)」
-
把原始報文更新到加簽對象
「Signature.verify(byte[] signature);」
-
進行驗簽操作
加簽驗簽代碼實現前幾個小節(jié)討論完概念,是時候上代碼實戰(zhàn)了,我這邊用的是SHA-256作為摘要算法,RSA作為簽名驗簽算法,如下:
「運行結果:」
本文轉載自微信公眾號「 撿田螺的小男孩」,可以通過以下二維碼關注。轉載本文請聯(lián)系 撿田螺的小男孩公眾號。
【編輯推薦】
<div> 2019 HackerOne黑客報告:白帽收入最高竟是普通程序員的40倍 聽說你是程序員, 微軟:其47000位程序員每月制造近30000個Bug聲明:免責聲明:本文內容由互聯(lián)網用戶自發(fā)貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發(fā)現本社區(qū)中有涉嫌抄襲的內容,請發(fā)
送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。本站原創(chuàng)內容未經允許不得轉載,或轉載時
需注明出處:新網idc知識百科