温馨提示×

温馨提示×

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

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

Java API接口如何加密

发布时间:2026-07-17 02:55:29 来源:亿速云 阅读:107 作者:小樊 栏目:编程语言

在 Java 中,API 接口加密通常是为了解决以下问题之一:

  • 防止数据被窃听(HTTPS 解决)
  • 防止请求被篡改
  • 防止重放攻击
  • 防止未授权调用

下面从 常见方案完整示例,给你一个系统性的说明。


一、最基础:HTTPS(必须)

第一步一定是 HTTPS
所有接口必须通过 HTTPS,否则任何加密都能被抓包破解。

HTTP + 自定义加密 ≈ 没加密
HTTPS + 简单防护 ≈ 安全

二、接口签名(最常见方案)

✅ 1. 核心思想

客户端和服务端 约定一套规则,对请求参数进行签名:

  • 防篡改
  • 防重放
  • 验证身份

✅ 2. 签名流程

客户端:

  1. 参数排序
  2. 拼接字符串
  3. 加密钥
  4. 生成签名
  5. 发送请求(签名放 header)

服务端:

  1. 按相同规则生成签名
  2. 对比签名是否一致

✅ 3. 示例(SHA256 签名)

请求参数

{
  "userId": 1001,
  "amount": 200,
  "timestamp": 1700000000
}

生成签名(Java)

import java.security.MessageDigest;

public class SignUtil {

    private static final String SECRET = "mySecretKey";

    public static String sign(String data) throws Exception {
        String content = data + SECRET;
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(content.getBytes());
        StringBuilder sb = new StringBuilder();
        for (byte b : hash) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}

✅ 4. 接口调用示例

Header

X-Timestamp: 1700000000
X-Signature: a1b2c3d4...

服务端校验

String serverSign = SignUtil.sign(params + timestamp);
if (!serverSign.equals(clientSign)) {
    throw new RuntimeException("签名错误");
}

三、防重放攻击(非常重要)

✅ 方案一:Timestamp

long now = System.currentTimeMillis() / 1000;
if (Math.abs(now - timestamp) > 60) {
    throw new RuntimeException("请求过期");
}

✅ 方案二:Nonce(一次性随机值)

nonce = UUID

服务端缓存 5 分钟,已存在则拒绝。


四、对称加密(参数加密)

适合:参数敏感,但不频繁调用

✅ AES 加密

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encrypted = cipher.doFinal(data.getBytes());

❗ AES 密钥管理是难点(建议结合 KMS 或非对称加密)


五、非对称加密(高安全)

✅ RSA 典型用法

  1. 客户端用 公钥加密
  2. 服务端用 私钥解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

✅ 适合:

  • 登录
  • 下发 token
  • 敏感数据

❌ 不适合大参数(性能差)


六、Token 鉴权(JWT)

✅ JWT + 签名

String token = JWT.create()
    .withClaim("userId", 1001)
    .sign(Algorithm.HMAC256(secret));
Authorization: Bearer xxxxxx

✅ 防篡改
⚠️ 不能防泄露(需 HTTPS)


七、推荐组合方案(实战)

✅ 对外 API(最常用)

HTTPS
+ Token(JWT)
+ 签名(SHA256)
+ Timestamp / Nonce

✅ 高安全接口

HTTPS
+ RSA 加密关键参数
+ AES 加密业务数据
+ JWT

八、Spring Boot 示例(拦截器)

public class SignInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) {
        // 校验签名
        return checkSign(request);
    }
}

九、常见错误 ❌

错误 说明
只用 AES/RSA 没解决重放和篡改
密钥写死在前端 等于没加密
签名参数不全 可被篡改
忽略时间戳 可被重放

十、总结一句话

Java API 接口加密 = HTTPS + 签名 + 防重放 + 鉴权


如果你能提供:

  • ✅ 是 内部接口 / 开放平台 / 前端调用
  • ✅ 是否 Spring Boot
  • ✅ 是否需要 银行/支付级别安全

我可以直接给你一套 可直接用的完整方案或代码模板

向AI问一下细节

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

AI