栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

对外接口验证sign工具

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

对外接口验证sign工具

public class SignUtils {


    
    public boolean sign(String app_id,String my_app_id,String app_secret,String my_app_secret,
                        Long timestamp,String sign,String my_sign){
        boolean signBool = false;
        boolean ids = my_app_id.equals(app_id);
        boolean secret = my_app_secret.equals(app_secret);
        boolean timeSign = false;
        int timeAbs = equalsTimeMin(timestamp);
        if(timeAbs<=5){
            timeSign = true;
        }else{
            timeSign = false;
        }

        Encodes encodes = new Encodes();
        MD5Tools md5Tools = new MD5Tools();
        String md5Sign = md5Tools.MD5(my_sign).toUpperCase();
        boolean isSign = sign.equals(md5Sign);

        if(ids==true&&secret==true&&timeSign==true&&isSign==true){
            signBool = true;
        }else{
            signBool = false;
        }
        return signBool;
    }


    
    public int equalsTimeMin(long timestamp){
        if("".equals(timestamp)){
            return 10000000;
        }
        long time = (System.currentTimeMillis() - timestamp) / (1000 * 60);
        int timeInt = (int)time;
        int timeAbs = Math.abs(timeInt);
        return timeAbs;
    }

}





import java.security.MessageDigest;


public class MD5Tools
{
    public final static String MD5(String pwd) {
        //用于加密的字符
        char[] md5String = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F'};
        try {
            //使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中
            byte[] btInput = pwd.getBytes();

            //信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
            MessageDigest mdInst = MessageDigest.getInstance("MD5");

            //MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
            mdInst.update(btInput);

            // 摘要更新之后,通过调用digest()执行哈希计算,获得密文
            byte[] md = mdInst.digest();

            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char[] str = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {   //  i = 0
                byte byte0 = md[i];  //95
                str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5
                str[k++] = md5String[byte0 & 0xf];   //   F
            }

            //返回经过加密后的字符串
            return new String(str);

        } catch (Exception e) {
            return null;
        }
    }
}

验签规则:

一、 验签规则 1. 概述

接口出于安全考虑,需要进行签名校验。客户需要生成一对密钥,私钥用于加签,自行 保管,公钥用于验签,提供给奥烱。涉及验签的接口,增加时间戳,为避免重放攻击。

2. 准备工作

客户需要生成 SHA256withRSA 2048 密钥,可以使用 openssl 工具生成。 首先在终端中进入 openssl 工具,依次执行如下命令(复制运行时请不要复制 OpenSSL> 提示符及 注释)

OpenSSL> genrsa -out app_private_key.pem 2048 #生成私钥 
OpenSSL> pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM - nocrypt -out app_private_key_pkcs8.pem #Java 开发者需要将私钥转换成 PKCS8 格式 
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem #生成公钥 
OpenSSL> exit #退出 O penSSL 程序

得到三个文件:
1:app_private_key.pem : 开发者 RSA 私钥,非 Java 语言适用请自行妥善保管。 2:app_private_key_pkcs8.pem : pkcs8 格式开发者 RSA 私钥,(Java 语言适用)请自行 妥善保管。 3:app_public_key.pem : 开发者 RSA 公钥,提供给奥烱方面,验签使用

3. 验签步骤

将请求的参数名进行字典升序排列,把参数名和参数值直接拼接起来,对拼接形成的字符串 +自己的私钥 调用 rsa 签名算法(SHA256WithRSA)生成 sign 值。
签名生成的具体步骤为:
1、准备自己保留的 rsa 私钥;
2、对请求参数进行字典升序排列 ;
3、以&拼接排好序的参数,参数的形式为 key=value(key 和 value 去除首尾空格);
4、计算步骤 3 生成结果+自己的私钥 调用 rsa 签名算法(SHA256WithRSA)生成 sign 值
注:
1、签名时的所有参数,无须 urlencode;
2、编码统一使用 UTF-8;
3、key 和 value 的首尾请不要有空格,不然容易出现签名错误。
4、rsa 签名算法:SHA256WithRSA 加密前的明文最大长度 247 字节,解密密文最大长 度为 256 字,秘钥长度为 2048
5、对于不传值的字段或传值为空串的字段均不参与签名计算

示例 1: token 生成接口的 sign 参数生成示例
1.准备自己保留的 rsa 私钥;
2. 对请求参数的 key(参数名)进行字典升序排列。排好序的参数信息依次为:
appSecret:16498a942123
appId:164989231421
timestamp:1602664027823

  1. 以&拼接排好序的参数,参数的形式为 key=value。拼接结果为:
    aoyiProductInventoryRequest={“appId”:“164989231421”,“appSecret”:“1649 8a942123”,“divisionCode”:“812”,“itemId”:“30506745”,“num”:1,“skuId”:“3 0508566001”,“timestamp”:1602664027823}&appId=164989231421&appSecret=1 6498a942123×tamp=1602664027823

4、计算步骤 3 生成结果 data +自己的私钥 privateKey 调用 rsa 签名函数生成 sign 值 有加密增加验签 生成签名如下: QMpBtudcsVppihkZpwkYqEy7/+eWt8wUyPRm1Xn/lnUbcR/SFNQm67FW2PmYyYITko3ee HxEVqT6WjqPDVT2/1wQRG7QR/zT6gbXVbce6oj2h6rNmjhMwNT3jm3O9PzgOnLUX0+Y3K Dvenf4YEn1CqhZQOGwTJJx5jrGsw4HnXuSjSFG78K/5kTXyZAnHE0fdTWFGmWTltvMKIu sxCuchK2ceWNey2bd6cVOFmKkAofqfCn0BSBpxqFvvq3HtnZ49EVj8E3o0Yku9AonM2Cn kf3tzp8XsqvlSO6QoVukPQyAELH3J9iidTgZBt2lP45PaMHKsOxxnGn1CFqEcpsWSQ==

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号