MD5加密java / mysql。在Java MD5中生成31个字节而不是32个字节

时间:2014-12-26 14:31:58

标签: java php android mysql md5

我有一个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;
    }

}

有人能帮助我吗? (抱歉我的英语不好)

1 个答案:

答案 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; }