单项加密-接口签名用到的加密key digestutils.md5hex和md5的区别,map排序

 

 

 

--使用Apache的commons-codes加密(假如渠道用的不是spring框架开发呢)

DigestUtils.md5Hex(password.getBytes("utf-8"));

 Maven 配置 commons-codec 下的MD5加密

  

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>

 

--SPIRNG 自带的加密代码 二者结果是一样的

 DigestUtils.md5DigestAsHex("123.com".getBytes("utf-8"))


 MD5三种方式加密(16位大小、32位大小),base64两种方式加解密整理

1.MD5是单向加密的,不可逆,可以加密,不能解密

  md5hex是可逆的,可以加密,可以解密

 

  MD5是单向加密的,不管何种数据进行MD5加密都会得到固定长度的字符串, MD5一般用户文件完整性的校验,也有用来做密码加密的。 想要破解MD5,因其本身的算法不可逆,故只能使用穷举法,也就是不断拼字符串加密和已知的MD5字符串进行比对

2.MD5是16位以16个元素的形式返回值 md5hex是以32位16进制的小写字符串形式返回

  2.1java工具类-DigestUtils实现md5码加密

 

 

 

 

复制代码
package ins.business.common.tools;

import java.security.MessageDigest;

/**
* @author jgk 
* @version 创建时间:2018年4月28日 上午9:56:12
* 类说明
*/
public class PasswordTools {
    
    /**
     * 生成默认的用户密码
     * @auth : jgk
     * @date :2018年4月28日 上午9:57:27 
     * @Title:generatorUserPassword 
     * @param@return 
     * @return :String 
     * @throws
     */
    public static String generatorUserPassword () {
        return "TSBX8888";
    }
    
    /**
     * MD5密码加密
     * @auth : jgk
     * @date :2018年4月28日 上午10:01:30 
     * @Title:encodingPassword 
     * @param@param password
     * @param@return 
     * @return :String 
     * @throws
     */
    public static String encodToMd5 (String password) {
        if (password == null) {
            return null;
        }
        MessageDigest md5 = null;  
        try{  
            md5 = MessageDigest.getInstance("MD5");  
        }catch (Exception e){  
            System.out.println(e.toString());  
            e.printStackTrace();  
            return "";  
        }  
        char[] charArray = password.toCharArray();  
        byte[] byteArray = new byte[charArray.length];  

        for (int i = 0; i < charArray.length; i++)  
            byteArray[i] = (byte) charArray[i];  
        byte[] md5Bytes = md5.digest(byteArray);  
        StringBuffer hexValue = new StringBuffer();  
        for (int i = 0; i < md5Bytes.length; i++){  
            int val = ((int) md5Bytes[i]) & 0xff;  
            if (val < 16)  
                hexValue.append("0");  
            hexValue.append(Integer.toHexString(val));  
        }  
        return hexValue.toString();
    }
}
复制代码

 

 

 

 

4.md5加密工具类 参考 后台管理登录已经用到的

5.java常见的密码加密方式base64,Sha256,MD5

6.java之使用md5对密码进行加密

 

7.签名 加密 规则 加签的时候没有sign,sign是参数+key加签生成的,就是除sign以外的参数和key按照上面这种方式按照ascii升序排列加签就是sign

     //  ASCII码排序规则:符号在前,然后是0-9 ,然后是大写字母A-Z,然后是小写字母a-z 

  7.1 通常在业务需求中调用别人接口的时候,会有对英文字母升序排序(ASCII升序),然后加密啥的,最后生成一个签名再传给对方这一类的要求,这里巧妙利用TreeMap来实现ASCII排序。 没看懂

  

复制代码
  public static String sendNewData(String userName, String key,String url) {      
            String result = "";       
            try {         
                //把参数put到TreeMap里去         
                Map<String, String> map = new TreeMap<String, String>();        
                map.put("userName", userName);           
                map.put("time", String.valueOf(System.currentTimeMillis() / 1000));
                //构建签名,参数已经重新按照ASCII排序过    
                map.put("sign", buildSign(map, key));
                //post请求        
                //result = post(url, map);
                // 打印返回的结果          
                //System.out.println(result);
            } catch (Exception e) {          
                 e.printStackTrace();       
            }        
                 return "";   
        }

//构建签名的时候,我们只需把TreeMap里的参数一个个的取出来就行了,TreeMap已经把我们之前put进去的参数自动排序了
public static String buildSign(Map<String, String> map, String key) { Set<Map.Entry<String, String>> set = map.entrySet(); StringBuffer sb = new StringBuffer(); //取出排序后的参数,逐一连接起来 for (Iterator<Map.Entry<String, String>> it = set.iterator(); it.hasNext();) { Map.Entry<String, String> me = it.next(); sb.append(me.getValue() + "|"); } sb.append(key); return sb.toString().toUpperCase();//返回最终排序后的结果,这里key不参与排序中,具体看接口规约 // return (Md5Encrypt.encrypt(sb.toString())).toUpperCase();//这个带有md5加密的,算法就不贴了,网上很多 // }
复制代码

 

  7.2  java.util.TreeMap 放入其中的value,自动按key进行排序, 默认的排序规则按ascii码排序,如果是key是英文和数字不会有问题,如果中文则会出现问题,需要自己写排序规则。

  7.3  TreeMap 默认排序规则:按照key的字典顺序来排序(升序)

  7.4 字典排序(lexicographical order)是一种对于随机变量形成序列的排序方法。即按照字母顺序,或者数字小大顺序,由小到大的形成序列。

     以问题中提到的序列为例,“ilove”的第一个字母是“i”,“baray”的第一个字母是“b",在字母表中,”i“是排到”b“前面的,所以”ilove“就应该排到”baray“前面。

 8.  map请求参数按照ascii升序排序后md5加密

  

复制代码
package com.oleka.org.qfpay.utils;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.apache.commons.codec.digest.DigestUtils;
 
public class QfpayUtil {
    
    /**
     * 加签
     * @param map
     * @return
     */
    public static String sign(Map<String, Object> map, String signKey){
        if(map==null){
            return null;
        }
        List<String> keyList = new ArrayList<>(map.keySet());
        Collections.sort(keyList);
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<keyList.size();i++){
            String key = keyList.get(i);
            Object value = map.get(key);
            sb.append(key+"="+value+"&");
        }
        String signStr = sb.substring(0, sb.length()-1)+signKey;
        System.out.println("before sign: "+signStr);
        String md5Str = DigestUtils.md5Hex(signStr);
        System.out.println("after sign: "+md5Str);
        return md5Str;
    }
    
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("abc", "123");
        map.put("cba", "111");
        map.put("bca", "222");
        QfpayUtil.sign(map, "111111");
        /**
         * output
         *     before sign: abc=123&bca=222&cba=111111111
            after sign: c1f8a7c16bdb1f998f361d4dfafef4ee
         */
        
    }
    
}
复制代码

 

 9.Java 根据 Map 的 key 的 ASCII 码从小到大排序 ---采用

复制代码
// 方式一:TreeMap可以自动排序
        TreeMap<String, Object> params = new TreeMap<String, Object>();
        setData(params);
        
        StringBuilder s1 = new StringBuilder();
        for (String key : params.keySet()) {
            s1.append(key).append("=").append(params.get(key)).append("&");
        }
        s1.deleteCharAt(s1.length() - 1);
        System.out.println(s1);
复制代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
posted @   BBS_自律  阅读(6334)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示