我怎样才能生成一个MD5哈希?
有没有什么方法可以在Java中生成一个string的MD5散列?
java.security.MessageDigest
是你的朋友。 调用getInstance("MD5")
来获取您可以使用的MD5消息摘要。
MessageDigest
类可以为您提供一个MD5摘要的实例。
当使用string和encryption类时,一定要指定你想要的字节表示的编码。如果你只是使用string.getBytes()
,它将使用平台的默认值。 (并非所有平台都使用相同的默认值)
import java.security.*; .. byte[] bytesOfMessage = yourString.getBytes("UTF-8"); MessageDigest md = MessageDigest.getInstance("MD5"); byte[] thedigest = md.digest(bytesOfMessage);
如果你有很多数据,请看一下可以重复调用的.update(byte[])
方法。 然后调用.digest()
来获得结果散列。
您可能还想看看apache commons编解码器项目的DigestUtils类,它提供了非常方便的方法来创buildMD5或SHA摘要。
如果你真的想把答案作为一个string而不是字节数组,你总是可以这样做:
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; }
find这个:
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; }
在下面的网站上,我不信任它,但它的解决scheme是有效的! 对我来说,很多其他的代码并没有正常工作,我最终在散列中丢失了0。 这个似乎和PHP一样。 来源: http : //m2tec.be/blog/2010/02/03/java-md5-hex-0093
以下是我如何使用它:
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));
其中Hex是: Apache Commons项目中的 org.apache.commons.codec.binary.Hex
。
我只是下载了commons-codec.jar,并得到了像md5一样完美的php。 这是手册 。
只需将其导入到您的项目并使用
String Url = "your_url"; System.out.println( DigestUtils.md5Hex( Url ) );
在那里你有它。
我发现这是最简单明了的方法:
MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(StandardCharsets.UTF_8.encode(string)); return String.format("%032x", new BigInteger(1, md5.digest()));
发现这个解决scheme在从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)); } }
代码是从这里提取的。
另一个select是使用番石榴散列方法 :
Hasher hasher = Hashing.md5().newHasher(); hasher.putString("my string"); byte[] md5 = hasher.hash().asBytes();
如果你已经使用番石榴(如果你不是,你可能应该)。
另一个实现:
import javax.xml.bind.DatatypeConverter; String hash = DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
我有一个类(哈希)来转换纯文本格式:md5或sha1,simillar这个PHP函数( md5 , sha1 ):
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进行testing
PHP脚本:
<?php echo 'MD5 :' . md5('Hello World') . "\n"; echo 'SHA1:' . sha1('Hello World') . "\n";
输出PHP脚本:
MD5 :b10a8db164e0754105b7a99be72e3fe5 SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
使用示例和使用JUnit进行testing:
public class HashTest { @Test public void test() { String txt = "Hello World"; assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt)); assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt)); } }
在GitHub中的代码
我不是很明显的答案:
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; }
Bombe的答案是正确的,但是请注意,除非您绝对必须使用MD5(例如强制您的互操作性),否则更好的select是SHA1,因为MD5有长期使用的弱点。
我应该补充说,SHA1也有理论上的弱点,但并不严重。 哈希algorithm的当前状态是有一些候选replace散列函数,但是还没有出现作为取代SHA1的标准最佳实践。 所以,根据你的需要,你最好build议你的散列algorithm可configuration,以便将来可以被replace。
不需要太复杂。 DigestUtils工作正常,使您在使用md5哈希时感到舒适。
DigestUtils.md5Hex(_hash);
要么
DigestUtils.md5(_hash);
您可以使用任何其他encryption方法,如sha或md。
你可以试试以下。 在这里查看详情和下载代码: http : //www.luyue.org/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(); } }
spring还有一个DigestUtils
类:
这个类包含做这个工作的方法md5DigestAsHex()
。
另一个实现: Java中的快速MD5实现
String hash = MD5.asHex(MD5.getHash(new File(filename)));
我不知道这是否与任何人阅读有关,但我只是有我想要的问题
- 从给定的URL下载一个文件
- 将其MD5与已知值进行比较。
我只想用JRE类来完成(没有Apache Commons或类似的)。 一个快速的networkingsearch没有显示我在同一时间做两个示例代码片段,只有每个任务分开。 因为这需要两次读取同一个文件,所以我认为写一些统一两个任务的代码可能是值得的,在下载文件的同时计算校验和。 这是我的结果(对不起,如果它不是完美的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; // new import 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)); // old new DigestOutputStream(new FileOutputStream(toFile), md5Digest)); // new ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1 MB while (in.read(buffer) != -1) { buffer.flip(); //md5Digest.update(buffer.asReadOnlyBuffer()); // old out.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) ); }
如果你不需要最好的安全性,MD5是完全正确的,如果你正在做一些检查文件完整性的事情,那么安全性就不是一个考虑因素。 在这种情况下,您可能想要考虑一些更简单,更快速的方法,例如Java库也支持的Adler32。
对于它的价值,我偶然发现了这一点,因为我想从一个自然键合成GUIDs来安装COM组件的程序; 我想syhthesize以便不pipe理GUID生命周期。 我将使用MD5,然后使用UUID类来获取一个string。 (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();
看看下面的链接,这个例子得到一个提供的图像的MD5哈希值 :图像的MD5哈希值
这个给出了准确的md5,就像你从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; } }
与PHP不同的是,您可以通过调用md5函数(即md5($text)
来对文本进行md5encryption,而在java中,它变得有点复杂。 我通常通过调用返回md5哈希文本的函数来实现它。 下面是我如何实现它,首先在您的主类中创build一个名为md5encryption
的函数,如下所示。
public static String md5encryption(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 = md5encryption(text);
在这里你可以看到hashtext附加了一个零,使得它匹配PHP中的md5encryption。
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)
尝试这个:
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 ""; } }
这是我来到这里的一个方便的scala函数,它返回MD5哈希string:
def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
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
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!"); } }
我做了这个…似乎工作正常 – 我敢肯定有人会指出错误,但…
public final class MD5 { public enum SaltOption { BEFORE, AFTER, BOTH, NONE; } private static final String ALG = "MD5"; //For conversion to 2-char hex private 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])); } }