Java 与 PHP 的MD5加密为什么不一样?
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 < 32 - md5code.length(); 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代码如何改呢
<?php//php为正确的 结果:CA15B8C6D72A4442942045956DD371F8$password="123456";$pt='\x00\x00\x00\x00\x16\x9d\x56\x75';$vc='!PRY';$passwd = jspassword($password,$pt, $vc);echo "<br>结果:".$pt."<br>".$vc."<br>密码:".$passwd."<br><br>";function jspassword($p,$pt,$vc,$md5 = true){ echo $p.":".$pt.":".$vc; if($md5) { $p = strtoupper(md5($p)); } //echo "<br>".$p;exit; $len = strlen($p); $temp = null; //echo "<br>md5Password:".$p."<br>"; for ($i=0; $i < $len ; $i = $i + 2) { //echo "<br>i:".$i; $temp .= '\x'.substr($p, $i,2); } //echo "<br>".$temp."<br>"; //echo "<br><br><br>--->>>".md5(hex2asc($temp).hex2asc($pt)); //$str=hex2asc($temp).hex2asc($pt); //echo "<br>内部:".$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."<br>"; //print_r( explode('\x', $str)); $str = join('', explode('\x', $str)); //echo "<br>处理后:".$str; $len = strlen($str); $data = null; for ($i=0;$i<$len;$i+=2) { //echo "<br>::".substr($str,$i,2); echo "<br>".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 "<br>".md5($data)."<br>"; 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<len;i+=2) { int x=Integer.parseInt(sb.toString().substring(i, i+2),16); char ss=(char) x; System.out.println(x+"::"+ss+"转换后->"+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 < 32 - md5code.length(); 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代码全部贴出来吧
<?php//php为正确的 结果:CA15B8C6D72A4442942045956DD371F8$password="123456";$pt='\x00\x00\x00\x00\x16\x9d\x56\x75';$vc='!PRY';$passwd = jspassword($password,$pt, $vc);echo "<br>结果:".$pt."<br>".$vc."<br>密码:".$passwd."<br><br>";function jspassword($p,$pt,$vc,$md5 = true){ echo $p.":".$pt.":".$vc; if($md5) { $p = strtoupper(md5($p)); } //echo "<br>".$p;exit; $len = strlen($p); $temp = null; //echo "<br>md5Password:".$p."<br>"; for ($i=0; $i < $len ; $i = $i + 2) { //echo "<br>i:".$i; $temp .= '\x'.substr($p, $i,2); } //echo "<br>".$temp."<br>"; //echo "<br><br><br>--->>>".md5(hex2asc($temp).hex2asc($pt)); //$str=hex2asc($temp).hex2asc($pt); //echo "<br>内部:".$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."<br>"; //print_r( explode('\x', $str)); $str = join('', explode('\x', $str)); //echo "<br>处理后:".$str; $len = strlen($str); $data = null; for ($i=0;$i<$len;$i+=2) { //echo "<br>::".substr($str,$i,2); echo "<br>".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 "<br>".md5($data)."<br>"; 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<len;i+=2) { int x=Integer.parseInt(sb.toString().substring(i, i+2),16); char ss=(char) x; System.out.println(x+"::"+ss+"转换后->"+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 < $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;
}
?>
[/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<len;i+=2) { int x=Integer.parseInt(sb.toString().substring(i, i+2),16); char ss=(char) x; System.out.println(x+"::"+ss+"转换后->"+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 < 32 - md5code.length(); 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代码全部贴出来吧
<?php//php为正确的 结果:CA15B8C6D72A4442942045956DD371F8$password="123456";$pt='\x00\x00\x00\x00\x16\x9d\x56\x75';$vc='!PRY';$passwd = jspassword($password,$pt, $vc);echo "<br>结果:".$pt."<br>".$vc."<br>密码:".$passwd."<br><br>";function jspassword($p,$pt,$vc,$md5 = true){ echo $p.":".$pt.":".$vc; if($md5) { $p = strtoupper(md5($p)); } //echo "<br>".$p;exit; $len = strlen($p); $temp = null; //echo "<br>md5Password:".$p."<br>"; for ($i=0; $i < $len ; $i = $i + 2) { //echo "<br>i:".$i; $temp .= '\x'.substr($p, $i,2); } //echo "<br>".$temp."<br>"; //echo "<br><br><br>--->>>".md5(hex2asc($temp).hex2asc($pt)); //$str=hex2asc($temp).hex2asc($pt); //echo "<br>内部:".$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."<br>"; //print_r( explode('\x', $str)); $str = join('', explode('\x', $str)); //echo "<br>处理后:".$str; $len = strlen($str); $data = null; for ($i=0;$i<$len;$i+=2) { //echo "<br>::".substr($str,$i,2); echo "<br>".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 "<br>".md5($data)."<br>"; 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<len;i+=2) { int x=Integer.parseInt(sb.toString().substring(i, i+2),16); char ss=(char) x; System.out.println(x+"::"+ss+"转换后->"+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的 如果是编码的问题我就不知道怎么解决了
编码不对 换下试试

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
