AES是壹種分組加密,即將明文分成N個分組,然後對每個分組進行加密。AES的密鑰長度則可以是128,192或256比特。
AES 算法本身操作的都是 byte 字節數組,因此,加密後壹般會使用 BASE64 編碼將 byte 數組轉為字符串,而解密之前則先用 BASE64 解碼將字符串轉回 byte 數組。 這裏註意下,不是所有的轉換都是BASE64編碼,也有轉化成16進制 ,我在對接第三方支付時,他們沒提供Demo,只是說了下AES加密。在聯調時,壹直報出解密失敗。最後的原因是他們用十六進制,而我這邊使用BASE64(滿滿的坑啊)
DES是也是壹個分組加密算法,他以64位為分組對數據加密。不過因為它使用的56位秘鑰過短,以現代計算能力,24小時內即可能被破解。所以壹般不考慮用這個加密方式了
RSA加密算法是壹種非對稱加密算法。RSA被廣泛使用(我接的第三方支付渠道用對稱加密的都是用RSA)
RSA 加密填充方式主要有三種:NoPadding、PKCS1Padding、OAEPPadding。先說下什麽是填充。RSA加密時會填充壹些隨機數。
用PKCS1Padding填充方式,會在明文簽名填充11字節的隨機數。因此, 每壹次對明文加密產生的密文都會不壹樣 。如果想讓每次產生的密文都壹樣,用NoPadding
MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經過程序流程,生成四個32位數據,最後聯合起來成為壹個128-bits散列。這個有些問題存在:
1、壹些不夠復雜的密碼難以防範彩虹表(預先用MD5逆運算好的表)
2、相同的密碼,產生的MD5碼壹樣。
為了應對以上兩個問題,比較好的方案就是 MD5 + salt,也稱MD5加鹽,即將原密碼拼上壹串鹽值salt之後再進行MD5。鹽值salt是壹個隨機字符串,每個用戶的 salt 值壹般都是不同的,這樣就可以保證不同用戶最終 MD5 出來的散列值不壹樣,而且因為有壹串隨機字符串,彩虹表也很難發揮作用了
因為MD5存在上面連個問題,SHA是MD5的升級版。SHA加密時壹個固定的密鑰作為參數。就是相當於前面將的鹽。***享密鑰,所以這個密鑰需要好好保存。
SHA有壹系列如SHA-256、SHA-512等,後面的256、512是生成數據的長度256比特、512比特。
指用戶用 私鑰 對原始數據的簽名進行加密所得的數據。數字簽名定義兩種互補的運算:壹個用於簽名,另壹個用於驗證。"私鑰簽名,公鑰驗證"
簽名:發送方先用簽名算法對明文簽名(簽名後的摘要長度短小)。然後利用自己的私鑰對形成的簽名進行加密,這裏加密後的數據就是數字簽名。
驗證:接受方利用發送方的公鑰解密被加密的簽名得到結果A,然後對明文也進行簽名得到結果B.最後,把A和B作比較。此方式既可以保證發送方的身份正確性,又可以保證數據在傳輸過程中不會被篡改。
數字信封的功能類似於普通信封。普通信封在法律的約束下保證只有收信人才能閱讀信的內容;數字信封則采用密碼技術保證了只有規定的接收人才能閱讀信息的內容。
數字信封中采用了對稱加密和非對稱加密。信息發送者首先利用隨機產生的對稱密碼加密信息(因為非對稱加密技術的速度比較慢),再利用接收方的公鑰加密對稱密碼,被公鑰加密後的對稱密鑰被稱之為數字信封。在傳遞信息時,信息接收方要解密信息時,必須先用自己的私鑰解密數字信封,得到對稱密碼,才能利用對稱密碼解密所得到的信息。
數字信封既發揮了對稱加密算法速度快、安全性好的優點,又發揮了非對稱加密算法密鑰管理方便的優點。
如果讓我來設計加密和簽名的方式,我會用以下的方式: