如何在Java中生成MD5哈希?

是否有任何方法来生成MD5哈希的字符串在Java?

1121993 次浏览

你需要#0

调用#0获取您可以使用的MessageDigest的MD5实例。

通过执行以下操作之一计算哈希:

  • 将整个输入作为byte[]提供,并使用#1在一次操作中计算哈希值。
  • 通过调用#2一次提供MessageDigest一个byte[]块。添加输入字节后,使用#0.

md.digest()返回的byte[]是MD5哈希。

MessageDigest类可以为您提供MD5摘要的实例。

使用字符串和加密类时,请确保总是指定您想要字节表示的编码。如果您只使用string.getBytes(),它将使用平台默认值。(并非所有平台都使用相同的默认值)

import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");byte[] theMD5digest = md.digest(bytesOfMessage);

如果您有很多数据,请查看可以重复调用的.update(xxx)方法。然后调用.digest()以获取结果哈希。

Bombe的答案是正确的,但请注意,除非您绝对必须使用MD5(例如,为了互操作性而强制要求您),否则更好的选择是SHA1,因为MD5在长期使用方面存在弱点。

我应该补充一点,SHA1也有理论上的漏洞,但没有那么严重。目前哈希技术的现状是,有许多候选替代哈希函数,但还没有一个成为替代SHA1的标准最佳实践。因此,根据您的需求,建议您使您的哈希算法可配置,以便将来可以替换它。

您可能还想查看apache公共编解码器项目的DigestUtils类,它提供了非常方便的方法来创建MD5或SHA摘要。

如果你真的想要答案作为字符串而不是字节数组返回,你总是可以这样做:

String plaintext = "your text here";MessageDigest m = MessageDigest.getInstance("MD5");m.reset();m.update(plaintext.getBytes());byte[] digest = m.digest();BigInteger bigInt = new BigInteger(1,digest);String 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;}

如果您不需要最好的安全性,MD5是完全可以的,如果您正在执行诸如检查文件完整性之类的操作,那么安全性就不是考虑因素。在这种情况下,您可能需要考虑更简单更快的东西,例如Adler32,它也受到Java库的支持。

以下是我如何使用它:

final MessageDigest messageDigest = MessageDigest.getInstance("MD5");messageDigest.reset();messageDigest.update(string.getBytes(Charset.forName("UTF8")));final byte[] resultByte = messageDigest.digest();final String result = new String(Hex.encodeHex(resultByte));

其中十六进制是:org.apache.commons.codec.binary.HexApache Commons项目

另一个实现:Java中的快速MD5实现

String hash = MD5.asHex(MD5.getHash(new File(filename)));

找到这个:

public String MD5(String md5) {try {java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");byte[] array = md.digest(md5.getBytes());StringBuffer 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 (java.security.NoSuchAlgorithmException e) {}return null;}

在下面的网站上,我没有信用,但它是一个有效的解决方案!对我来说,许多其他代码无法正常工作,我最终在哈希中丢失了0。这个似乎与PHP相同。来源:http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

我刚刚下载了commons-codec.jar并获得了像md5这样的完美php。这是手册

只需将其导入您的项目并使用

String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );

现在你看到了。

我的答案不是很明确:

private String md5(String s) {try {MessageDigest m = MessageDigest.getInstance("MD5");m.update(s.getBytes(), 0, s.length());BigInteger i = new BigInteger(1,m.digest());return String.format("%1$032x", i);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}

找到了这个解决方案,它在从MD5哈希中获取String表示方面要干净得多。

import java.security.*;import java.math.*;
public class MD5 {public static void main(String args[]) throws Exception{String s="This is a test";MessageDigest m=MessageDigest.getInstance("MD5");m.update(s.getBytes(),0,s.length());System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));}}

代码是从这里中提取的。

我这样做了……似乎工作正常-我相信有人会指出错误,虽然…

public final class MD5 {public enum SaltOption {BEFORE, AFTER, BOTH, NONE;}private static final String ALG = "MD5";//For conversion to 2-char hexprivate static final char[] digits = {'0' , '1' , '2' , '3' , '4' , '5' ,'6' , '7' , '8' , '9' , 'a' , 'b' ,'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,'o' , 'p' , 'q' , 'r' , 's' , 't' ,'u' , 'v' , 'w' , 'x' , 'y' , 'z'};
private SaltOption opt;
/*** Added the SaltOption constructor since everybody* has their own standards when it comes to salting* hashes.** This gives the developer the option...** @param option The salt option to use, BEFORE, AFTER, BOTH or NONE.*/public MD5(final SaltOption option) {//TODO: Add Char Encoding options too... I was too lazy!this.opt = option;}
/**** Returns the salted MD5 checksum of the text passed in as an argument.** If the salt is an empty byte array - no salt is applied.** @param txt The text to run through the MD5 algorithm.* @param salt The salt value in bytes.* @return The salted MD5 checksum as a <code>byte[]</code>* @throws NoSuchAlgorithmException*/private byte[] createChecksum(final String txt, final byte[] salt) throws NoSuchAlgorithmException {final MessageDigest complete = MessageDigest.getInstance(ALG);if(opt.equals(SaltOption.BEFORE) || opt.equals(SaltOption.BOTH)) {complete.update(salt);}complete.update(txt.getBytes());if(opt.equals(SaltOption.AFTER) || opt.equals(SaltOption.BOTH)) {complete.update(salt);}return complete.digest();}
/**** Returns the salted MD5 checksum of the file passed in as an argument.** If the salt is an empty byte array - no salt is applied.** @param fle The file to run through the MD5 algorithm.* @param salt The salt value in bytes.* @return The salted MD5 checksum as a <code>byte[]</code>* @throws IOException* @throws NoSuchAlgorithmException*/private byte[] createChecksum(final File fle, final byte[] salt)throws IOException, NoSuchAlgorithmException {final byte[] buffer = new byte[1024];final MessageDigest complete = MessageDigest.getInstance(ALG);if(opt.equals(SaltOption.BEFORE) || opt.equals(SaltOption.BOTH)) {complete.update(salt);}int numRead;InputStream fis = null;try {fis = new FileInputStream(fle);do {numRead = fis.read(buffer);if (numRead > 0) {complete.update(buffer, 0, numRead);}} while (numRead != -1);} finally {if (fis != null) {fis.close();}}if(opt.equals(SaltOption.AFTER) || opt.equals(SaltOption.BOTH)) {complete.update(salt);}return complete.digest();}
/**** Efficiently converts a byte array to its 2 char per byte hex equivalent.** This was adapted from JDK code in the Integer class, I just didn't like* having to use substrings once I got the result...** @param b The byte array to convert* @return The converted String, 2 chars per byte...*/private String convertToHex(final byte[] b) {int x;int charPos;int radix;int mask;final char[] buf = new char[32];final char[] tmp = new char[3];final StringBuilder md5 = new StringBuilder();for (int i = 0; i < b.length; i++) {x = (b[i] & 0xFF) | 0x100;charPos = 32;radix = 1 << 4;mask = radix - 1;do {buf[--charPos] = digits[x & mask];x >>>= 4;} while (x != 0);System.arraycopy(buf, charPos, tmp, 0, (32 - charPos));md5.append(Arrays.copyOfRange(tmp, 1, 3));}return md5.toString();}
/**** Returns the salted MD5 checksum of the file passed in as an argument.** @param fle The file you want want to run through the MD5 algorithm.* @param salt The salt value in bytes* @return The salted MD5 checksum as a 2 char per byte HEX <code>String</code>* @throws NoSuchAlgorithmException* @throws IOException*/public String getMD5Checksum(final File fle, final byte[] salt)throws NoSuchAlgorithmException, IOException {return convertToHex(createChecksum(fle, salt));}
/**** Returns the MD5 checksum of the file passed in as an argument.** @param fle The file you want want to run through the MD5 algorithm.* @return The MD5 checksum as a 2 char per byte HEX <code>String</code>* @throws NoSuchAlgorithmException* @throws IOException*/public String getMD5Checksum(final File fle)throws NoSuchAlgorithmException, IOException {return convertToHex(createChecksum(fle, new byte[0]));}
/**** Returns the salted MD5 checksum of the text passed in as an argument.** @param txt The text you want want to run through the MD5 algorithm.* @param salt The salt value in bytes.* @return The salted MD5 checksum as a 2 char per byte HEX <code>String</code>* @throws NoSuchAlgorithmException* @throws IOException*/public String getMD5Checksum(final String txt, final byte[] salt)throws NoSuchAlgorithmException {return convertToHex(createChecksum(txt, salt));}
/**** Returns the MD5 checksum of the text passed in as an argument.** @param txt The text you want want to run through the MD5 algorithm.* @return The MD5 checksum as a 2 char per byte HEX <code>String</code>* @throws NoSuchAlgorithmException* @throws IOException*/public String getMD5Checksum(final String txt)throws NoSuchAlgorithmException {
return convertToHex(createChecksum(txt, new byte[0]));}}

我不知道如果这是相关的任何人阅读此但我只是有一个问题我想

  • 从给定URL下载文件
  • 将其MD5与已知值进行比较。

我想只使用JRE类(没有Apache Commons或类似的类)来完成它。快速的网络搜索并没有向我显示同时执行两者的示例代码片段,只有每个任务单独执行。因为这需要两次读取同一个文件,我想写一些代码来统一这两个任务,在下载文件时动态计算校验和可能是值得的。这是我的结果(如果Java不完美,对不起,但我想你还是明白了这个想法):

import java.io.FileOutputStream;import java.io.IOException;import java.math.BigInteger;import java.net.URL;import java.nio.ByteBuffer;import java.nio.channels.Channels;import java.nio.channels.ReadableByteChannel;import java.nio.channels.WritableByteChannel;import java.security.DigestOutputStream;        // newimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;
void downloadFile(String fromURL, String toFile, BigInteger md5)throws IOException, NoSuchAlgorithmException{ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());MessageDigest md5Digest = MessageDigest.getInstance("MD5");WritableByteChannel out = Channels.newChannel(//new FileOutputStream(toFile));  // oldnew DigestOutputStream(new FileOutputStream(toFile), md5Digest));  // newByteBuffer buffer = ByteBuffer.allocate(1024 * 1024);  // 1 MB
while (in.read(buffer) != -1) {buffer.flip();//md5Digest.update(buffer.asReadOnlyBuffer());  // oldout.write(buffer);buffer.clear();}
BigInteger md5Actual = new BigInteger(1, md5Digest.digest());if (! md5Actual.equals(md5))throw new RuntimeException("MD5 mismatch for file " + toFile +": expected " + md5.toString(16) +", got " + md5Actual.toString(16));}

Spring中也有一个DigestUtils类:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

此类包含执行此工作的方法md5DigestAsHex()

为了它的价值,我偶然发现了这个,因为我想从一个将安装COM组件的程序的自然键合成GUID;我想系统化,以免管理GUID生命周期。我将使用MD5,然后使用UUID类从它中获取一个字符串。(http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439提出了这个问题)。

无论如何,java.util.UUID可以从MD5字节中获得一个不错的String。

return UUID.nameUUIDFromBytes(md5Bytes).toString();

没必要弄得太复杂
DigestUtils工作良好,让您在使用md5哈希时感到舒适。

DigestUtils.md5Hex(_hash);

DigestUtils.md5(_hash);

您可以使用任何其他加密方法,例如shamd

另一种选择是使用Guava哈希方法

Hasher hasher = Hashing.md5().newHasher();hasher.putString("my string");byte[] md5 = hasher.hash().asBytes();

方便,如果你已经使用番石榴(如果你不是,你可能应该)。

 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

您可以尝试以下操作。在此处查看详细信息和下载代码:http://jkssweetlife.com/java-hashgenerator-md5-sha-1/

import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;
public class MD5Example {
public static void main(String[] args) throws Exception {
final String inputString = "Hello MD5";
System.out.println("MD5 hex for '" + inputString + "' :");System.out.println(getMD5Hex(inputString));}
public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");md.update(inputString.getBytes());
byte[] digest = md.digest();
return convertByteToHex(digest);}
private static String convertByteToHex(byte[] byteData) {
StringBuilder sb = new StringBuilder();for (int i = 0; i < byteData.length; i++) {sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));}
return sb.toString();}}

另一个实现:

import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));

我有一个Class(Hash)来转换哈希格式的纯文本:md5或sha1,类似于php函数(md5sha1):

public class Hash {/**** @param txt, text in plain format* @param hashType MD5 OR SHA1* @return hash in hashType*/public static String getHash(String txt, String hashType) {try {java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);byte[] array = md.digest(txt.getBytes());StringBuffer 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 (java.security.NoSuchAlgorithmException e) {//error action}return null;}
public static String md5(String txt) {return Hash.getHash(txt, "MD5");}
public static String sha1(String txt) {return Hash.getHash(txt, "SHA1");}}

使用JUnit和PHP进行测试

PHP脚本:

<?php
echo 'MD5 :' . md5('Hello World') . "\n";echo 'SHA1:' . sha1('Hello World') . "\n";

输出PHP脚本:

MD5 :b10a8db164e0754105b7a99be72e3fe5SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

使用示例并使用JUnit进行测试:

    public class HashTest {
@Testpublic void test() {String txt = "Hello World";assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));}
}

GitHub中的代码

https://github.com/fitorec/java-hashes

试试这个:

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

我发现这是最清晰简洁的方法:

MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(StandardCharsets.UTF_8.encode(string));return String.format("%032x", new BigInteger(1, md5.digest()));

这就是我来这里的目的——一个方便的scala函数,它返回MD5哈希字符串:

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

与PHP不同,您可以通过调用md5函数iemd5($text)对文本进行MD5哈希,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 exceptionJOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage());}return hashtext;}

现在只要你需要就调用这个函数,如下所示。

String text = textFieldName.getText();String pass = md5hashing(text);

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

private String hashuj(String dane) throws ServletException{try {MessageDigest m = MessageDigest.getInstance("MD5");byte[] bufor = dane.getBytes();m.update(bufor,0,bufor.length);BigInteger hash = new BigInteger(1,m.dige`enter code here`st());return String.format("%1$032X", hash);
} catch (NoSuchAlgorithmException nsae) {throw new ServletException("Algorytm szyfrowania nie jest obsługiwany!");}}

这个给出了从mysql的md5函数或php的md5函数等中获得的确切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;}
}
import java.security.MessageDigest
val digest = MessageDigest.getInstance("MD5")
//Quick MD5 of textval text = "MD5 this text!"val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString
//MD5 of text with updatesdigest.update("MD5 ".getBytes())digest.update("this ".getBytes())digest.update("text!".getBytes())val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString
//Outputprintln(md5hash1 + " should be the same as " + md5hash2)
import java.security.*;import javax.xml.bind.*;
byte[] bytesOfMessage = yourString.getBytes("UTF-8");MessageDigest md = MessageDigest.getInstance("MD5");byte[] bytesOfDigest = md.digest(bytesOfMessage);String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase();

您可以通过使用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哈希。

我用php做了这个,如下所示

<?php$goodtext = "Not found";// If there is no parameter, this code is all skippedif ( isset($_GET['md5']) ) {$time_pre = microtime(true);$md5 = $_GET['md5'];// This is our alphabet$txt = "0123456789";$show = 15;// Outer loop go go through the alphabet for the// first position in our "possible" pre-hash// textfor($i=0; $i<strlen($txt); $i++ ) {$ch1 = $txt[$i];   // The first of two characters// Our inner loop Note the use of new variables// $j and $ch2for($j=0; $j<strlen($txt); $j++ ) {$ch2 = $txt[$j];  // Our second characterfor($k=0; $k<strlen($txt); $k++ ) {$ch3 = $txt[$k];for($l=0; $l<strlen($txt); $l++){$ch4 = $txt[$l];// Concatenate the two characters together to// form the "possible" pre-hash text$try = $ch1.$ch2.$ch3.$ch4;// Run the hash and then check to see if we match$check = hash('md5', $try);if ( $check == $md5 ) {$goodtext = $try;break;   // Exit the inner loop}// Debug output until $show hits 0if ( $show > 0 ) {print "$check $try\n";$show = $show - 1;}if($goodtext == $try){break;}}if($goodtext == $try){break;}}if($goodtext == $try) {break;}}if($goodtext == $try){break;}}// Compute ellapsed time$time_post = microtime(true);print "Ellapsed time: ";print $time_post-$time_pre;print "\n";}?>

你可以参考这个-来源

您可以尝试使用凯撒

第一种选择:

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();

使用java.security.MessageDigest库的简单函数

public String stringMD5Hash(String text) throws NoSuchAlgorithmException {MessageDigest messageDigest = MessageDigest.getInstance("MD5");byte[] bytes = messageDigest.digest(text.getBytes());StringJoiner stringJoiner = new StringJoiner("");for (byte b : bytes) {stringJoiner.add(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3));}return stringJoiner.toString();}