我有一个php脚本,在我的数据库中使用mysql查询(用于注册功能)插入用户名和md5(密码),以及一个选择用户名和密码的脚本(用于登录功能)。
对于注册,我从我的Android应用程序发送数据,我发送的密码没有加密。 Php脚本使用mysql函数md5进行加密("密码")。
登录时,我发送加密密码(来自应用程序)。
我的问题是java的MD5和mysql的MD5之间存在一个字节差异。
例如我已经在我的数据库中存储了这个md5密码(由mysql' md5制作):
900150983cd24fb0d6963f7d28e17f72
和java make this md5:
90150983cd24fb0d6963f7d28e17f72
另一个例子: MySQL的 - > 0cc175b9c0f1b6a831c399e269772661 java - > cc175b9c0f1b6a831c399e269772661
我可以在java中创建所有md5加密,或者在mysql中完成所有md5加密,但我想了解这种差异的原因。
这是我在java中的MD5编码器:
/**
* Utility class for MD5 management.
*
* @author Massimo Carli - Jul 12, 2013
*/
public final class MD5Utility {
/*
* The FF value.
*/
private static final int FF_HEX_VALUE = 0xFF;
// Private constructor
private MD5Utility() {
throw new AssertionError("Never instantiate this!");
}
/**
* Calculate MD5 for String src.
*
* @param src The string to check
* @return MD5 for src or null if some error occured
*/
public static String md5(String src) {
try {
// Create MD5 Hash
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(src.getBytes());
byte[] messageDigest = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
hexString.append(Integer.toHexString(FF_HEX_VALUE & messageDigest[i]));
}
String md5 = hexString.toString();
return md5;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* Check a String with its MD5.
*
* @param str The string
* @param md5 The MD5 to check
* @return true if ok, false otherwise
*/
public static boolean checkMD5(String str, String md5) {
String pwdMD5 = md5(str);
// We return the test
boolean success = md5.equals(pwdMD5);
return success;
}
}
有人能帮助我吗? (抱歉我的英语不好)
答案 0 :(得分:0)
在java中尝试此方法。此方法提供与mysql md5相同的哈希。
public static String getMD5Hash(String s) throws NoSuchAlgorithmException {
String result = s;
if (s != null) {
MessageDigest md = MessageDigest.getInstance("MD5"); // or "SHA-1"
md.update(s.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
while (result.length() < 32) { // 40 for SHA-1
result = "0" + result;
}
}
return result; }