Java接口签名,按字典正序排序

  • Post author:
  • Post category:java


Java接口签名,按字典正序排序工具类



方法


1.接口签名

public class SignUtils {

    /**
     * 生成时间戳
     * */
    public static String getTimestamp() {
        long timestampLong =System.currentTimeMillis();
        String timestampStr = String.valueOf(timestampLong);
        return timestampStr;
    }

    /**
     * 生成随机字符串
     * @param length 长度
     *
     * */
    public static String getNonceStr(int length){
        String str="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
        Random random=new Random();
        StringBuffer randomStr=new StringBuffer();
        for(int i=0; i<length; ++i){
            int number=random.nextInt(62);
            randomStr.append(str.charAt(number));
        }
        return randomStr.toString();
    }


   /**
    * 接口的签名生成方法
    * @param params 参数
    * @param privateKey 秘钥
    * */
    public static String createSign(Map<String, String> params, String privateKey){
        StringBuilder sb = new StringBuilder();
        // 将参数以参数名的字典升序排序
        Map<String, String> sortParams = new TreeMap<String, String>(params);
  
        for (Map.Entry<String, String> entry : sortParams.entrySet()) {
            String key = entry.getKey();
            String value =  entry.getValue().trim();
            if (!StringUtils.isEmpty(value)){
               sb.append("&").append(key).append("=").append(value);
            }
        }
        String stringA = sb.toString().replaceFirst("&","");
        String stringSignTemp = stringA + "&"+"appsecret="+privateKey;      
        //将签名使用MD5加密并全部字母变为大写
        //String signValue = Md5Utils.hash(stringSignTemp);
        String signValue = Md5Utils.hash(stringSignTemp).toUpperCase();       
        return signValue;
    }



}

/**
 * Md5加密方法
 */
public class Md5Utils{
private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);

    private static byte[] md5(String s)
    {
        MessageDigest algorithm;
        try
        {
            algorithm = MessageDigest.getInstance("MD5");
            algorithm.reset();
            algorithm.update(s.getBytes("UTF-8"));
            byte[] messageDigest = algorithm.digest();
            return messageDigest;
        }
        catch (Exception e)
        {
            log.error("MD5 Error...", e);
        }
        return null;
    }

    private static final String toHex(byte hash[])
    {
        if (hash == null)
        {
            return null;
        }
        StringBuffer buf = new StringBuffer(hash.length * 2);
        int i;

        for (i = 0; i < hash.length; i++)
        {
            if ((hash[i] & 0xff) < 0x10)
            {
                buf.append("0");
            }
            buf.append(Long.toString(hash[i] & 0xff, 16));
        }
        return buf.toString();
    }

    public static String hash(String s)
    {
        try
        {
            return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
        }
        catch (Exception e)
        {
            log.error("not supported charset...{}", e);
            return s;
        }
    }
  }



总结

1.将所有的参数拼接,并按照字典正序排序。

2.使用md5 进行加密处理。

3.秘钥可通过配置自定义配置获取,进行复用。

4.使用时间戳是为了防止重复提交。

5.使用随机数是为了验证参数不被篡改。

6.MD5的工具类是若依项目的,希望对你有用哦!!!



版权声明:本文为weixin_40050628原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。