在上文《16.app後端如何保證通信安全--url簽名》提到,url簽名有兩個缺點,這兩個缺點,若是使用對稱加密方法的話,則徹底能夠避免這兩個缺點。在本文中,會介紹對稱加密的具體原理,和詳細的方案,使app通信更加安全。
算法
採用單鑰密碼系統的加密方法,同一個密鑰能夠同時用做信息的加密和解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密。
其實很簡單,假設有原始數據"1000", 把1000加5就獲得密文"1005",獲得密文"1005"後減5就獲得原始數據"1000"。把原始數據加5就是加密算法,把密文減5就是解密算法,密鑰就是5。
本文所用的是AES這種通用的對稱加密算法。
後端
(1)curl簡介
在下面的例子中,會使用curl工具,先簡單介紹一下。
curl是利用URL語法在命令行方式下工做的開源文件傳輸工具。
用到的參數:
-X: 指定什麼命令,例如post,get等。
-H: 指定http header。
-d: 制定http body的內容
(2)怎麼保證token在初次返回時的安全
用下面的api返回加密的token
[plain] view plain copyapi
注意:Token-Param是本身定義的http header,這裏是由於我的習慣才命名爲Token-Param安全
secretKey就是密鑰,使用http header中的Token-Param中的16位長度。
服務端返回時加密token的方法是用AES加密,密鑰是secretKey。
客戶端解密token的方法是用AES解密,密鑰是secretKey。
(3) api請求中的加密
假設更新用戶數據的api調用以下
[plain] view plain copy服務器
secretKey使用http header中的Token-Param中的16位長度。
在上面的例子中,data是實際要post的數據。
在這個過程當中,token和post的數據都獲得了加密保護。
客戶端發送時加密的過程
(1)取http header中的Token-Param中的16位長度做爲密鑰,用AES加密token。
(2)用token做爲密鑰,用AES加密data。
服務端接收到這個api請求的解密過程:
(1)取http header中的Token-Param中的16位長度做爲密鑰,用AES解密, 獲得token。
(2)用token做爲密鑰,用AES解密http body的內容,獲得原文。
app
把token返回的時候,能夠作個約定,在返回的時候截取某個字符串的一部分做爲密鑰,這個祕鑰只用一次,就是用來解密token的,之後就只是用token來作祕鑰了。curl
整個過程以下:工具
一、用戶名密碼 + https + url簽名(url+時間戳+隨機字串)連接+請求時間+保惟一的字串
二、服務器返回token:aes(約定算法)=》(token+隨機secret(就取上面那個簽名中的16位))
三、app保存token後,之後每次機通訊都經過 aes (token + 內容) 傳輸post