- 浏览: 144974 次
- 性别:
- 来自: 上海
文章分类
最新评论
java类型导致md5签名结果不一致
- 博客分类:
- java
<div class="iteye-blog-content-contain" style="font-size: 14px;">
<p> 最近对接第三方公司的接口的时候发现一个问题,如果都使用md5加密签名,单元测试的时候和测试环境使用相同的参数值进行md5签名,发现结果不一致,经过一番折腾和问别人,发现是类型导致的,直接上代码</p>
<pre name="code" class="java">public class SignExample {
private static final String key = "123456";
public static void main(String[] args) {
/*Map<String, Object> map = new HashMap<>();
map.put("abc", 234);
map.put("dfe", "daw");
map.put("bbd", System.currentTimeMillis());//2598128947B95E1DF910AB7F41DAB779 36D6EFC1DF9E4F864862000A0230806F
generateSign(map, key);*/
Map<String, String> map = new HashMap<>();
map.put("abc", "234");
map.put("dfe", "daw");
map.put("bbd", String.valueOf(System.currentTimeMillis()));
generateSign(map, key);
}
/**
* 生成签名
* @param params
* @param key
* @return md5加密签名
*/
private static Map<String, String> generateSign(Map<String, String> params, String key) {
String param = paramFilter(params);
Map<String, String> signMap = new HashMap<>(2);
String sign = DigestUtils.md5Hex((param + "&key=" + key).getBytes()).toUpperCase();
signMap.put("urlSuffix", param);
signMap.put("sign", sign);
System.out.println(sign);
return signMap;
}
/**
* 过滤值不为空和参数不是sign sign_type的参数
* @param params
* @return
*/
private static String paramFilter(Map<String, String> params) {
if (null == params || params.isEmpty()) {
return null;
}
List<String> paramList = new ArrayList<>();
params.entrySet().forEach(param -> {
if (StringUtils.isNotEmpty(param.getValue().toString()) && !"sign".equalsIgnoreCase(param.getKey()) && !"sign_type".equalsIgnoreCase(param.getKey())) {
paramList.add(param.getKey() + "=" + param.getValue());
}
});
Collections.sort(paramList);
return paramList.stream().collect(Collectors.joining("&"));
}
}</pre>
<p> 上面的md5加密直接使用的commons-codec</p>
<p><dependencies></p>
<p> <dependency></p>
<p> <groupId>commons-codec</groupId></p>
<p> <artifactId>commons-codec</artifactId></p>
<p> <version>1.10</version></p>
<p> </dependency></p>
<p> <dependency></p>
<p> <groupId>org.apache.commons</groupId></p>
<p> <artifactId>commons-lang3</artifactId></p>
<p> <version>3.4</version></p>
<p> </dependency></p>
<p> </dependencies></p>
<p> </p>
<p>上面main函数中我注释了一部分,大家改一下类型后会发现结果不一致。</p>
<p> </p>
<p>欢迎加入qq学习交流群513650703 一起交流学习</p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p> 最近对接第三方公司的接口的时候发现一个问题,如果都使用md5加密签名,单元测试的时候和测试环境使用相同的参数值进行md5签名,发现结果不一致,经过一番折腾和问别人,发现是类型导致的,直接上代码</p>
<pre name="code" class="java">public class SignExample {
private static final String key = "123456";
public static void main(String[] args) {
/*Map<String, Object> map = new HashMap<>();
map.put("abc", 234);
map.put("dfe", "daw");
map.put("bbd", System.currentTimeMillis());//2598128947B95E1DF910AB7F41DAB779 36D6EFC1DF9E4F864862000A0230806F
generateSign(map, key);*/
Map<String, String> map = new HashMap<>();
map.put("abc", "234");
map.put("dfe", "daw");
map.put("bbd", String.valueOf(System.currentTimeMillis()));
generateSign(map, key);
}
/**
* 生成签名
* @param params
* @param key
* @return md5加密签名
*/
private static Map<String, String> generateSign(Map<String, String> params, String key) {
String param = paramFilter(params);
Map<String, String> signMap = new HashMap<>(2);
String sign = DigestUtils.md5Hex((param + "&key=" + key).getBytes()).toUpperCase();
signMap.put("urlSuffix", param);
signMap.put("sign", sign);
System.out.println(sign);
return signMap;
}
/**
* 过滤值不为空和参数不是sign sign_type的参数
* @param params
* @return
*/
private static String paramFilter(Map<String, String> params) {
if (null == params || params.isEmpty()) {
return null;
}
List<String> paramList = new ArrayList<>();
params.entrySet().forEach(param -> {
if (StringUtils.isNotEmpty(param.getValue().toString()) && !"sign".equalsIgnoreCase(param.getKey()) && !"sign_type".equalsIgnoreCase(param.getKey())) {
paramList.add(param.getKey() + "=" + param.getValue());
}
});
Collections.sort(paramList);
return paramList.stream().collect(Collectors.joining("&"));
}
}</pre>
<p> 上面的md5加密直接使用的commons-codec</p>
<p><dependencies></p>
<p> <dependency></p>
<p> <groupId>commons-codec</groupId></p>
<p> <artifactId>commons-codec</artifactId></p>
<p> <version>1.10</version></p>
<p> </dependency></p>
<p> <dependency></p>
<p> <groupId>org.apache.commons</groupId></p>
<p> <artifactId>commons-lang3</artifactId></p>
<p> <version>3.4</version></p>
<p> </dependency></p>
<p> </dependencies></p>
<p> </p>
<p>上面main函数中我注释了一部分,大家改一下类型后会发现结果不一致。</p>
<p> </p>
<p>欢迎加入qq学习交流群513650703 一起交流学习</p>
<p> </p>
<p> </p>
<p> </p>
</div>
发表评论
-
maven项目不编译 idea pluin不显示compiler
2018-06-27 22:36 983今天开发项目中遇见一个很奇怪的问题,其他模块都能正常编译,有 ... -
poi读取excel
2018-06-09 23:11 0最近使用poi读取excel文件时,excel时间格式输入的 ... -
spring 嵌套事务
2018-06-01 22:41 1224今天在code review的时候,发现有嵌套事务,由于嵌 ... -
invalid bound statement常见原因
2018-04-22 19:48 1452开发中使用mybaitis常遇见错误org.apache.i ... -
java 读取网络ZipInputStream 中 Zipentry 文本文件
2017-10-22 12:09 3220在读取网络文件中的文件时有可能是gzip tar zip格式 ... -
java笔试题
2017-04-23 22:04 503最近换工作面试了一些公司,将记得的笔试题与大家分享一下,由 ... -
java ldap开发常见问题与代码
2017-04-23 22:00 1724最近因工作需要自己花时间学习了ldap的API并在项目中使 ... -
java3年到5年工作经验面试题整理
2017-04-02 22:39 17641最近换工作陆陆续续面试了10来家公司吧,大概整理了一下面 ... -
java 通过jdbc生成java实体
2016-12-17 22:31 431平时开发中总是要根据别人建立好的数据库生成对应的实体,当然如果 ... -
java 括号匹配
2016-08-21 15:11 853最近工作需要,要截取一个sql中某个函数,刚好这个函数有括号 ... -
java 删除mysql/Oracle所有表
2016-06-26 22:09 705最近测试项目,自己的本机搭建环境总是删除表,用java写了一 ... -
hibernate多数据源配置与使用
2016-03-26 22:33 725关于hibernate中多个数据源数据传输的使用: 1.首 ... -
java通过jdbc读取oracle数据库数据和插入数据
2016-03-26 21:34 1643最近因工作需要,需要做数据同步。java通 ... -
基于jdk规范的webservice
2016-01-13 23:30 456最近在项目中使用webservice连接调用其 ... -
maven 项目JUnit4 Spring JdbcTemplate 测试dao
2015-09-19 12:32 2773最近使用maven项目,由于前后端完 ... -
JdbcTemplate queryForObject Incorrect result size: expected 1, actual 0
2015-09-12 23:01 4760使用Spring中的jdbcTemplate 时,通过id ... -
java excel导入数据库
2015-09-04 21:29 730最近项目中让做将excel数据导入到数据库的功能 ... -
java 读取网络文件 protocol = http host = null
2015-07-27 22:48 6575java中通过ip地址读取文件 public void t ... -
Spring namedparameterjdbctemplate 实现批量更新
2015-07-14 23:35 3544最近开发中使用了spring的NamedParameter ... -
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
2015-04-20 22:49 542java.lang.ClassNotFoundExcepti ...
相关推荐
java与c#MD5加密方法得到不一致解决办法,MD5加密后得到不一致结果
解决java 与C# MD5 不一致问题
完美解决js的md5中文和java不一致的情况 java: public class TestController2 { public static void main(String args[]){ String a = "我是中国人"; a = DigestUtils.md5Hex(a); System.out.println(a); //a: ...
解决Delphi 中文MD5签名和Java MD5签名不一致的问题。
Java计算文件MD5值(支持大文件) package com.hthl.xxtd; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import org....
数字签名 MD5 JAVA 数字签名 MD5 JAVA 数字签名 MD5 JAVA 数字签名 MD5 JAVA 数字签名 MD5 JAVA
Java实现MD5加密以及解密,附带测试类,具体见代码。 Java实现MD5加密以及解密,附带测试类,具体见代码。 Java实现MD5加密以及解密,附带测试类,具体见代码。 Java实现MD5加密以及解密,附带测试类,具体见代码。
数字签名 md5数字签名 c实现的md5数字签名 java实现的md5数字签名 数字签名 md5数字签名 c实现的md5数字签名 java实现的md5数字签名
JAVA代码实现MD5编码,不调用任何第三方API-MD5 hash algorithm implemented by JAVA.
MD5和RSA加密算法Java完成实现,及实现RSA需要用的jar包。参见博文 http://blog.csdn.net/yanzi1225627/article/details/26508035
java MD5 java MD5 java MD5 java MD5 java MD5 java MD5
js java MD5加密 解决中文不一致问题 验签 只有英文 数字的可以忽略了
使用RSA、MD5对参数生成签名及接收方验签
JAVA与C#一致的32位MD5加密方法
MD5算法源代码,java类型的,实此程序现了md5算法,能正确运行!
java中的MD532位加密。将java类放入项目中,使用encrypByMd5静态方法即可生成hex_md5 32位加密的字符串。
md5java代码+md5工具
使用微信支付签名MD5加密算法。可以使用,可以根据微信签名工具验证,是一样的。 如果提示“签名失败“,就要考虑到key只是否一致。统一下单和发起支付时的key值要一样的。
Java中实现Md5(32位)加密,此资源下载后可直接在程序中使用
java实现md5 加密解密(在网络中MD5是著名的不可逆算法,但是如果知道MD5的加密的字符串 则可以通过自己的加密算法对明文进行加密,对加密后的密文与字符串匹配; 匹配成功,表示找到明文;但是此程序的时间耗费较高!仅...