5

第三方 API 接口安全加密方法和认证

 1 year ago
source link: https://blog.52itstyle.vip/archives/5588/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

第三方 API 接口安全加密方法和认证

作者:小柒

发表于 2023-04-03 

  |   分类于

程序人生

4223130427.jpg

与第三方系统做系统对接,接口认证是必不可少的,安全的认证方式可以极大的增强系统的安全性访问。

Baic 认证

一种及其简单的认证方式,调用方通过对用户名和密码做 Base64 加密然后传递到服务端进行认证。

代码如下:

## 拼接 key
String key = "app_id:app_secrect";
Map<String, String> headers = new HashMap<>();
## Base64 对 key 进行加密
headers.put("Authorization", "Basic " + Base64.encode(key));
request.addHeaders(headers);
Map<String, Object> form = new HashMap<>();
form.put("grant_type", "client_credentials");
form.put("scope", "write");
request.form(form);
request.execute().body();

Baic 认证 + Token

如果想进一步加强认证,可以通过上一步获取 accessToken,然后每次请求携带。

JSONObject jsonObject = new JSONObject();
jsonObject.put("invoiceTypeNo","04");
HttpRequest httpRequest = HttpUtil.createPost(url);
headers = new HashMap<>();
headers.put("Authorization", "Bearer  ".concat(accessToken));
headers.put("Content-Type","application/json");
httpRequest.addHeaders(headers);
httpRequest.body(jsonObject.toJSONString());
String info = httpRequest.execute().body();

安全性相对 Baic认证 有所提升,每次接口调用时都使用临时颁发的 access_token 来代替用户名和密码 减少凭证泄漏的机率。

在每次接口调用时都需要传输以下参数:

  • appKey 应用秘钥
  • time 当前时间戳
  • nonce 随机数
  • sign 签名
String appKey = "qwe@2023";
SortedMap<String, String> packageParams = new TreeMap<>();
packageParams.put("time", System.currentTimeMillis()+"");
packageParams.put("nonce ", RandomStringUtils.randomNumeric(8));
String sign = createSign(packageParams, appKey);
packageParams.put("sign", sign);
//发送请求附带相关参数

获取签名:

public static String createSign(SortedMap<String, String> packageParams, String appKey) {
        StringBuffer sb = new StringBuffer();
        Set es = packageParams.entrySet();
        Iterator it = es.iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            String k = (String) entry.getKey();
            String v = (String) entry.getValue();
            if (StringUtils.isNotBlank(v)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + appKey);
        return HMACUtil.HMACSHA256(sb.toString(),appKey);
}

HMACSHA256 加密:

1946531230.png
public static String HMACSHA256(String data, String key){
        try {
            Mac  sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
            sha256_HMAC.init(secret_key);
            byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder();
            for (byte item : array) {
                sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3);
            }
            return sb.toString().toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
}
  • 服务端使用相同的方式生成签名进行对比认证,无需在网络上传输 app_key 可以防止中间人攻击
  • 通过 time 参数判断请求的时间差是否在合理范围内,可防止重放攻击
  • 通过 nonce 参数进行幂等性判断
爪哇笔记
6359488940289160158582279.gif

作者: 小柒

出处: https://blog.52itstyle.vip

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件([email protected])咨询。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK