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
答案 0 :(得分:25)
尝试在base 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();
}
答案 1 :(得分:6)
替换
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 );
答案 2 :(得分:4)
通过使用Apache Commons Codec库中的实用程序类(http://commons.apache.org/codec)
,可以将其缩短为单行程序String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");
答案 3 :(得分:3)
这两者是平等的。 Java one似乎是十进制的。将其转换为十六进制。
答案 4 :(得分:2)
考虑将十进制字节转换为十六进制。例如,94基10是5e基16。
答案 5 :(得分:2)
那是因为基数不同。 MySQL MD5结果在base-16中,而Java MD5在base-10中。
我希望我能进一步帮助你,但我的数学很糟糕。我的一个朋友帮助我从PHP中的base-16校验和生成了一个10的校验和,但是我丢失了脚本。希望你能在此基础上找到答案。
答案 6 :(得分:1)
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)
答案 7 :(得分:1)
看看我是怎么做的,代码可以自我解释!
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( '明文')
5ab677ec767735cebd67407005786016
答案 8 :(得分:0)
尝试使用Hex.encodeHex(byte [])
为您处理十六进制编码的Apache commons编解码器(http://commons.apache.org/codec/),而不是重新发明轮子。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;
}
}
答案 9 :(得分:0)
使用Apache Commons Codec库中的实用程序类:http://commons.apache.org/codec/
String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);