0

0

Java 与 PHP 的MD5加密为什么不一样?

php中文网

php中文网

发布时间:2016-06-20 12:33:55

|

3665人浏览过

|

来源于php中文网

原创

php代码:

echo md5(chr(142));

java代码:
import java.math.biginteger;import java.security.messagedigest;import java.security.nosuchalgorithmexception;public class utils {	public static void main(string[] args) {				char ss=(char)142;//这里换成56后md5后和php版的 md5后的结果一样		system.out.println(md5(ss+""));			}		public static string md5(string plaintext) {		byte[] secretbytes = null;		try {			secretbytes = messagedigest.getinstance("md5").digest(					plaintext.getbytes());		} catch (nosuchalgorithmexception e) {			throw new runtimeexception("没有md5这个算法!");		}		string md5code = new biginteger(1, secretbytes).tostring(16);		for (int i = 0; i < 32 - md5code.length(); i++) {			md5code = "0" + md5code;		}		return md5code;	}}


经过测试 获取142的char类型的md5后数值不一样,获取56 的char 后md5的值 一样,这是怎么回事,如何解决(都是utf-8编码)

快剪辑
快剪辑

国内⼀体化视频⽣产平台

下载


回复讨论(解决方案)

plainText.getBytes( "GBK");

plainText.getBytes( "GBK");


这个方法不行,试过了

不知道为什么要
        for (int i = 0; i             md5code = "0" + md5code;
        }
而且终值还始终在变

  public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{    String s  = null;    char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};    MessageDigest md = MessageDigest.getInstance("MD5");    md.update(buffer);    byte[] datas = md.digest(); //16个字节的长整数    char[] str = new char[2*16];    int k = 0;    for(int i=0;i<16;i++){      byte b   = datas[i];      str[k++] = hexDigist[b>>>4 & 0xf];//高4位      str[k++] = hexDigist[b & 0xf];//低4位    }    s = new String(str);    return s;  }


java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了
这里测试下:
java:
 public static void main(String[] args) {    try {      System.out.println(getMd5("123".getBytes()));    } catch (NoSuchAlgorithmException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }

输出: 
202cb962ac59075b964b07152d234b70
PHP代码:
echo md5("123");

输出:
202cb962ac59075b964b07152d234b70

  public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{    String s  = null;    char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};    MessageDigest md = MessageDigest.getInstance("MD5");    md.update(buffer);    byte[] datas = md.digest(); //16个字节的长整数    char[] str = new char[2*16];    int k = 0;    for(int i=0;i<16;i++){      byte b   = datas[i];      str[k++] = hexDigist[b>>>4 & 0xf];//高4位      str[k++] = hexDigist[b & 0xf];//低4位    }    s = new String(str);    return s;  }


java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了
这里测试下:
java:
 public static void main(String[] args) {    try {      System.out.println(getMd5("123".getBytes()));    } catch (NoSuchAlgorithmException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }

输出: 
202cb962ac59075b964b07152d234b70
PHP代码:
echo md5("123");

输出:
202cb962ac59075b964b07152d234b70




还是不行,我把php和java代码全部贴出来吧,php结果是正确的,java代码如何改呢

结果:".$pt."
".$vc."
密码:".$passwd."

";function jspassword($p,$pt,$vc,$md5 = true){ echo $p.":".$pt.":".$vc; if($md5) { $p = strtoupper(md5($p)); } //echo "
".$p;exit; $len = strlen($p); $temp = null; //echo "
md5Password:".$p."
"; for ($i=0; $i < $len ; $i = $i + 2) { //echo "
i:".$i; $temp .= '\x'.substr($p, $i,2); } //echo "
".$temp."
"; //echo "


--->>>".md5(hex2asc($temp).hex2asc($pt)); //$str=hex2asc($temp).hex2asc($pt); //echo "
内部:".$str."-->".md5(hex2asc($temp))."-->".md5(hex2asc($pt)); return strtoupper(md5(strtoupper(md5(hex2asc($temp).hex2asc($pt))).$vc));}/** * 十六进制转字符 * * @access private * @param string $str * @return string */function hex2asc($str){ //echo "处理前:".$str."
"; //print_r( explode('\x', $str)); $str = join('', explode('\x', $str)); //echo "
处理后:".$str; $len = strlen($str); $data = null; for ($i=0;$i<$len;$i+=2) { //echo "
::".substr($str,$i,2); echo "
".hexdec(substr($str,$i,2)).":::".chr(hexdec(substr($str,$i,2)))."->".md5(chr(hexdec(substr($str,$i,2)))); $data.=chr(hexdec(substr($str,$i,2))); } echo "
".md5($data)."
"; return $data;}?>



import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {	public static void main(String[] args) {				utils u=new utils();				String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);		System.out.println("-----------------------------");		System.out.println(up);	}				public String jspassword(String password,String pt,String vc,boolean md5){				if(md5)		{			password = utils.md5(password).toUpperCase();		}		int len =password.length();		String temp="";				for (int i=0; i < len ; i = i + 2)		{									temp += "\\x"+password.substring(i, i+2);		}						return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();			}		public static String hex2asc(String str){		String [] s=str.trim().split("\\\\x");		//System.out.println(s.length);		StringBuffer sb=new StringBuffer();		for(String sItem:s){			//System.out.println(sItem);			sb.append(sItem);		}		int len = sb.toString().length();				//String data = null;		StringBuffer sb1=new StringBuffer();				for (int i=0;i"+utils.md5(String.valueOf(ss)));						sb1.append(String.valueOf(ss));		}				return sb1.toString();	}		public static String md5(String plainText) {						byte[] secretBytes = null;		try {			secretBytes = MessageDigest.getInstance("md5").digest(					plainText.getBytes());		} catch (NoSuchAlgorithmException e) {			throw new RuntimeException("没有md5这个算法!");		}		String md5code = new BigInteger(1, secretBytes).toString(16);		for (int i = 0; i < 32 - md5code.length(); i++) {			md5code = "0" + md5code;		}		return md5code;	}			}

不知道为什么要
        for (int i = 0; i             md5code = "0" + md5code;
        }
而且终值还始终在变




  public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{    String s  = null;    char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};    MessageDigest md = MessageDigest.getInstance("MD5");    md.update(buffer);    byte[] datas = md.digest(); //16个字节的长整数    char[] str = new char[2*16];    int k = 0;    for(int i=0;i<16;i++){      byte b   = datas[i];      str[k++] = hexDigist[b>>>4 & 0xf];//高4位      str[k++] = hexDigist[b & 0xf];//低4位    }    s = new String(str);    return s;  }


java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了
这里测试下:
java:
 public static void main(String[] args) {    try {      System.out.println(getMd5("123".getBytes()));    } catch (NoSuchAlgorithmException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }

输出: 
202cb962ac59075b964b07152d234b70
PHP代码:
echo md5("123");

输出:
202cb962ac59075b964b07152d234b70




我把php和java代码全部贴出来吧

结果:".$pt."
".$vc."
密码:".$passwd."

";function jspassword($p,$pt,$vc,$md5 = true){ echo $p.":".$pt.":".$vc; if($md5) { $p = strtoupper(md5($p)); } //echo "
".$p;exit; $len = strlen($p); $temp = null; //echo "
md5Password:".$p."
"; for ($i=0; $i < $len ; $i = $i + 2) { //echo "
i:".$i; $temp .= '\x'.substr($p, $i,2); } //echo "
".$temp."
"; //echo "


--->>>".md5(hex2asc($temp).hex2asc($pt)); //$str=hex2asc($temp).hex2asc($pt); //echo "
内部:".$str."-->".md5(hex2asc($temp))."-->".md5(hex2asc($pt)); return strtoupper(md5(strtoupper(md5(hex2asc($temp).hex2asc($pt))).$vc));}/** * 十六进制转字符 * * @access private * @param string $str * @return string */function hex2asc($str){ //echo "处理前:".$str."
"; //print_r( explode('\x', $str)); $str = join('', explode('\x', $str)); //echo "
处理后:".$str; $len = strlen($str); $data = null; for ($i=0;$i<$len;$i+=2) { //echo "
::".substr($str,$i,2); echo "
".hexdec(substr($str,$i,2)).":::".chr(hexdec(substr($str,$i,2)))."->".md5(chr(hexdec(substr($str,$i,2)))); $data.=chr(hexdec(substr($str,$i,2))); } echo "
".md5($data)."
"; return $data;}?>



import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {	public static void main(String[] args) {				utils u=new utils();				String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);		System.out.println("-----------------------------");		System.out.println(up);	}				public String jspassword(String password,String pt,String vc,boolean md5){				if(md5)		{			password = utils.md5(password).toUpperCase();		}		int len =password.length();		String temp="";				for (int i=0; i < len ; i = i + 2)		{									temp += "\\x"+password.substring(i, i+2);		}						return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();			}		public static String hex2asc(String str){		String [] s=str.trim().split("\\\\x");		//System.out.println(s.length);		StringBuffer sb=new StringBuffer();		for(String sItem:s){			//System.out.println(sItem);			sb.append(sItem);		}		int len = sb.toString().length();				//String data = null;		StringBuffer sb1=new StringBuffer();				for (int i=0;i"+utils.md5(String.valueOf(ss)));						sb1.append(String.valueOf(ss));		}				return sb1.toString();	}		public static String md5(String plainText) {						byte[] secretBytes = null;		try {			secretBytes = MessageDigest.getInstance("md5").digest(					plainText.getBytes());		} catch (NoSuchAlgorithmException e) {			throw new RuntimeException("没有md5这个算法!");		}		String md5code = new BigInteger(1, secretBytes).toString(16);		for (int i = 0; i < 32 - md5code.length(); i++) {			md5code = "0" + md5code;		}		return md5code;	}			}

function jspassword($p,$pt,$vc,$md5 = true)
{
echo $p.":".$pt.":".$vc;
if($md5)
{
$p = strtoupper(md5($p));
}
//echo "
".$p;exit;
$len = strlen($p);
$temp = null;
//echo "
md5Password:".$p."
";
for ($i=0; $i  {
//echo "
i:".$i;
$temp .= '\x'.substr($p, $i,2);
}
//echo "
".$temp."
";
//echo "


--->>>".md5(hex2asc($temp).hex2asc($pt));
//$str=hex2asc($temp).hex2asc($pt);
//echo "
内部:".$str."-->".md5(hex2asc($temp))."-->".md5(hex2asc($pt));
return strtoupper(md5(strtoupper(md5(hex2asc($temp).hex2asc($pt))).$vc));
}

/**
 * 十六进制转字符
 * 
 * @access private
 * @param string $str
 * @return string
 */
function hex2asc($str)
{
//echo "处理前:".$str."
";
//print_r( explode('\x', $str));
$str = join('', explode('\x', $str));
//echo "
处理后:".$str;
$len = strlen($str);
$data = null;
for ($i=0;$i {
//echo "
::".substr($str,$i,2);
echo "
".hexdec(substr($str,$i,2)).":::".chr(hexdec(substr($str,$i,2)))."->".md5(chr(hexdec(substr($str,$i,2))));
$data.=chr(hexdec(substr($str,$i,2)));
}
echo "
".md5($data)."
";
return $data;
}
?>


[/code]


import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {	public static void main(String[] args) {				utils u=new utils();				String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);		System.out.println("-----------------------------");		System.out.println(up);	}				public String jspassword(String password,String pt,String vc,boolean md5){				if(md5)		{			password = utils.md5(password).toUpperCase();		}		int len =password.length();		String temp="";				for (int i=0; i < len ; i = i + 2)		{									temp += "\\x"+password.substring(i, i+2);		}						return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();			}		public static String hex2asc(String str){		String [] s=str.trim().split("\\\\x");		//System.out.println(s.length);		StringBuffer sb=new StringBuffer();		for(String sItem:s){			//System.out.println(sItem);			sb.append(sItem);		}		int len = sb.toString().length();				//String data = null;		StringBuffer sb1=new StringBuffer();				for (int i=0;i"+utils.md5(String.valueOf(ss)));						sb1.append(String.valueOf(ss));		}				return sb1.toString();	}		public static String md5(String plainText) {						byte[] secretBytes = null;		try {			secretBytes = MessageDigest.getInstance("md5").digest(					plainText.getBytes());		} catch (NoSuchAlgorithmException e) {			throw new RuntimeException("没有md5这个算法!");		}		String md5code = new BigInteger(1, secretBytes).toString(16);		for (int i = 0; i < 32 - md5code.length(); i++) {			md5code = "0" + md5code;		}		return md5code;	}			}



不知道为什么要
        for (int i = 0; i             md5code = "0" + md5code;
        }
而且终值还始终在变




  public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{    String s  = null;    char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};    MessageDigest md = MessageDigest.getInstance("MD5");    md.update(buffer);    byte[] datas = md.digest(); //16个字节的长整数    char[] str = new char[2*16];    int k = 0;    for(int i=0;i<16;i++){      byte b   = datas[i];      str[k++] = hexDigist[b>>>4 & 0xf];//高4位      str[k++] = hexDigist[b & 0xf];//低4位    }    s = new String(str);    return s;  }


java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了
这里测试下:
java:
 public static void main(String[] args) {    try {      System.out.println(getMd5("123".getBytes()));    } catch (NoSuchAlgorithmException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }

输出: 
202cb962ac59075b964b07152d234b70
PHP代码:
echo md5("123");

输出:
202cb962ac59075b964b07152d234b70




我把php和java代码全部贴出来吧

结果:".$pt."
".$vc."
密码:".$passwd."

";function jspassword($p,$pt,$vc,$md5 = true){ echo $p.":".$pt.":".$vc; if($md5) { $p = strtoupper(md5($p)); } //echo "
".$p;exit; $len = strlen($p); $temp = null; //echo "
md5Password:".$p."
"; for ($i=0; $i < $len ; $i = $i + 2) { //echo "
i:".$i; $temp .= '\x'.substr($p, $i,2); } //echo "
".$temp."
"; //echo "


--->>>".md5(hex2asc($temp).hex2asc($pt)); //$str=hex2asc($temp).hex2asc($pt); //echo "
内部:".$str."-->".md5(hex2asc($temp))."-->".md5(hex2asc($pt)); return strtoupper(md5(strtoupper(md5(hex2asc($temp).hex2asc($pt))).$vc));}/** * 十六进制转字符 * * @access private * @param string $str * @return string */function hex2asc($str){ //echo "处理前:".$str."
"; //print_r( explode('\x', $str)); $str = join('', explode('\x', $str)); //echo "
处理后:".$str; $len = strlen($str); $data = null; for ($i=0;$i<$len;$i+=2) { //echo "
::".substr($str,$i,2); echo "
".hexdec(substr($str,$i,2)).":::".chr(hexdec(substr($str,$i,2)))."->".md5(chr(hexdec(substr($str,$i,2)))); $data.=chr(hexdec(substr($str,$i,2))); } echo "
".md5($data)."
"; return $data;}?>



import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {	public static void main(String[] args) {				utils u=new utils();				String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);		System.out.println("-----------------------------");		System.out.println(up);	}				public String jspassword(String password,String pt,String vc,boolean md5){				if(md5)		{			password = utils.md5(password).toUpperCase();		}		int len =password.length();		String temp="";				for (int i=0; i < len ; i = i + 2)		{									temp += "\\x"+password.substring(i, i+2);		}						return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();			}		public static String hex2asc(String str){		String [] s=str.trim().split("\\\\x");		//System.out.println(s.length);		StringBuffer sb=new StringBuffer();		for(String sItem:s){			//System.out.println(sItem);			sb.append(sItem);		}		int len = sb.toString().length();				//String data = null;		StringBuffer sb1=new StringBuffer();				for (int i=0;i"+utils.md5(String.valueOf(ss)));						sb1.append(String.valueOf(ss));		}				return sb1.toString();	}		public static String md5(String plainText) {						byte[] secretBytes = null;		try {			secretBytes = MessageDigest.getInstance("md5").digest(					plainText.getBytes());		} catch (NoSuchAlgorithmException e) {			throw new RuntimeException("没有md5这个算法!");		}		String md5code = new BigInteger(1, secretBytes).toString(16);		for (int i = 0; i < 32 - md5code.length(); i++) {			md5code = "0" + md5code;		}		return md5code;	}			}


java在测试的时候传入的byte数组哦,要调用string.getBytes()方法 ,这个我测试是可以通过的  我也是这两天才开始学习java的 如果是编码的问题我就不知道怎么解决了

编码不对 换下试试

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

17

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

289

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

150

2026.02.06

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

11

2026.02.06

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

7

2026.02.06

JavaScript 异步编程与事件驱动架构
JavaScript 异步编程与事件驱动架构

本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

11

2026.02.06

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

47

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号