- 浏览: 150213 次
- 性别:
- 来自: 上海
文章分类
最新评论
<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 1033今天开发项目中遇见一个很奇怪的问题,其他模块都能正常编译,有 ... -
poi读取excel
2018-06-09 23:11 0最近使用poi读取excel文件时,excel时间格式输入的 ... -
spring 嵌套事务
2018-06-01 22:41 1284今天在code review的时候,发现有嵌套事务,由于嵌 ... -
invalid bound statement常见原因
2018-04-22 19:48 1610开发中使用mybaitis常遇见错误org.apache.i ... -
java 读取网络ZipInputStream 中 Zipentry 文本文件
2017-10-22 12:09 3303在读取网络文件中的文件时有可能是gzip tar zip格式 ... -
java笔试题
2017-04-23 22:04 538最近换工作面试了一些公司,将记得的笔试题与大家分享一下,由 ... -
java ldap开发常见问题与代码
2017-04-23 22:00 1800最近因工作需要自己花时间学习了ldap的API并在项目中使 ... -
java3年到5年工作经验面试题整理
2017-04-02 22:39 17753最近换工作陆陆续续面试了10来家公司吧,大概整理了一下面 ... -
java 通过jdbc生成java实体
2016-12-17 22:31 481平时开发中总是要根据别人建立好的数据库生成对应的实体,当然如果 ... -
java 括号匹配
2016-08-21 15:11 891最近工作需要,要截取一个sql中某个函数,刚好这个函数有括号 ... -
java 删除mysql/Oracle所有表
2016-06-26 22:09 753最近测试项目,自己的本机搭建环境总是删除表,用java写了一 ... -
hibernate多数据源配置与使用
2016-03-26 22:33 770关于hibernate中多个数据源数据传输的使用: 1.首 ... -
java通过jdbc读取oracle数据库数据和插入数据
2016-03-26 21:34 1708最近因工作需要,需要做数据同步。java通 ... -
基于jdk规范的webservice
2016-01-13 23:30 502最近在项目中使用webservice连接调用其 ... -
maven 项目JUnit4 Spring JdbcTemplate 测试dao
2015-09-19 12:32 2815最近使用maven项目,由于前后端完 ... -
JdbcTemplate queryForObject Incorrect result size: expected 1, actual 0
2015-09-12 23:01 4815使用Spring中的jdbcTemplate 时,通过id ... -
java excel导入数据库
2015-09-04 21:29 775最近项目中让做将excel数据导入到数据库的功能 ... -
java 读取网络文件 protocol = http host = null
2015-07-27 22:48 6698java中通过ip地址读取文件 public void t ... -
Spring namedparameterjdbctemplate 实现批量更新
2015-07-14 23:35 3728最近开发中使用了spring的NamedParameter ... -
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
2015-04-20 22:49 585java.lang.ClassNotFoundExcepti ...
相关推荐
如果这个新的摘要与解密后的签名一致,那么可以确认参数在传输过程中没有被修改,从而信任这些参数。 在这个过程中,RSA提供非对称加密的保障,使得只有持有私钥的发送方能生成有效的签名,而任何人都可以使用公钥...
这样,服务器端可以通过同样的步骤和密钥验证收到的签名是否与计算出的签名一致,从而确认请求的合法性。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的数据转化为固定长度的摘要...
- 使用发送方的私钥对这个MD5摘要进行加密,得到的加密结果就是签名。 2. **验签过程**: - 接收方收到参数和签名后,同样使用MD5算法计算接收到的参数的摘要。 - 然后使用发送方提供的公钥尝试解密收到的签名,...
这个摘要对输入信息极其敏感,微小的变动都会导致输出摘要的巨大变化,这使得MD5具有不可逆性。 2. **MD5特性**: - **快速性**:MD5计算速度快,适合大量数据的处理。 - **抗碰撞**:理论上两个不同的输入会...
在IT行业中,MD5经常用于验证文件的完整性和一致性,确保文件在传输或存储过程中没有被篡改。 批量文件MD5修改工具,正如其名,是一个可以同时处理多个文件,改变它们MD5值的实用程序。这种工具通常由程序员、系统...
在代码实现方面,MD5算法有多种编程语言的实现,包括Python、Java、C++等。在提供的文件列表中,"代码中国.txt"可能包含了MD5算法的源代码示例,供学习和参考。在实际开发中,开发者可以利用现成的库函数,如Python...
这个过程是单向的,即从原始数据生成MD5摘要很容易,但通过MD5摘要恢复原始数据几乎是不可能的,这使得MD5具有一定的安全性。MD5的输入可以是任意长度,但最终输出的是16字节(128位)的二进制数据,通常用32个十六...
总结来说,Java数字签名在公文传输中的应用是保障电子公文安全的关键技术,结合Java的序列化和安全包,可以构建一个高效、安全的公文传输系统,防止数据被篡改,确保信息传递的完整性和不可否认性。
在软件安全领域,MD5常用于校验文件的完整性和一致性,因为即使微小的文件改动也会导致MD5值的显著变化。然而,由于MD5碰撞攻击的存在,它已不再适用于安全敏感的应用场景。 Base64是一种用于将二进制数据编码为...
MessageDigest md = MessageDigest.getInstance("MD5"); // 使用MD5算法 md.update(str.getBytes()); byte[] digest = md.digest(); StringBuilder hexString = new StringBuilder(); for (byte b : digest) { ...
3. **抗修改性**:对原始数据的微小改变会导致MD5值的巨大变化。 4. **强抗碰撞**:在理想情况下,找到两个具有相同MD5值的不同输入数据非常困难,这使得MD5在数据完整性校验中很有用。 MD5在Android中主要有以下...
- **MD5.java**: 用于处理MD5签名,MD5是一种常见的哈希算法,用于确保数据在传输过程中的完整性和一致性。 - **AlipayCore.java**: 提供了支付宝接口的公共函数,比如签名和验签功能,它是与支付宝服务器交互的...
- **签名机制**:微信支付采用MD5签名方式,确保数据的安全性。签名过程需包含所有请求参数,并且按照特定规则排序。 - **通知回调**:微信支付完成后,会向你设定的回调URL发送异步通知,你需要处理这些通知,...
MD5是一种广泛使用的散列函数,能够将任意长度的数据转化为固定长度的摘要,且在理想情况下,原数据的微小变化都会导致MD5摘要的巨大变化,从而检测出数据的修改。 请求的必须参数包括version(版本号)、appid、...
支付宝同样进行MD5运算并与商家发送的摘要值对比,若一致则证明数据未被篡改。不过,MD5的安全性相比RSA较低,因为它可能存在碰撞攻击的风险。 3. 支付宝即时到账接口集成: 对于Java和PHP开发者,接入支付宝即时...
- **加密类型**:支付宝主要采用**加签名**和**RSA非对称加密**技术来保障交易的安全性。 ##### 2. 支付结果通知 支付完成后,支付宝会将支付结果通知给商户站点。这一步骤分为两种情况: - **同步通知**:支付宝...
**JAVA语言**是由Sun Microsystems公司的詹姆斯·高斯林(James Gosling)等人于1995年5月23日推出的。这一编程语言自诞生以来就因其独特的特性和设计理念而备受关注,并迅速成为业界的主流选择之一。 - **软件定义...
MD5(Message-Digest Algorithm 5)是另一种常见的散列函数,虽然其安全性较SHA1弱,但在某些场景下仍然被用于快速校验文件一致性。 在实际应用中,这些工具可能包含各种编程语言的实现,如Python的`pycryptodome`...
当接收到微信支付的回调时,根据返回的状态码更新订单状态,防止因网络延迟等原因导致的状态不一致。 6. **支付结果查询**:有时,由于网络问题,服务端可能无法接收到微信的回调,这时需要主动发起支付结果查询,...