在Java中将MD5转换为字符串

7

有人知道如何将MD5转换为字符串吗?我的情况是我已经将密码保存在数据库中的MD5格式中。我正在尝试检索密码并以字符串形式显示,以用于编辑目的。

这是我用于将字符串转换为加密格式的方法:

public static String encrypt(String source) {
   String md5 = null;
   try {
         MessageDigest mdEnc = MessageDigest.getInstance("MD5"); //Encryption algorithm
         mdEnc.update(source.getBytes(), 0, source.length());
         md5 = new BigInteger(1, mdEnc.digest()).toString(16); // Encrypted string
        } 
    catch (Exception ex) {
         return null;
    }
    return md5;
}

我不知道如何将加密格式转换为字符串以编辑密码。

11
MD5是一种单向算法,你不能从加密后的密码中还原出明文密码。 - bugwheels94
哈希算法产生的结果是无法从结果中恢复原始输入的。如果您需要这样的功能,请尝试使用加密而不是哈希(例如RSA)。 - ioreskovic
1
补充给Ankit:而且这种单向特性正是首次将其存储为MD5的全部原因。 - A.H.
那么,我该如何获取明文密码以便管理员进行编辑呢?每当我尝试检索密码时,它都会给出加密值。 - bharathi
管理员从不在任何设计良好的系统上编辑密码,他只是更改密码。 - Bruno Rohée
@AnkitGautam 一个完美的哈希算法正是你所说的。然而,没有任何哈希算法是完美的。请参见md5中的漏洞。 - hd1
4个回答

14
    String password = "123456";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(password.getBytes());

    byte byteData[] = md.digest();

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < byteData.length; i++)
        sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));

    System.out.println("Digest(in hex format):: " + sb.toString());

以上代码将字符串转换为十六进制格式,我的问题是如何恢复为字符串。 - bharathi
5
MD5是单向算法,无法将MD5十六进制字符串还原为原始字符串。 - vchyzhevskyi
在调用getBytes时,添加“UTF-8”作为参数可能会很有用,因为使用拉丁字符时可能会生成错误的哈希值。 - Raimundo
@vchyzhevskyi 这与所要求的相反。 - Steve Staple

5

MD5是单向哈希函数,因此您无法解密它。这就是为什么许多网站都提供“检索密码”选项来创建新密码。

更多关于MD5的信息


0

将字符串转换为MD5的代码

private static String convertToMd5(final String md5) throws UnsupportedEncodingException {
        StringBuffer sb=null;
        try {
            final java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            final byte[] array = md.digest(md5.getBytes("UTF-8"));
            sb = new StringBuffer();
            for (int i = 0; i < array.length; ++i) {
                sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
            }
            return sb.toString();
        } catch (final java.security.NoSuchAlgorithmException e) {
        }
        return sb.toString();
    }

完全相反,不是被要求的东西! - Steve Staple

-3

我认为这是最优雅的方法:

public String getMD5(String data) {
        String result = null;
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
            md.update(data.getBytes(Charset.forName("UTF-8")));
            result = String.format(Locale.ROOT, "%032x", new BigInteger(1, md.digest()));
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException(e);
        }
        return result;
}

`


相反的是被要求的相反! - Steve Staple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接