`

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&lt;String, Object&gt; map = new HashMap&lt;&gt;();
map.put("abc", 234);
map.put("dfe", "daw");
map.put("bbd", System.currentTimeMillis());//2598128947B95E1DF910AB7F41DAB779  36D6EFC1DF9E4F864862000A0230806F
generateSign(map, key);*/

Map&lt;String, String&gt; map = new HashMap&lt;&gt;();
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&lt;String, String&gt; generateSign(Map&lt;String, String&gt; params, String key) {
        String param = paramFilter(params);
        Map&lt;String, String&gt; signMap = new HashMap&lt;&gt;(2);
        String sign = DigestUtils.md5Hex((param + "&amp;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&lt;String, String&gt; params) {
        if (null == params || params.isEmpty()) {
            return null;
        }
        List&lt;String&gt; paramList = new ArrayList&lt;&gt;();
        params.entrySet().forEach(param -&gt; {
            if (StringUtils.isNotEmpty(param.getValue().toString()) &amp;&amp; !"sign".equalsIgnoreCase(param.getKey()) &amp;&amp; !"sign_type".equalsIgnoreCase(param.getKey())) {
                paramList.add(param.getKey() + "=" + param.getValue());
            }
        });
        Collections.sort(paramList);
        return paramList.stream().collect(Collectors.joining("&amp;"));
    }
}</pre>
<p> 上面的md5加密直接使用的commons-codec</p>
<p>&lt;dependencies&gt;</p>
<p>  &lt;dependency&gt;</p>
<p>        &lt;groupId&gt;commons-codec&lt;/groupId&gt;</p>
<p>        &lt;artifactId&gt;commons-codec&lt;/artifactId&gt;</p>
<p>        &lt;version&gt;1.10&lt;/version&gt;</p>
<p>      &lt;/dependency&gt;</p>
<p>      &lt;dependency&gt;</p>
<p>          &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;</p>
<p>          &lt;artifactId&gt;commons-lang3&lt;/artifactId&gt;</p>
<p>          &lt;version&gt;3.4&lt;/version&gt;</p>
<p>      &lt;/dependency&gt;</p>
<p>  &lt;/dependencies&gt;</p>
<p> </p>
<p>上面main函数中我注释了一部分,大家改一下类型后会发现结果不一致。</p>
<p> </p>
<p>欢迎加入qq学习交流群513650703 一起交流学习</p>
<p> </p>
<p> </p>
<p> </p>
</div>
分享到:
评论

相关推荐

    使用RSA、MD5对参数生成签名及接收方验签

    如果这个新的摘要与解密后的签名一致,那么可以确认参数在传输过程中没有被修改,从而信任这些参数。 在这个过程中,RSA提供非对称加密的保障,使得只有持有私钥的发送方能生成有效的签名,而任何人都可以使用公钥...

    淘宝开发文档签名_md5加密java+c#

    这样,服务器端可以通过同样的步骤和密钥验证收到的签名是否与计算出的签名一致,从而确认请求的合法性。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的数据转化为固定长度的摘要...

    使用RSA、MD5对参数生成签名与验签

    - 使用发送方的私钥对这个MD5摘要进行加密,得到的加密结果就是签名。 2. **验签过程**: - 接收方收到参数和签名后,同样使用MD5算法计算接收到的参数的摘要。 - 然后使用发送方提供的公钥尝试解密收到的签名,...

    MD5加密算法(JSP)

    这个摘要对输入信息极其敏感,微小的变动都会导致输出摘要的巨大变化,这使得MD5具有不可逆性。 2. **MD5特性**: - **快速性**:MD5计算速度快,适合大量数据的处理。 - **抗碰撞**:理论上两个不同的输入会...

    批量文件MD5修改工具.zip

    在IT行业中,MD5经常用于验证文件的完整性和一致性,确保文件在传输或存储过程中没有被篡改。 批量文件MD5修改工具,正如其名,是一个可以同时处理多个文件,改变它们MD5值的实用程序。这种工具通常由程序员、系统...

    MD5 Hash 算法

    在代码实现方面,MD5算法有多种编程语言的实现,包括Python、Java、C++等。在提供的文件列表中,"代码中国.txt"可能包含了MD5算法的源代码示例,供学习和参考。在实际开发中,开发者可以利用现成的库函数,如Python...

    加密简码MD5

    这个过程是单向的,即从原始数据生成MD5摘要很容易,但通过MD5摘要恢复原始数据几乎是不可能的,这使得MD5具有一定的安全性。MD5的输入可以是任意长度,但最终输出的是16字节(128位)的二进制数据,通常用32个十六...

    Java数字签名在公文传输中的应用.pdf

    总结来说,Java数字签名在公文传输中的应用是保障电子公文安全的关键技术,结合Java的序列化和安全包,可以构建一个高效、安全的公文传输系统,防止数据被篡改,确保信息传递的完整性和不可否认性。

    从apk中提取classes.dex并返回base64MD5原始编码___下载.zip

    在软件安全领域,MD5常用于校验文件的完整性和一致性,因为即使微小的文件改动也会导致MD5值的显著变化。然而,由于MD5碰撞攻击的存在,它已不再适用于安全敏感的应用场景。 Base64是一种用于将二进制数据编码为...

    Java安全通信

    MessageDigest md = MessageDigest.getInstance("MD5"); // 使用MD5算法 md.update(str.getBytes()); byte[] digest = md.digest(); StringBuilder hexString = new StringBuilder(); for (byte b : digest) { ...

    深入理解Android MD5数据加密

    3. **抗修改性**:对原始数据的微小改变会导致MD5值的巨大变化。 4. **强抗碰撞**:在理想情况下,找到两个具有相同MD5值的不同输入数据非常困难,这使得MD5在数据完整性校验中很有用。 MD5在Android中主要有以下...

    java支付宝支付文档(含代码).pdf

    - **MD5.java**: 用于处理MD5签名,MD5是一种常见的哈希算法,用于确保数据在传输过程中的完整性和一致性。 - **AlipayCore.java**: 提供了支付宝接口的公共函数,比如签名和验签功能,它是与支付宝服务器交互的...

    java接入微信APP支付/支付宝APP支付

    - **签名机制**:微信支付采用MD5签名方式,确保数据的安全性。签名过程需包含所有请求参数,并且按照特定规则排序。 - **通知回调**:微信支付完成后,会向你设定的回调URL发送异步通知,你需要处理这些通知,...

    jd-admin.rar

    MD5是一种广泛使用的散列函数,能够将任意长度的数据转化为固定长度的摘要,且在理想情况下,原数据的微小变化都会导致MD5摘要的巨大变化,从而检测出数据的修改。 请求的必须参数包括version(版本号)、appid、...

    支付宝支付宝即时到账接口

    支付宝同样进行MD5运算并与商家发送的摘要值对比,若一致则证明数据未被篡改。不过,MD5的安全性相比RSA较低,因为它可能存在碰撞攻击的风险。 3. 支付宝即时到账接口集成: 对于Java和PHP开发者,接入支付宝即时...

    Java支付宝支付开发流程与原理.docx

    - **加密类型**:支付宝主要采用**加签名**和**RSA非对称加密**技术来保障交易的安全性。 ##### 2. 支付结果通知 支付完成后,支付宝会将支付结果通知给商户站点。这一步骤分为两种情况: - **同步通知**:支付宝...

    JAVA语言学习笔记之01

    **JAVA语言**是由Sun Microsystems公司的詹姆斯·高斯林(James Gosling)等人于1995年5月23日推出的。这一编程语言自诞生以来就因其独特的特性和设计理念而备受关注,并迅速成为业界的主流选择之一。 - **软件定义...

    各种加密签名工具合集

    MD5(Message-Digest Algorithm 5)是另一种常见的散列函数,虽然其安全性较SHA1弱,但在某些场景下仍然被用于快速校验文件一致性。 在实际应用中,这些工具可能包含各种编程语言的实现,如Python的`pycryptodome`...

    微信支付java服务端实现-weixinpay.zip

    当接收到微信支付的回调时,根据返回的状态码更新订单状态,防止因网络延迟等原因导致的状态不一致。 6. **支付结果查询**:有时,由于网络问题,服务端可能无法接收到微信的回调,这时需要主动发起支付结果查询,...

Global site tag (gtag.js) - Google Analytics