开发中遇到md5加密不一致问题,排除了上下文编码,加密内容问题。

爬了各类资料,最终找到了原因。

/** 对字符串进行MD5加密 */
private static String encodeByMD5(String originString) {
if (originString != null) {
try {
// 创建具有指定算法名称的信息摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
byte[] results = md.digest(originString.getBytes("UTF-8"));
// 将得到的字节数组变成字符串返回
String resultString = byteArrayToHexString(results);
return resultString.toUpperCase();
} catch (Exception ex) {
ex.printStackTrace();
}
}
return null;
}

需要给加密内容进行指定编码格式获取,对比一下PHP的MD5,真是醉了。

简单的得出结论: PHP不根据上下文编码格式进行字符的加密。相比于JAVA的加密,是根据加密内容的编码格式进行加密的,需要指定当前上下文对应的编码格式才能获取到想要的加密结果。

原因示例:

此类错误通常是编码格式的问题 如果我们控制台输入的字符是 BGK格式的 而 web传入的是UTF-8 我们 toString()查看内容 表明上是看不出区别的 这就导致了相同字符串 加密后得到的结果不同 如下面的小例子

import static org.apache.commons.codec.digest.DigestUtils.md5Hex;
String text = "error606@qq.com|工工工|!@$%&1000";
String r1 = md5Hex(text); // b08f601a7b6b440dfa3ed6eb353c2d24
String r2 = md5Hex(text.getBytes("UTF-8")); // b08f601a7b6b440dfa3ed6eb353c2d24
String r3 = md5Hex(text.getBytes("GBK")); // db9e73be9742ed2a66202a62f491ef03

我们再来看一下Java是如何实现MD5的:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class MD5Digest { private static MessageDigest md5=null; public static String getDigest(String msg) throws UnsupportedEncodingException, NoSuchAlgorithmException {
if(null == md5) {
md5=MessageDigest.getInstance("MD5");
}
byte[] byteArray=null;
byteArray=msg.getBytes();
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();
} public static void main(String []args) throws UnsupportedEncodingException, NoSuchAlgorithmException{
System.out.println(getDigest("test测试"));
}
}

通过上面的代码我们会发现一个问题:

byteArray=msg.getBytes();

在不同的环境下获得的结果可能是不一样的,这样也造成很多MD5结果不一样。

所以要保证在不同环境下MD5结果相同那么必须使用相同的字符编码,比如:byteArray=msg.getBytes("ISO-8859-1");

PS:

http://blog.csdn.net/w627782664/article/details/7064273

Java md5加密 控制台传入与web传入参数 结果不匹配 || 相同字符串加密结果不同,如何保证JAVA MD5加密结果在不同的环境下都相同的更多相关文章

  1. Java实现MD5加密及解密的代码实例分享

    链接:http://www.jb51.net/article/86027.htm Java实现MD5加密及解密的代码实例分享 作者:厦门大学陈黎栋 字体:[增加 减小] 类型:转载 时间:2016-0 ...

  2. java传输json数据用md5加密过程

    1.加密过程:客户端传输数据,包含两部分,一部分原始数据,一部分签名.签名就是对原始数据MD5加密后的字节序列.而原始数据就是普通的string字符串. 2.服务器端呢:将收到的原始数据,进行MD5加 ...

  3. Java实现MD5加密_字符串加密_文件加密

    Java实现MD5加密,具体代码如下: package com.bstek.tools; import java.io.FileInputStream; import java.io.IOExcept ...

  4. Java 语言实现 MD5 加密

    Java 语言实现 MD5 加密 背景说明 在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中. 这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么, ...

  5. MD5加密的Java实现

    在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...

  6. C# MD5加密的方法+一般处理程序使用Session+后台Json序列化

    1.MD5加密 string md5Str = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s ...

  7. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  8. jmeter对接口测试入参进行MD5加密的5种方式

    在使用jmeter做测试的过程中,经常需要对请求的入参进行加密,下面列举几种常用的方法,以登录请求密码需要MD5加密为例. 虽然可以先把参数化的明文密码都先md5加密,而不是在登录前先执行加密,但是实 ...

  9. MD5加密详解

    MD5加密详解 引言: 我在百度百科上查找到了关于MD5的介绍,我从中摘要一些重要信息: Message Digest Algorithm MD5(中文名为信息摘要算法第五版)为计算机安全领域广泛使用 ...

随机推荐

  1. Flutter 1.0 正式版: Google 的便携 UI 工具包

    Flutter 1.0 正式版: Google 的便携 UI 工具包 文 / Tim Sneath,Google Dart & Flutter 产品组产品经理 Flutter 是 Google ...

  2. Java设计模式(15)备忘录模式(Memento模式)

    Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...

  3. r语言 load Rdata 获取表名 并直接转为数据表

    首先指定 load结果为一个对象 然后此对象的值 即为 str的 数据表名 然后使用  eval(parse(text = l)) 两个函数 将字符串 转可执行对象 即可完成重新赋值 > l & ...

  4. 用stringr包处理字符串

    <Machine Learning for Hackers>一书的合著者John Myles White近日接受了一个访谈.在访谈中他提到了自己在R中常用的几个扩展包,其中包括用ggplo ...

  5. 基于CSS3飘带状3D菜单 菜单带小图标

    这次我们要来分享一款很特别的CSS3菜单,菜单的外观是飘带状的,并且每一个菜单项有一个精美的小图标,鼠标滑过菜单项时,菜单项就会向上凸起,像是飘带飘动一样,形成非常酷的3D视觉效果.这款CSS3飘带状 ...

  6. qualcomm lk gpio

    关于高通平台lk中控制gpio的记录 http://blog.csdn.net/loongembedded/article/details/72834761 http://blog.csdn.net/ ...

  7. 使 Finder 显示 文件夹路径

    显示路径: cd ~ defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE killall Finder 不显示路径: ...

  8. 为什么运行PHP就会出现404错误?

    2007-05-09 12:40Googfox | 分类:浏览器 | 浏览8146次 我在IIS中安装了Zend Core 2.0,IIS中用主机头值设置了许多80端口的网站,但是不管在这些网站中的哪 ...

  9. [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

    From: http://m.blog.csdn.net/blog/langkeziju/13511411 我的MySQL版本为5.6.14版本,是二进制包安装的(虽然是二进制包安装的,但是以下问题同 ...

  10. 精美的HTML5/CSS3表单 带小图标

    今天我们要来分享一款非常精美的HTML5/CSS3表单,准备地说,这是一款经过美化的input输入表单,每一个输入表单都可以定义其两侧的小图标,非常华丽.另外,这款表单应用还采用了3种不同的风格主题, ...