我该如何在Java中生成MD5哈希值?

1092

有没有一种方法在Java中生成字符串的MD5哈希值?


2
https://dev59.com/9XVC5IYBdhLWcg3wZwTj - Leif Gruenwoldt
46
MD5 作为一种单向安全特性可能不太安全,但仍适用于通用的校验和应用。 - rustyx
34个回答

8

与 PHP 不同,您只需调用 md5 函数即可对文本进行 MD5 哈希,例如 md5($text)。在 Java 中,它稍微复杂了一些。通常我通过调用一个函数来实现它,该函数返回 md5 哈希文本。

以下是如何实现它的方法:首先,在您的主类中创建一个名为 md5hashing 的函数,如下所示。

public static String md5hashing(String text)
    {   String hashtext = null;
        try 
        {
            String plaintext = text;
            MessageDigest m = MessageDigest.getInstance("MD5");
            m.reset();
            m.update(plaintext.getBytes());
            byte[] digest = m.digest();
            BigInteger bigInt = new BigInteger(1,digest);
            hashtext = bigInt.toString(16);
            // Now we need to zero pad it if you actually want the full 32 chars.
            while(hashtext.length() < 32 ){
              hashtext = "0"+hashtext;   
            }
        } catch (Exception e1) 
        {
            // TODO: handle exception
            JOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage());   
        }
        return hashtext;     
    }

现在只需按照下面的方式调用函数即可。
String text = textFieldName.getText();
String pass = md5hashing(text);

在这里,您可以看到hashtext被添加了一个零以使其与PHP中的MD5哈希匹配。


7
有价值的是,我偶然发现这个问题,因为我想从自然键合成GUID用于安装COM组件的程序; 我要合成它以免管理GUID生命周期。我将使用MD5,然后使用UUID类从中获取字符串。(https://dev59.com/4XI95IYBdhLWcg3wsQP9)。
在任何情况下,java.util.UUID可以从MD5字节中获取漂亮的字符串。
return UUID.nameUUIDFromBytes(md5Bytes).toString();

实际上它不仅接受 MD5 字节数组(大小 == 16)。您可以传递任意长度的字节数组。它将通过 MD5 MessageDigest(参见 nameUUIDFromBytes() 源代码)将其转换为 MD5 字节数组。 - Ilya Serbis

6

如果您不需要最佳安全性,并且正在进行诸如检查文件完整性之类的操作,则MD5非常适合使用。在这种情况下,您可能希望考虑一些更简单和更快的东西,例如Adler32,它也由Java库支持。


2
你为什么认为文件完整性不是一个安全问题? - Jeremy Huiskamp

5

这个函数会返回与MySQL的MD5函数或PHP的MD5函数完全相同的结果。这是我使用的函数(可以根据您的需要进行更改)。

public static String md5( String input ) {
    try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(input.getBytes( "UTF-8" ));
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; i++) {
            sb.append( String.format( "%02x", array[i]));
        }
        return sb.toString();
    } catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) {
        return null;            
    }

}

5
import java.security.MessageDigest

val digest = MessageDigest.getInstance("MD5")

//Quick MD5 of text
val text = "MD5 this text!"
val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString

//MD5 of text with updates
digest.update("MD5 ".getBytes())
digest.update("this ".getBytes())
digest.update("text!".getBytes())
val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString

//Output
println(md5hash1 + " should be the same as " + md5hash2)

1
这是 Kotlin 语言吗? - Isuru
3
@Isuru 看起来像是 Scala。 - gildor

5
您可以利用java.security包中的MessageDigest类中的方法为给定的文本生成MD5哈希。以下是完整的代码片段:

在此处查看

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

public class MD5HashGenerator 
{

   public static void main(String args[]) throws NoSuchAlgorithmException
   {
       String stringToHash = "MyJavaCode"; 
       MessageDigest messageDigest = MessageDigest.getInstance("MD5");
       messageDigest.update(stringToHash.getBytes());
       byte[] digiest = messageDigest.digest();
       String hashedOutput = DatatypeConverter.printHexBinary(digiest);
       System.out.println(hashedOutput);
   }
}

MD5函数的输出是一个由32个十六进制数字表示的128位哈希值。

如果你使用像MySQL这样的数据库,你也可以以更简单的方式实现。查询 Select MD5(“text here”) 将返回括号中文本的MD5哈希值。


4

试一下这个:

public static String getHashMD5(String string) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
        return bi.toString(16);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(MD5Utils.class
                .getName()).log(Level.SEVERE, null, ex);

        return "";
    }
}

2
这可能是最糟糕的解决方案,因为它会去掉前导零。 - Jannick

2
这就是我来到这里的目的 - 一个方便的Scala函数,返回MD5哈希字符串:

这是一个方便的Scala函数,返回MD5哈希字符串:

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}

0
你可以尝试使用凯撒密码
第一个选项:
byte[] hash =
    new Hash(
        new ImmutableMessageDigest(
            MessageDigest.getInstance("MD5")
        ),
        new PlainText("String to hash...")
    ).asArray();

第二个选项:

byte[] hash =
    new ImmutableMessageDigest(
        MessageDigest.getInstance("MD5")
    ).update(
        new PlainText("String to hash...")
    ).digest();

0
 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

/**
* MD5 encryption
*
* @author Hongten
*
*/
public class MD5 {

 public static void main(String[] args) {
     System.out.println(MD5.getMD5("123456"));
 }

 /**
  * Use md5 encoded code value
  *
  * @param sInput
  * clearly
  * @ return md5 encrypted password
  */
 public static String getMD5(String sInput) {

     String algorithm = "";
     if (sInput == null) {
         return "null";
     }
     try {
         algorithm = System.getProperty("MD5.algorithm", "MD5");
     } catch (SecurityException se) {
     }
     MessageDigest md = null;
     try {
         md = MessageDigest.getInstance(algorithm);
     } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
     }
     byte buffer[] = sInput.getBytes();

     for (int count = 0; count < sInput.length(); count++) {
         md.update(buffer, 0, count);
     }
     byte bDigest[] = md.digest();
     BigInteger bi = new BigInteger(bDigest);
     return (bi.toString(16));
 }
}

有一篇关于这个的文章在Codingkit上。请查看:http://codingkit.com/a/JAVA/2013/1020/2216.html


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