在 Java 里做 HTTP 防篡改,本质上不是“防 HTTP 本身”,而是保证请求/响应在传输过程中没有被修改。常见做法从“简单到严格”有以下几种,实际项目通常是组合使用。
防篡改第一道防线
// 只要是 https 请求即可,Java 原生支持
URL url = new URI("https://api.example.com/data").toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
✅ 防止:
❌ 不能防止:
核心思想:请求带签名,服务端校验
客户端把参数 + 密钥签名,服务端用同样的规则验证
String params = "amount=100&orderId=123";
String secret = "mySecret";
String sign = MD5(params + secret);
请求:
amount=100&orderId=123&sign=xxxx
String signServer = MD5(params + secret);
if (!signServer.equals(signClient)) {
throw new RuntimeException("参数被篡改");
}
✅ 防:
推荐使用 HMAC-SHA256
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(), "HmacSHA256"));
byte[] sign = mac.doFinal(params.getBytes());
优点:
光签名还不够,别人可以重发旧请求
{
"orderId": "123",
"timestamp": 1710000000,
"nonce": "abc123",
"sign": "xxx"
}
如果是用户接口,推荐 JWT
String jwt = Jwts.builder()
.claim("userId", 1)
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
✅ 防:
适合 JSON 接口
String body = "{\"amount\":100}";
String sign = HmacSHA256(body, secret);
Header:
X-Sign: xxx
服务端:
✅ 生产级防篡改方案
HTTPS
+ 参数签名(HMAC)
+ 时间戳
+ nonce
+ 服务端校验
如果是用户系统:
HTTPS + JWT + 接口签名
如果你愿意,我可以:
你现在是哪种场景?(支付?开放 API?前端调用?)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。