将密码加密从java转换为php

我正在尝试创建现有JSP程序的PHP版本,但是我坚持使用密码加密部分。

你能告诉我如何转换这个吗? 我知道它试图获得md5()但在那之后,我没有得到它。 我迷失在Stringbuffer和for()部分。

你能帮我吗?

public static String encryptPassword( String password ) { String encrypted = ""; try { MessageDigest digest = MessageDigest.getInstance( "MD5" ); byte[] passwordBytes = password.getBytes( ); digest.reset( ); digest.update( passwordBytes ); byte[] message = digest.digest( ); StringBuffer hexString = new StringBuffer(); for ( int i=0; i < message.length; i++) { hexString.append( Integer.toHexString( 0xFF & message[ i ] ) ); } encrypted = hexString.toString(); } catch( Exception e ) { } return encrypted; } 

Iraklis应该是对的。 默认情况下, md5()为您提供hex编码的输出字符串。 您只能通过为可选的$raw_output参数传递TRUE来获取Java中未编码的字节。

长度范围从29到32

然后你的Java代码有一个bug。 MD5哈希值始终为128位(32位hex数字)。 这里是:

 hexString.append( Integer.toHexString(0xFF & message[ i ] ) ); 

这将为16以下的所有字节生成1而不是01您存储的是一个损坏的哈希,您无法从中恢复原始MD5值。 如果您绝对必须保留这些损坏的数据,则必须重现PHP中的错误:

 function makeBrokenMD5($s) { $hash= md5($s, TRUE); $bytes= preg_split('//', $hash, -1, PREG_SPLIT_NO_EMPTY); $broken= ''; foreach ($bytes as $byte) $broken.= dechex(ord($byte)); return $broken; } 

它将MD5哈希值转换为字符最小有效字节的字符串hex数。 在Java中,所有字符都是2个字节。

实际上,这意味着只有ASCII值。

  

更新:两个版本之间存在一些差异。 要解决此问题,请参阅@bobince answer.Here是测试代码:

Java的

 package tests; import java.security.MessageDigest; /** * Created by IntelliJ IDEA. * User: Iraklis * Date: 2 Ιουν 2010 * Time: 2:15:03 μμ * To change this template use File | Settings | File Templates. */ public class Md5Test { public static String encryptPassword(String password) { String encrypted = ""; try { MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] passwordBytes = password.getBytes(); digest.reset(); digest.update(passwordBytes); byte[] message = digest.digest(); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < message.length; i++) { hexString.append(Integer.toHexString( 0xFF & message[i])); } encrypted = hexString.toString(); } catch (Exception e) { } return encrypted; } public static void main(String[] args) { System.out.println("Pass1 md5 = " + encryptPassword("Test123FORXTREMEpass")); System.out.println("Pass1 md5 = " + encryptPassword("Ijdsaoijds")); System.out.println("Pass1 md5 = " + encryptPassword("a")); System.out.println("Pass1 md5 = " + encryptPassword(" ")); } } Output: Pass1 md5 = dc3a7b42a97a3598105936ef22ad2c1 Pass1 md5 = df7ca542bdbf7c4b8776cb21c45e7eef Pass1 md5 = cc175b9c0f1b6a831c399e269772661 Pass1 md5 = 7215ee9c7d9dc229d2921a40e899ec5f 

PHP

 "; echo "Pass2 md5 = ".md5("Ijdsaoijds")."
"; echo "Pass3 md5 = ".md5("a")."
"; echo "Pass4 md5 = ".md5(" ")."
"; ?>

输出:

 Pass1 md5 = dc3a7b42a97a35981059036ef22ad2c1 Pass2 md5 = df7ca542bdbf7c4b8776cb21c45e7eef Pass3 md5 = 0cc175b9c0f1b6a831c399e269772661 Pass4 md5 = 7215ee9c7d9dc229d2921a40e899ec5f 

为了在java和php中获得相同的结果,我使用了这个。

Java(确保在“try”块中调用该方法):

 public static String getHash(String pass) throws Exception { MessageDigest md=MessageDigest.getInstance("MD5"); md.update(pass.getBytes(),0,pass.length()); return new BigInteger(1,md.digest()).toString(16); } 

PHP:

  

希望这可以帮助

编辑:如果java变量返回31个字符,则在字符串前面添加一个“0”以匹配返回32个字符的php哈希。