加密&簽名

之前把支付渠道的代碼重構,這樣新接入支付渠道時要修改的地方集中和統一。不過這次要講的不是代碼重構,而是講加密。現在有好多的第三方支付服務,支付服務是一個高安全的行爲。在數據傳輸過程中都需要加密,不同的支付服務,加密方式也不一樣。主要是通過對稱加密、非對稱加密、對稱與非對稱組合加密。還有就是數據的簽名。下面就講講我對這些加密的理解

對稱加密

對消息的加密和解密都是使用的同一個密鑰的加密算法。常用的對稱加密算法有:DES、3DES、AES等。現在使用最多的是AES

AES

AES是一種分組加密,即將明文分成N個分組,然後對每個分組進行加密。AES的密鑰長度則可以是128,192或256比特。

AES 算法本身操作的都是 byte 字節數組,因此,加密後一般會使用 BASE64 編碼將 byte 數組轉爲字符串,而解密之前則先用 BASE64 解碼將字符串轉回 byte 數組。這裏注意下,不是所有的轉換都是BASE64編碼,也有轉化成16進制,我在對接第三方支付時,他們沒提供Demo,只是說了下AES加密。在聯調時,一直報出解密失敗。最後的原因是他們用十六進制,而我這邊使用BASE64(滿滿的坑啊)

DES

DES是也是一個分組加密算法,他以64位爲分組對數據加密。不過因爲它使用的56位祕鑰過短,以現代計算能力,24小時內即可能被破解。所以一般不考慮用這個加密方式了

非對稱加密

加密使用的密鑰和解密使用的密鑰是不相同的,分別稱爲:公鑰、私鑰。公鑰是公開的,而私鑰是保密的。相比對稱加密安全性提高了,但犧牲了性能,加解密的速度慢了幾個數量級,消息越長,加密和解密的速度越慢

RSA

RSA加密算法是一種非對稱加密算法。RSA被廣泛使用(我接的第三方支付渠道用對稱加密的都是用RSA)

RSA 加密填充方式主要有三種:NoPadding、PKCS1Padding、OAEPPadding。先說下什麼是填充。RSA加密時會填充一些隨機數。
用PKCS1Padding填充方式,會在明文簽名填充11字節的隨機數。因此,每一次對明文加密產生的密文都會不一樣。如果想讓每次產生的密文都一樣,用NoPadding

  • 密鑰長度越長越安全
  • 密鑰長度越長越耗性能
  • 明文長度是不能超過密鑰長度的

簽名

將任意長度的信息轉換爲較短的固定長度的信息摘要,通常其長度要比信息小得多,且算法不可逆。用於計算出一段不可逆向計算的數值,以此來驗證該文件是否被修改的。主要的算法有MD5、SHA

MD5

MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經過程序流程,生成四個32位數據,最後聯合起來成爲一個128-bits散列。這個有些問題存在:
1、一些不夠複雜的密碼難以防範彩虹表(預先用MD5逆運算好的表)
2、相同的密碼,產生的MD5碼一樣。

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

SHA

因爲MD5存在上面連個問題,SHA是MD5的升級版。SHA加密時一個固定的密鑰作爲參數。就是相當於前面將的鹽。共享密鑰,所以這個密鑰需要好好保存。

SHA有一系列如SHA-256、SHA-512等,後面的256、512是生成數據的長度256比特、512比特。

數字簽名

指用戶用私鑰對原始數據的簽名進行加密所得的數據。數字簽名定義兩種互補的運算:一個用於簽名,另一個用於驗證。"私鑰簽名,公鑰驗證"

簽名:發送方先用簽名算法對明文簽名(簽名後的摘要長度短小)。然後利用自己的私鑰對形成的簽名進行加密,這裏加密後的數據就是數字簽名。

驗證:接受方利用發送方的公鑰解密被加密的簽名得到結果A,然後對明文也進行簽名得到結果B.最後,把A和B作比較。此方式既可以保證發送方的身份正確性,又可以保證數據在傳輸過程中不會被篡改。

數字信封

數字信封的功能類似於普通信封。普通信封在法律的約束下保證只有收信人才能閱讀信的內容;數字信封則採用密碼技術保證了只有規定的接收人才能閱讀信息的內容。

數字信封中採用了對稱加密和非對稱加密。信息發送者首先利用隨機產生的【對稱密碼】加密信息(因爲非對稱加密技術的速度比較慢),再利用接收方的【公鑰】加密對稱密碼,被公鑰加密後的對稱密鑰被稱之爲數字信封。在傳遞信息時,信息接收方要解密信息時,必須先用自己的私鑰解密數字信封,得到對稱密碼,才能利用對稱密碼解密所得到的信息。

數字信封既發揮了對稱加密算法速度快、安全性好的優點,又發揮了非對稱加密算法密鑰管理方便的優點。

總結

如果讓我來設計加密和簽名的方式,我會用以下的方式:

  • 發送者A:
  1. A準備要傳送的數字信息(明文)
  2. A對明文進行簽名,得到一信息摘要。
  3. A用自己的【私鑰(SK)】對信息摘要進行加密得到A的數字簽名,並將其附在數字信息上。(數字簽名)
  4. A隨機產生一個加密鑰(DES密鑰),並用此密鑰對要發送的信息(明文)進行加密,形成密文。(對稱加密)
  5. A用B的【公鑰(PK)】對剛纔隨機產生的加密密鑰進行加密,將加密後的DES密鑰連同密文一起傳送給B。(數字信封)
  • 接收者B:
  1. B收到A傳送過來的密文和加過密的DES密鑰,先用自己的私鑰(SK)對加密的DES密鑰進行解密,得到DES密鑰。
  2. B然後用DES密鑰對受到的密文進行解密,得到明文的數字信息,然後將DES密鑰拋棄(即DES密鑰作廢)。
  3. B用A的公鑰(PK)對A的數字簽名進行解密,得到信息摘要。
  4. B用相同的has算法對收到的明文再進行一次hash運算,得到一個新的信息摘要。
  5. B將收到的信息摘要和新生成的信息摘要進行比較,如果一致,說明收到的信息沒有被修改過。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章