单项加密-接口签名用到的加密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(); } }
5.java常见的密码加密方式base64,Sha256,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);
11. 、TreeMap如不指定排序器,默认将按照key值进行升序排序
12.TreeMap是按照自身的顺序排序,比如数字的话,按照数字升序,ascII等。
13.Map ,HashMap , TreeMap , TreeMap 默认排序
HashMap是按照HashCode 排序,莫名其妙的顺序。
TreeMap是按照自身的顺序排序,比如数字的话,按照数字升序,ascII等。
LinkedHashMap是按照先进先出的顺序。
二. 开放api接口平台都会有appid、appkey、appsecret
2.1 通过appkey 和 appsecret 确定账号权限
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库