密碼基礎知識(1)


密碼基礎知識(2)https://www.cnblogs.com/xdyixia/p/11807105.html

1、概述

        密碼只是信息安全的一部分,它的目的很明確就是為了解決信息安全問題。不同的密碼技術算法解決不同的信息安全問題,但沒有一種技術能解決所有信息安全問題。

信息安全有四類特性:

  1. 機密性:為了防止信息被竊聽,對應的密碼技術有對稱密碼和非對稱密碼。
  2. 完整性:為了防止信息被篡改,對應的密碼技術有單向散列函數、消息認證碼、數字簽名。
  3. 認證:為了防止攻擊者偽裝成真正的發送者,對應的密碼技術有消息認證碼和數字簽名。
  4. 不可否認性:為了防止發送者事后否認自己沒有做過,對應的密碼技術為數字簽名。

為了盡可能的解決不同的信息安全特性,我們可能需要組合使用多種密碼技術。信息安全面臨的威脅點和所對應的密碼技術之間的關系可用下圖來表示:

以上主要從類別分類包括6種密碼技術:對稱密碼、非對稱密碼、單向散列函數、消息認證碼、數字簽名、偽隨機數生成器。如果看具體的算法,那就包括 AES、RSA、MD5、SHA1、SHA256、HMAC 等。有些人還將 BASE64 也理解為一種加解密的密碼技術,但BASE64 只是一種編碼方式,和 ASCII 和 UTF-8 編碼的本質上一樣,主要用途就是將不可打印的二進制數據編碼為可打印的字符串,因為它不解決信息安全四個特性中的任何一種。大家都知道高性能和高安全是很難兼顧,魚和熊掌不可兼得,我們能做的是盡力根據自己的業務找到平衡點。下面分別介紹一下這些技術和他們對應的具體算法。

2、對稱加密

        對稱加密也稱為共享密鑰密碼、私鑰密碼,是指用相同的密鑰加密和解密時的方式。對稱加密算法的優點是算法公開、計算量小、加密速度快、加密效率高。缺點是,交易雙方都使用同樣鑰匙,密鑰的分發和管理比較困難,安全性得不到保證

        常用的對稱加密算法有:DES、3DES、AES、Blowfish、RC5、IDEA 等,其中DES已經可以現實中被暴力破解,現在的使用最廣泛的對稱加密算法是 AES。密碼算法可以分為分組密碼和流密碼兩種。其中AES和DES都是屬於分組密碼。分組密碼是將明文消息分成一定長度的N個分組,然后對每個分組進行加密。AES的分組長度是128比特,分組密碼有很多模式,如果模式選擇不恰當,就無法充分保證機密性。

        AES 是一種分組密碼,即將明文消息拆分為一定長度的N個分組,然后對每個分組進行加密。AES 的分組長度固定為 128 比特,而密鑰可以是 128/192/256比特。既然是固定長度的分組,那我們要加密任意長度的明文,就涉及到如何將多個分組進行迭代加密的問題,因此,就有了分組模式。常用的分組模式有:ECB、CBC、CFB、OFB、CTR 等。最常用的是ECB 和 CBC模式,因此,需要了解下這兩種模式的用法和區別。

        ECB 全稱為 Electronic CodeBook,電子密碼本模式,是最簡單的一種模式,它直接將明文分割成多個分組並逐個加密,如下圖:

        這種模式的優點就是簡單、快速,加密和解密都支持並行計算。而缺點也比較明顯,因為每個明文分組都各自獨立地進行加密和解密,如果明文中存在多個相同的明文分組,則這些分組最終會被轉換為相同的密文分組。這樣一來,只要觀察一下密文,就可以知道明文中存在怎樣的重復組合,並可以以此為線索來破譯密碼。另外,攻擊者可以通過改變密文分組的順序,或刪除密文分組,或替換掉密文分組,就可以達到對明文操縱的目的,而無需破譯密碼。在實際應用中,很少需要進行並行計算的加解密場景,因此,一般情況下不會采用這種分組模式,而更推薦采用 CBC 模式。

        CBC 全稱為 Cipher Block Chaining,密文分組鏈接模式,是將前一個密文分組與當前明文分組的內容混合起來進行加密的,如下圖:

        在 CBC 模式中,首先將明文分組與前一個密文分組進行 XOR 運算,然后再進行加密。加密第一個明文分組時,由於不存在“前一個密文分組”,因此需要事先准備一個長度為一個分組的比特序列來代替“前一個密文分組”,這個比特序列稱為初始化向量(initialization vector),通常縮寫為 IV。CBC 模式避免了 ECB 模式的弱點,明文的重復排列不會反映在密文中。不過,相比 ECB 模式,CBC 模式多了一個初始化向量IV。

       另外,當最后一個明文分組的內容小於分組長度時,需要用一些特定的數據進行填充,填充方式也有很多種,常用的有兩種:PKCS#5 和 PKCS#7。需要注意的就是,不同編程語言使用的填充方式可能會不同。比如,Java 是使用 PKCS#5,而 iOS 的 Objective-C 和 Swift 則采用 PKCS#7。不過,對於 AES 來說,兩種填充方式是一樣的。

  在實際應用中,我們一般都是在前端對密碼或其他敏感數據進行加密,然后在后端進行解密。因為前后端涉及到不同語言的實現,為了保證前后端經過加解密后的結果一致,有幾個參數是需要保持一致的:

  (1) 密鑰:密鑰都要使用同一個,這點基本沒有疑問,但需要注意的就是,密鑰長度需要統一為 128/192/256 比特,即 16/24/32 字節。

  (2) 分組模式:分組模式推薦統一為 CBC 模式,且要顯式聲明,因為不同語言的默認分組模式可能會不同。

  (3) 初始化向量:加密和解密時的初始化向量 IV 也是要一致的,同樣也不要使用默認設置,而要顯式定義。

  (4) 填充方式:Java 采用 PKCS5Padding,iOS 和 JavaScript 采用 PKCS7,對於 AES 來說,兩者是一樣的。

  還有一點也需要注意,AES 算法本身操作的都是 byte 字節數組,因此,加密后一般會使用 BASE64 編碼將 byte 數組轉為字符串,而解密之前則先用 BASE64 解碼將字符串轉回 byte 數組。

  使用對稱加密最關鍵的就是要保證密鑰的安全,一般不建議直接在網絡上傳輸密鑰,另外,在客戶端也要做好密鑰的安全存儲。

3、非對稱加密

  非對稱加密也稱公鑰加密,使用了一對密鑰,用公鑰進行加密,再用配對的私鑰進行解密。公鑰是公開的,而私鑰是保密的。相比對稱加密安全性提高了,但犧牲了性能,加解密的速度慢了幾個數量級,消息越長,加密和解密的速度越慢。

  使用最廣泛的非對稱加密算法就是 RSA,其原理是利用了大整數質因數分解問題的困難度,加密和解密其實就是非常簡單的兩條公式:

  加密:密文 = 明文^E mod N

  解密:明文 = 密文^D mod N

  即是說,加密就是對明文的 E 次方后除以 N 求余數的過程,其中 E 和 N 的組合就是公鑰,即公鑰 = (E, N)。而解密過程就是對密文進行 D 次方后除以 N 得到余數,即是明文,D 和 N 的組合就是私鑰,即私鑰 = (D, N)公鑰和私鑰共有的 N 稱為 module,即模數,E 和 D 則分別是公鑰指數和私鑰指數。因為 RSA 是基於以上數學問題的,所以其明文、密鑰和密文都是數字,我們平時看到的字符串其實都是二進制表示的數字經過 BASE64 編碼的。

  密鑰長度越長越安全,推薦使用 1024 比特或更大的值,這里說的 1024 密鑰長度其實是指模數的長度。還有,不同於對稱密碼可以加密任意長度的明文,RSA 明文長度是不能超過密鑰長度的。Java 默認的 RSA 加密實現明文長度最長為密鑰長度減去 11 字節,假如密鑰長度設為 1024 比特,即 128 字節,那明文長度則不能超過 128 - 11 = 117 字節,如果超過該長度則會拋異常。如果想要加密的明文比較長,那就生成更長的密鑰,如 2048 比特,那明文可以長達 245 字節,足夠了。太長的明文也不推薦使用 RSA 進行加密,性能太低了。 

  另外,為了提高安全性,RSA 加密時都會填充一些隨機數。RSA 加密填充方式主要有三種:NoPadding、PKCS1Padding、OAEPPadding。其中,最常用的就是 PKCS1Padding,它會在明文前面填充 11 字節的隨機數,因此,對同一明文每次加密產生的密文都會不一樣。如果想讓每次加密產生的密文都一樣,那填充方式就采用 NoPadding,即不填充,但這樣無疑減低了安全性,所以一般不建議采用 NoPadding。

  實際應用中,我們不會直接對長消息進行非對稱加密,而只會對一些安全性要求非常高的短消息進行加密,比如用戶的密碼、對稱加密的密鑰SSL/TLS 的加密方案就是用對稱加密對請求消息進行加密,用公鑰加密對對稱加密的密鑰進行加密。

李永樂https://www.bilibili.com/video/av26639065

想要破解就得通過n算出p和q,但是b比較大,大數的質因分解困難,但是量子計算機很有可能破解。

4、單向散列函數

  對稱加密和非對稱加密主要是用來解決消息的機密性問題的,即可以防止消息被竊聽導致秘密泄露,但卻無法校驗消息是否被篡改。要校驗消息是否被篡改,就要對消息進行完整性校驗,有多種校驗方案,最簡單高效的就是單向散列函數

  單向散列函數也稱哈希函數、雜湊函數、消息摘要算法等,是能把任意長的輸入消息串轉變成固定長的輸出串的一種函數,輸出值稱為“散列值”或“消息摘要”,也稱為消息的“指紋”。使用單向散列函數,同一消息會生成同樣的散列值,而只要改了消息,哪怕只改了 1 個字節,最終的散列值變化也很大,因此,很適合用這個散列值校驗消息的完整性。

  最常用的單向散列函數就是 MD5 和 SHA,SHA 其實包括了 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512,后四種並稱為 SHA-2。有時候,我們去下載一些軟件的安裝文件時,官方一般都會提供對應該文件的 MD5 和 SHA-1 的散列值,以便我們可以對下載后的文件自己生成散列值,再和官方提供的散列值進行比對,就知道這個文件有沒有被修改過。

  在我們平時的實際應用中,倒是很少會單獨使用單向散列函數,一般都會結合其他技術一起使用。畢竟,單獨使用的安全性不高。就舉用戶密碼的安全來說吧,很多應用會將用戶密碼直接 MD5 之后傳輸給服務端。這種方案主要存在兩個安全隱患,一是對於一些不夠復雜的密碼難以防范彩虹表,二是不同用戶如果設置了相同密碼那散列值無疑會一樣。

  先說第一點,首先,先了解下什么是彩虹表。彩虹表是一個用於單向散列函數逆運算的預先計算好的表,為了破解密碼的散列值而准備。我們可以簡單理解為彩虹表就是在明文和密文之間建立起對應關系的字典表,可以通過已知的密文反查出明文,雖然實際上其原理遠比想象中復雜得多。比如說,密碼“123456”的 MD5 結果是“E10ADC3949BA59ABBE56E057F20F883E”,那我監聽到用戶登錄的請求,拿到“E10ADC3949BA59ABBE56E057F20F883E”這個密碼串時,從准備好的彩虹表中就可以反查出原密碼是“123456”。

  再說第二點,設置了相同密碼的不同用戶,由於他們 MD5 后的散列值全都一樣,那么只要破解了其中一個密碼,就等於破解了多個用戶的密碼。

  為了應對以上兩個問題,比較好的方案就是 MD5 + salt,也稱 MD5 加鹽,即將原密碼拼上一串鹽值 salt 之后再進行 MD5。鹽值 salt 是一個隨機字符串,每個用戶的 salt 值一般都是不同的,這樣就可以保證不同用戶最終 MD5 出來的散列值不一樣,而且因為有一串隨機字符串,彩虹表也很難發揮作用了。

5、消息認證碼

  消息認證碼是一種確認完整性並進行認證的技術,英文名稱為message authentication code,簡稱為MAC。 

  雖然單向散列函數可以用來對消息進行完整性校驗,但無法校驗消息是否來自合法的發送者即無法解決認證問題。要解決發送者的認證問題,最常用的有兩種方案,一是采用消息認證碼,二是使用數字簽名。這一小節我們先來了解下消息認證碼。 

  消息認證碼的輸入包括任意長度的消息和一個發送者與接收者之間共享的密鑰,它可以輸出固定長度的數據,這個數據稱為 MAC 值。 

  消息認證碼的實現方式有很多種,最常用的實現方式就是 HMAC,再具體點,根據使用哪種單向散列函數可分為:HMAC-MD5、HMAC-SHA1、HMAC-SHA256 等等。HMAC 簡單理解就是帶有密鑰的散列函數,因為有了密鑰,就可以對發送者進行認證;也因為使用了散列函數,也具有完整性校驗的性質。 

認證的基本流程就是:

  1. 發送者使用共享密鑰對消息計算 MAC 值;
  2. 發送者將消息MAC 一起發送給接收者;
  3. 接收者收到消息和 MAC 值后,使用同一個共享密鑰對消息計算 MAC 值;
  4. 對比計算出來的 MAC 接收到的 MAC 是否一致,一致則認證成功。

  現在,很多接口所添加的 URL 簽名機制,其實就是對請求做 MAC 認證,具體的設計細節后面的文章再詳細說明。不過,因為使用了共享密鑰,因此也存在和對稱加密一樣的密鑰安全問題

6、數字簽名

  數字簽名相當於現實世界中的蓋章、簽字的功能,使用數字簽名可以識別篡改和偽裝,還可以防止否認。 

  數字簽名可以解決發送者的認證問題,而且,數字簽名還具有不可抵賴性。數字簽名的原理也非常簡單,其實就是將非對稱加密反過來用。我們知道,非對稱加密是用公鑰加密,然后用私鑰解密。而數字簽名則是用私鑰加密,生成的密文就是數字簽名,再用公鑰解密。用私鑰進行加密這一行為只能由持有私鑰的人完成,正是基於這一事實,才可以將用私鑰加密的密文作為簽名來對待。而由於公鑰是對外公開的,因此任何人都可以用公鑰進行解密,即任何人都能夠對簽名進行驗證。

  另外,我們也知道,非對稱加密本身加密和解密是非常慢的,消息越長,性能越慢,因此,一般不用來加密和解密長消息。同樣的,一般也不會直接對長消息簽名,通常的做法是對消息的散列值進行簽名,因為散列值比較短,所以加密簽名相對就會快很多。因此,你會看到數字簽名有類似 MD5withRSA、SHA1withRSA 這樣的實現。

  最后,需要注意一點,像 MD5withRSA 和 SHA1withRSA 這樣的數字簽名實現可以校驗消息完整性、對發送者進行認證、還可防止抵賴,但卻不能解決機密性的問題,不要妄想用一種密碼技術就能解決所有問題。

  不過,數字簽名其實不太適合直接用在客戶端上。因為客戶端要對消息簽名,那么客戶端就需要保存私鑰,那依然有私鑰的安全配送和存儲問題。數字簽名使用最廣泛的應該就是用在數字證書上了,這還涉及到 SSL/TLS 和 CA 等,后面的文章再聊這個話題。

7、偽隨機數生成器

  偽隨機數生成器並不直接解決信息安全問題,但它承擔了密鑰生成的重要職責。而密鑰的重要性就不用多說了。

8、總結

  密碼技術其實非常多,還包括各種單一技術的組合,我們本篇文章所學的只是最基礎的一些知識,包括了對稱加密、非對稱加密、單向散列函數、消息認證碼、數字簽名這些密碼技術的一些必備知識點,只有掌握了這些,才能理解和設計一些安全性更高的應用。 

  對稱加密和非對稱加密用來解決機密性問題,對稱加密的速度快,適合用來加密長消息,但密鑰在安全配送和客戶端的存儲是個難點;而非對稱加密避免了共享密鑰的安全配送和存儲問題,但對長消息的加密速度非常慢,只適合用來加密短消息。單向散列函數可以用來對消息進行完整性校驗,但很少單獨使用。消息認證碼簡單理解就是帶密鑰的單向散列函數,既能校驗完整性,還能對發送者進行認證,但因為使用了共享密鑰,也存在和對稱密碼一樣的共享密鑰的安全配送和存儲問題。數字簽名能解決完整性校驗、認證和防止抵賴等問題,最廣泛的應用是在數字證書上。

 

內容來自:https://blog.csdn.net/lanxue0803/article/details/80137279

https://www.bilibili.com/video/av26639065


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM