API接口设计

对第三方提供服务,我们的api接口应该怎么设计呢?

一、防重复提交,防篡改设计

参数 描述
ak注册应用时颁发的ak,每个接入应用唯一
signatureMethod固定为HmacSHA256
timestamp     接口提交时间,精确到毫秒。
nonce防重复提交标识,每次接口唯一
signature签名值

签名计算参考:https://blog.csdn.net/js_sky/article/details/49024959


import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class SignUtil {
    public static String sign(String message, String secret) throws Exception {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
        System.out.println(hash);
        return hash;

    }
}

客户端提交:

secret可以替换为应用sk;

message=requestBody里内容+timestamp+nonce

sigature=SignUtil.sign(message,sk);

服务端验证:

1、验证参数合法性,signatureMethod值是否正确;

2、timestamp是否超时

3、nonce是否已被使用过;

4、根据ak查询到sk,然后根据同样的方式计算签名,判定签名是否正确;

借助该种方式,服务端还能确定客户端身份,因为sk是客户端独有的。

二、安全性

1、传输层安全

借助https协议,可以实现传输层安全。

2、应用层安全

方式一:静态密钥

1、应用注册时服务方给应用颁发ak/sk ,并颁发对称加密密钥cek;

后续客户端请求发起时cek对body数据加密后传输,服务端使用cek解密后再做后续业务;

这种方式密钥是静态的,无法轮换。

方式二:动态密钥

注册是应用端生成一对公私钥,然后将公钥提供给服务方;

1、申请加密密钥,使用第一章节中的接口提交方式,来申请加密密钥。

2、服务端验证成功后生成加密密钥CEK,使用应用的公钥对cek进行加密,返回返给客户端;

3、客户端接收到结果后,使用私钥解密,解密得到CEK

4、后续交互使用cek进行加密后进行传输。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值