【发布时间】:2014-12-26 14:31:58
【问题描述】:
我有一个 php 脚本,用于在我的数据库中插入一个用户名和 md5(密码),其中包含一个 mysql 查询(用于注册功能),以及一个选择用户名和密码的脚本(用于登录功能)。
对于注册,我从我的 android 应用程序发送数据,我发送的密码没有加密。 php脚本使用mysql函数md5("password")进行加密。
为了登录,我发送加密密码(来自应用程序)。
我的问题是java的MD5和mysql的MD5有一个字节的差异。
例如,我在我的数据库中存储了这个 md5 密码(由 mysql'md5 制作):
900150983cd24fb0d6963f7d28e17f72
和java制作这个md5:
90150983cd24fb0d6963f7d28e17f72
另一个例子: mysql--> 0cc175b9c0f1b6a831c399e269772661 java --> cc175b9c0f1b6a831c399e269772661
我可以在 java 中进行所有 md5 加密,或者在 mysql 中进行所有加密,但我想了解这种差异的原因。
这是我在 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;
}
}
有人可以帮助我吗? (对不起我的英语不好)
【问题讨论】:
-
为什么不用 php 中的 md5 而不是在 java 中做并发送到 php
-
避免使用 md5 并研究像河豚这样的东西
-
@IndraKumarS 如果我从手机发送未加密的密码,安全性如何?
标签: java php android mysql md5