【问题标题】:MD5 encryption java / mysql. in Java MD5 generates 31 bytes instead of 32 [duplicate]MD5加密java/mysql。在 Java MD5 中生成 31 个字节而不是 32 个 [重复]
【发布时间】: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


【解决方案1】:

在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; }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 2011-08-09
  • 2010-11-05
  • 2013-01-08
  • 1970-01-01
  • 2018-05-16
  • 2020-11-18
  • 2013-08-19
相关资源
最近更新 更多