日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

http安全 Java_HTTP通信安全-身份验证 | 字痕随行

發布時間:2025/3/11 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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通信安全-身份验证 | 字痕随行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。