温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java HTTP怎么防篡改

发布时间:2026-10-01 11:58:16 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 里做 HTTP 防篡改,本质上不是“防 HTTP 本身”,而是保证请求/响应在传输过程中没有被修改。常见做法从“简单到严格”有以下几种,实际项目通常是组合使用。


一、最基础:HTTPS(必须)

防篡改第一道防线

  • HTTPS = HTTP + TLS
  • 防止中间人篡改、窃听
// 只要是 https 请求即可,Java 原生支持
URL url = new URI("https://api.example.com/data").toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

✅ 防止:

  • 明文被改
  • 中间人攻击

❌ 不能防止:

  • 客户端本身造假
  • 服务端逻辑漏洞

二、签名防篡改(最常见)

核心思想:请求带签名,服务端校验

1️⃣ 请求参数签名

客户端把参数 + 密钥签名,服务端用同样的规则验证

客户端(Java 示例)

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("参数被篡改");
}

✅ 防:

  • 参数被改
  • URL 被改

三、HMAC(比 MD5 更安全)

推荐使用 HMAC-SHA256

Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(), "HmacSHA256"));
byte[] sign = mac.doFinal(params.getBytes());

优点:

  • 抗碰撞
  • 不容易被暴力破解

四、防重放(时间戳 + nonce)

光签名还不够,别人可以重发旧请求

方案

  • timestamp:请求时间
  • nonce:随机字符串(一次性)
{
  "orderId": "123",
  "timestamp": 1710000000,
  "nonce": "abc123",
  "sign": "xxx"
}

服务端

  • 时间差 > 5 分钟 ❌
  • nonce 已用过 ❌(用 Redis 存)

五、JWT(适合用户身份 + 防篡改)

如果是用户接口,推荐 JWT

String jwt = Jwts.builder()
    .claim("userId", 1)
    .signWith(SignatureAlgorithm.HS256, secret)
    .compact();

✅ 防:

  • token 被改
  • 伪造用户

六、请求体整体签名(高级)

适合 JSON 接口

String body = "{\"amount\":100}";
String sign = HmacSHA256(body, secret);

Header:

X-Sign: xxx

服务端:

  • 读 body
  • 重新算 sign
  • 不一致直接拒绝

七、总结(推荐组合)

✅ 生产级防篡改方案

HTTPS
+ 参数签名(HMAC)
+ 时间戳
+ nonce
+ 服务端校验

如果是用户系统:

HTTPS + JWT + 接口签名

如果你愿意,我可以:

  • 给你一个 完整 Java 签名工具类
  • 或针对 Spring Boot / HttpClient / OkHttp 写示例
  • 或讲 前端 + 后端联合防篡改方案

你现在是哪种场景?(支付?开放 API?前端调用?)

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手