http安全 Java_HTTP通信安全-身份验证 | 字痕随行
無論是使用Web Service、RESTful或者其它的基于Http協議的交互方案,不可避免的都需要解決通信方面的安全問題,常見的無非就是:
1. 明文傳輸密碼。
2. 重放攻擊(相關概念參見《HTTP安全-重放攻擊》)。
3. 請求來源非法。
本文通過SHA1算法加/解密相關數據,為客戶端和服務端的通信提供一種有效可行的解決辦法。以獲取用戶數據為例,我們希望通過地址http://xxx.com/user/get?id=1獲得用戶A的相關信息。如果該地址暴露在公網上,我們當然希望只有合法的人能夠獲得該信息,不合法的人被拒之門外,有惡意的人想要獲得該數據需要耗費大量的成本。那么我們可以遵循以下過程去做:
1. 一個appid:是客戶端的唯一標識,用來確定請求從哪里來;一個私有秘鑰:在客戶端和服務端分別存放一份,該秘鑰不會在網絡上傳輸;一個時間戳:就是當前時間的毫秒數。
2. 在客戶端使用SHA1算法將appid,客戶端秘鑰,時間戳按照一定順序加密得到一個字符串。
3. 構造http請求,將appid,時間戳,加密得到的字符串和需要傳輸的數據發送給服務端。
4. 服務端接收到客戶端的請求后,需要:
1) 將時間戳與服務器當前時間作比對,如果超時,則認定該請求非法。
2) 驗證appid是否存在,如果存在取得其在服務器端存放的秘鑰,如果不存在或者秘鑰不存在則該請求非法。
3) 將appid,服務器端秘鑰,時間戳按照一定順序加密,比對加密得到的字符串與客戶端請求中的字符串是否相同,如果不同,則該請求非法。
4) 檢查appid是否具有權限完成該請求。
5. 服務器端邏輯處理,返回數據。
以下為實現該過程的主要代碼:
SHA1加密:
import?java.security.MessageDigest;
public?class?SHA1Util?{
public?static?String?encode(String?decript)?throws?Exception?{
MessageDigest?digest?=?MessageDigest.getInstance("SHA-1");
digest.update(decript.getBytes());
byte?messageDigest[]?=?digest.digest();
//?Create?Hex?String
StringBuffer?hexString?=?new?StringBuffer();
//?字節數組轉換為?十六進制?數
for?(int?i?=?0;?i?
String?shaHex?=?Integer.toHexString(messageDigest[i]?&?0xFF);
if?(shaHex.length()?
hexString.append(0);
}
hexString.append(shaHex);
}
return?hexString.toString();
}
}
生成加密串:
import?com.xiaoleilu.hutool.StrUtil;
import?java.util.ArrayList;
import?java.util.Collections;
import?java.util.List;
public?class?SignUtil?{
public?static?String?generate(String?appid,?String?token,?long?millis)?throws?Exception?{
String?timestamp?=?String.valueOf(millis);
String?signature?=?null;
if?(StrUtil.isNotBlank(token)?&&?StrUtil.isNotBlank(timestamp)
&&?StrUtil.isNotBlank(appid))?{
List?srcList?=?new?ArrayList();
srcList.add(timestamp);
srcList.add(appid);
srcList.add(token);
//?按照字典序逆序拼接參數
Collections.sort(srcList);
Collections.reverse(srcList);
StringBuilder?sb?=?new?StringBuilder();
for?(int?i?=?0;?i?
sb.append(srcList.get(i));
}
signature?=?SHA1Util.encode(sb.toString());
srcList.clear();
}
return?signature;
}
}
如果希望更加安全的話,可以對需要傳輸的數據進行加密;還可以對需要傳輸的數據進行MD5加密,將MD5加密所得到的字符串加入到簽名之中,這樣可以保證數據合法有效。
另外,這種生成簽名驗證合法性的方式會比較慢,在應用中不太可能每一次都要重復此過程,一般都會在第一次進行身份驗證時使用此方式來獲得一個身份憑證,該憑證具有一定的有效期,過期后需要再次申請,在有效期內可以使用該憑證進行驗證,提高程序運行效率,例子其實可以參見微信SDK。
總結
以上是生活随笔為你收集整理的http安全 Java_HTTP通信安全-身份验证 | 字痕随行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# image转换为bitmap_Py
- 下一篇: npz文件转为npy_Numpy_快速操