MD5哈希值不同。

6

我不知道如何将这几行php代码转换成java代码..

$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/>
$result = md5($varInHex);
echo $result;

好的,我尝试转换了一下,但是得到了不同的结果!

byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...};
String str = seq20.toString();
String result = md5(str);
System.out.println(result);

public static String md5(String source) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(source.getBytes("UTF-8"));
        return getString(bytes);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

private static String getString(byte[] bytes) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
        byte b = bytes[i];
        String hex = Integer.toHexString((int) 0x00FF & b);
        if (hex.length() == 1) {
            sb.append("0");
        }
        sb.append(hex);
    }
    return sb.toString();
}

Java 中的 result 与 PHP 中的 result 不同。

你能帮助我吗?谢谢!

4个回答

5

您不能直接使用seq20而不将其转换为字符串吗?我会这样做:

md.update( seq20 ); 
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
while ( output.length() < 32 ) {
    output = "0"+output;
}

2
看看@adves的答案。这是一个很好的教训:如果可以避免,不要自己解决常见问题,因为你肯定会出错。 - amalloy
@amalloy 感谢您的提示,我已经修复了。 - stacker

5

另外两个答案都不是错的,但从优雅的角度考虑,可以考虑以下做法:

String MD5(String... strings) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
        for(final String s : strings) {
            md.update(s.getBytes());
        }
    } catch (NoSuchAlgorithmException ex) {
        throw new RuntimeException("MD5 Cryptography Not Supported");
    }
    final BigInteger bigInt = new BigInteger(1, md.digest());
    return String.format("%032x", bigInt);
}

编辑:使用String...可变参数是完全可选的,但它使函数更容易,因为它避免了调用函数中字符串连接的开销。


3
我刚刚实施了这个解决方案,我要说我非常喜欢它。 - Jason Sperske

3
被认可的解决方案如下:
md.update( seq20 ); 
byte[] md5sum = md.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
if ( output.length() == 31 ) {
    output = "0"+output;
}

该实现会失败1/256次,因为md5sum的输出可能有多个前导零。一个可以引起此错误的示例md5输入是:"15446:68106"(不带引号)。

如果您需要与php实现匹配的md5,请使用apache commons DigestUtils.md5Hex


0

我猜测 PHP 将上述内容作为字符串进行评估,而不是十六进制。而 Java 则按照您的期望进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接