我正在尝试创建现有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;
}
答案 0 :(得分:3)
Iraklis应该是对的。 md5()
默认为您提供十六进制编码的输出字符串。您只能通过TRUE
传递可选的$raw_output
参数来获取Java中未编码的字节。
长度范围从29到32
然后你的Java代码有一个bug。 MD5哈希值始终为128位(32位十六进制数字)。这是:
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;
}
答案 1 :(得分:1)
它将MD5哈希值转换为字符最低有效字节的字符串十六进制数。在Java中,所有字符都是2个字节。
实际上,这意味着只有ASCII值。
答案 2 :(得分:1)
<?php
$password = "MyPass";
$hash = md5($password);
?>
更新: 两个版本之间存在一些差异。要解决此问题,请参阅@bobince answer.Here是测试代码:
<强>爪哇强>
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 强>
<?php
echo "Pass1 md5 = ".md5("Test123FORXTREMEpass")."<BR>";
echo "Pass2 md5 = ".md5("Ijdsaoijds")."<BR>";
echo "Pass3 md5 = ".md5("a")."<BR>";
echo "Pass4 md5 = ".md5(" ")."<BR>";
?>
输出:
Pass1 md5 = dc3a7b42a97a35981059036ef22ad2c1
Pass2 md5 = df7ca542bdbf7c4b8776cb21c45e7eef
Pass3 md5 = 0cc175b9c0f1b6a831c399e269772661
Pass4 md5 = 7215ee9c7d9dc229d2921a40e899ec5f
答案 3 :(得分:0)
为了在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:
<?php
echo md5(pass);
?>
希望这有帮助
编辑:如果java变量返回31个字符,则在字符串前面添加一个“0”以匹配返回32个字符的php哈希值。