MySQL MD5 和 Java MD5 不相等

发布于 2024-07-26 01:46:23 字数 891 浏览 9 评论 0原文

MySQL 中的下一个函数

MD5( 'secret' ) 生成 5ebe2294ecd0e0f08eab7690d2a6ee69

我希望有一个 Java 函数来生成相同的输出。 但

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 ];
        sb.append( ( int )( 0x00FF & b ) );
        if( i+1 <bytes.length ) {
            sb.append( "-" );
        }
    }
    return sb.toString();
}

产生

94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105

The next function in MySQL

MD5( 'secret' ) generates 5ebe2294ecd0e0f08eab7690d2a6ee69

I would like to have a Java function to generate the same output. But

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 ];
        sb.append( ( int )( 0x00FF & b ) );
        if( i+1 <bytes.length ) {
            sb.append( "-" );
        }
    }
    return sb.toString();
}

generates

94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

在梵高的星空下 2024-08-02 01:46:23

尝试以 16 为基数进行编码。只是为了让您开始... 16 基数中的 94 是 5E。

**编辑:**尝试更改您的 getString 方法:

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();
}

Try encoding in base 16. Just to get you started... 94 in base 16 is 5E.

**Edit:**Try changing your getString method:

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();
}
欲拥i 2024-08-02 01:46:23

替换

sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
    sb.append( "-" );
}

String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length == 1) sb.append("0");
sb.append( hex );

replace

sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
    sb.append( "-" );
}

by

String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length == 1) sb.append("0");
sb.append( hex );

通过使用 Apache Commons Codec 库 (http://commons. apache.org/codec)

String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");

This can be shortened to a one-liner by using the utility classes from the Apache Commons Codec library (http://commons.apache.org/codec)

String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");
若言繁花未落 2024-08-02 01:46:23

这两者是平等的。 Java 似乎是十进制的。 将其转换为十六进制。

Those two are equal. The Java one appears to be in decimal. Convert it to hexadecimal.

饮湿 2024-08-02 01:46:23

那是因为基础不一样。 MySQL MD5 结果以 16 为基数,而 Java MD5 以 10 为基数。

我希望我能进一步帮助你,但我的数学很糟糕。 我的一个朋友帮助我在 PHP 中根据 16 进制校验和生成了 10 进制校验和,但我丢失了脚本。 希望您能在此基础上找到您的答案。

That's because the base is different. The MySQL MD5 result is in base-16, while the Java MD5 is in base-10.

I wish I could help you further, but my math stinks. A friend of mine helped me generate a base-10 checksum from a base-16 checksum in PHP, but I've lost the script. Hope you can find your answer based on this.

好倦 2024-08-02 01:46:23

考虑将十进制字节转换为十六进制。 例如 94 基数 10 是 5e 基数 16。

Consider converting your decimal bytes to hexadecimal. For example 94 base 10 is 5e base 16.

时光沙漏 2024-08-02 01:46:23
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)
月下伊人醉 2024-08-02 01:46:23

与其重新发明轮子,不如尝试 Apache commons 编解码器 (http://commons.apache.org/codec/) 它将使用 Hex.encodeHex(byte[]) 为您处理十六进制编码

private String encodeAsMD5(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(password.getBytes());
        return new String(Hex.encodeHex(bytes));
    } 
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }
}

Rather than reinventing the wheel, try Apache commons codec (http://commons.apache.org/codec/) which will handle the hex encoding for you with Hex.encodeHex(byte[])

private String encodeAsMD5(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(password.getBytes());
        return new String(Hex.encodeHex(bytes));
    } 
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }
}
习ぎ惯性依靠 2024-08-02 01:46:23

使用 Apache Commons Codec 库中的实用程序类:http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);

Use the utility classes from the Apache Commons Codec library: http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);
染火枫林 2024-08-02 01:46:23

看看我是怎么做的,代码是可以自我解释的!

Java代码:

public static void main(String a[]) throws NoSuchAlgorithmException {
    String passClear = "cleartext";
    MessageDigest md5 = MessageDigest.getInstance("MD5"); // you can change it to SHA1 if needed!
    md5.update(passClear.getBytes(), 0, passClear.length());
    System.out.printf("MD5: %s: %s ", passClear, new BigInteger(1, md5.digest()).toString(16));
}

输出:

MD5:明文:5ab677ec767735cebd67407005786016

产生相同散列的Mysql查询:

SELECT md5( 'cleartext' ); 

输出:

md5('cleartext')
5ab677ec767735cebd67407005786016

Look how I do it, the code is self explainable!

Java code:

public static void main(String a[]) throws NoSuchAlgorithmException {
    String passClear = "cleartext";
    MessageDigest md5 = MessageDigest.getInstance("MD5"); // you can change it to SHA1 if needed!
    md5.update(passClear.getBytes(), 0, passClear.length());
    System.out.printf("MD5: %s: %s ", passClear, new BigInteger(1, md5.digest()).toString(16));
}

Output:

MD5: cleartext: 5ab677ec767735cebd67407005786016

Mysql query that produces the same hash:

SELECT md5( 'cleartext' ); 

Output:

md5('cleartext')
5ab677ec767735cebd67407005786016

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文