在服務器與終端設備進行HTTP通訊時,常常會被網絡抓包、反編譯(Android APK反編譯工具)等技術得到HTTP通訊接口地址和參數。為了確保信息的安全,我們必須進行接口參數加密和解密。本文只講原理,代碼實現可以另去百度。
(一)、MD5和base64加密
** MD5簡介**
MD5是一個安全的哈希算法,輸入兩個不同的明文不會得到相同的輸出值,根據輸出值,不能得到原始的明文,即其過程不可逆;
MD5有以下兩個最主要的特性。
- 加密的不可逆性,只能夠加密,不能夠解密。
- 任意長度的明文經過加密后長度都是固定的,長度為16進制32位。
它還有以下幾種特點
- 容易計算:根據原數據計算出MD5很容易
- 抗修改性:MD5對原數據十分的敏感,哪怕只修改了一個字節,得到的MD5的值與之前的MD5數值都有很大的差別。
- 防偽性能高:已知原數據和它的MD5值,想要找到相同MD5值得數據是非常困難的,可以說幾乎是不可能的。
** base64 簡介**
- base64的編碼都是按字符串長度,以每3個8bit的字符為一組,
- 然后針對每組,首先獲取每個字符的ASCII編碼,
- 然后將ASCII編碼轉換成8bit的二進制,得到一組3*8=24bit的字節
- 然后再將這24bit劃分為4個6bit的字節,并在每個6bit的字節前面都填兩個高位0,得到4個8bit的字節
- 然后將這4個8bit的字節轉換成10進制,對照Base64編碼表 (下表),得到對應編碼后的字符。
** Base64 編碼表 **
Value | Char | Value | Char | Value | Char | Value | Char |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
- MD5: 全稱為message digest algorithm 5(信息摘要算法), 可以進行加密, 但是不能解密, 屬于單向加密, 通常用于文件校驗。
MD5 運算結果是一個固定長度為128位的二進制數,經過一系列的運算得到32個16進制數。(每一位16進制數可以代替4位二進制數,所以128位二進制數寫成16進制就變成了128/4=32 個。)
- Base64: 把任意序列的8為字節描述為不能直接用肉眼識別的形式, 通常用于郵件、http加密. 登陸的用戶名和密碼字段通過它加密, 可以進行加密和解密。
base64算法就是將瀏覽器中不允許出現的+=號給替換成-.這些符號。 - 為什么用md5算法加密后又要利用base64算法進行編碼:因為md5加密后得到的數據是128位的字節數組,將字節數組用base64算法加密后得到的是字符串,這樣有利于在其在數據庫中的存儲
(二)、AES+Base64加密
簡單的MD5/Base64等已經難以滿足當下的數據安全標準,本文簡單的介紹下AES與Base64的混合加密與解密"
** ASE簡介 **
AES 是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節)分組加密和解密數據,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。
(三)、AES+RSA加密
** RSA是非對稱加密 **
概念:
公鑰:給需要加密方
私鑰:解密者自己留
密鑰生成過程:
1:隨機選擇兩個質數p、q,計算出 n=p x q
2:計算出不大于N與N互質的數的數量 f(n)=(p-1) x (q-1).
3:取e不大于f(n)且與f(n)互質的數.
4:計算出e x d mod f(n) = 1 時 d的值.
5:則(e,n)為公鑰(d,n)為私鑰
加密過程:
原文^e mod n = 密文
解密過程:
密文^d mod n = 原文
關于RSA的公私鑰具有以下重要特性:
- 對于一個私鑰,有且只有一個與之對應的公鑰。生成者負責生成私鑰和公鑰,并保存私鑰,公開公鑰
- 公鑰是公開的,但不可能通過公鑰反推出私鑰,或者說極難反推,只能窮舉,所以只要密鑰足夠長度,要通過窮舉而得到私鑰,幾乎是不可能的
- 通過私鑰加密的密文只能通過公鑰解密,公鑰加密的密文只有通過私鑰解密
AES加密也叫對稱加密:A用密碼對數據進行AES加密后,B用同樣的密碼對密文進行AES解密。
具體操作方法:
在終端中采用openssl方式輸入密鑰的相關屬性(公司名、郵箱等),然后在終端當前所在的地址下,生成公鑰和私鑰共7個文件(7個文件如何使用請看附錄的拓展了鏈接)。
此時假設Android客戶端擁有公鑰PublicKey,服務器端擁有公鑰PublicKey和私鑰PrivateKey。
安卓發送請求到服務器端,安卓隨機生成Byte[]隨機密碼,假設RandomKey=“123456”,通過AES算法,對Json數據利用進行加密。
但是此刻服務器并不知道客戶端的RandomKey是什么,因此需要同時將Randomkey傳給服務器,否則服務器無法通過AES對Json數據進行解密。但是如果直接發送請求,Randomkey就會暴露,所以要對RandomKey進行不可逆的RSA加密。
安卓將使用Randomkey進行AES加密的Json數據,和使用PublicKey進行RSA加密的RandomKey通過HTTP傳送到服務器端。數據請求工作完成。
服務器端接收到AES加密的Json數據和Rsa加密的RandomKey數據。
服務器通過私鑰PrivateKey對加密后的RandomKey進行Rsa解密。得到安卓生成的原始Randomkey。
利用原始的RandomKey對加密后的Json數據進行AES對稱解密。至此已經得到安卓端發過來的原始Json數據。進行常規的服務器業務操作,然后將返回數據通過安卓端的RandomKey進行AES加密gouhou后,Response返回。
安卓端接收到Response的數據后,利用之前本地生成的RandomKey直接進行AES解密即可。