代码之家  ›  专栏  ›  技术社区  ›  Akshay

如何生成MD5哈希?

  •  931
  • Akshay  · 技术社区  · 17 年前

    Java中是否有生成字符串MD5哈希的方法?

    33 回复  |  直到 4 年前
        1
  •  710
  •   rogerdpack    4 年前

    这个 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() 以获得结果哈希。

        2
  •  631
  •   MultiplyByZer0 Joke_Sense10    6 年前

    你需要 java.security.MessageDigest .

    呼叫 MessageDigest.getInstance("MD5") 获取MD5实例 MessageDigest 你可以使用。

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

    这个 byte[] 返回由 md.medish() 是MD5哈希。

        3
  •  274
  •   CSchulz cL83    12 年前

    如果你真的希望答案以字符串而不是字节数组的形式返回,你总是可以这样做:

    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;
    }
    
        4
  •  259
  •   lutzh    12 年前

    您可能还想看看 DigestUtils apache类 commons codec 该项目提供了非常方便的方法来创建MD5或SHA摘要。

        5
  •  170
  •   dac2009    14 年前

    找到这个:

    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

        6
  •  93
  •   bluish dmajkic    14 年前

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

    MessageDigest md5 = MessageDigest.getInstance("MD5");
    md5.update(StandardCharsets.UTF_8.encode(string));
    return String.format("%032x", new BigInteger(1, md5.digest()));
    
        7
  •  84
  •   Eugene    12 年前

    以下是我如何使用它:

    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是: org.apache.commons.codec.binary.Hex Apache Commons project .

        8
  •  84
  •   rednoah    10 年前

    我刚刚下载 commons-codec.jar 并得到了像md5一样完美的php。这里是 manual .

    只需将其导入到您的项目中即可使用

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

    就在那里。

        9
  •  35
  •   Anders R. Bystrup    13 年前

    无需使其过于复杂。
    DigestUtils 工作正常,让你在工作时感到舒适 md5 哈希。

    DigestUtils.md5Hex(_hash);
    

    DigestUtils.md5(_hash);
    

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

        10
  •  35
  •   stacker    12 年前

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

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

    代码提取自 here .

        11
  •  32
  •   andrewrjones    13 年前

    另一种实现方式:

    import javax.xml.bind.DatatypeConverter;
    
    String hash = DatatypeConverter.printHexBinary( 
               MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
    
        12
  •  31
  •   Arsen Khachaturyan    6 年前

    另一种选择是使用 Guava Hashing methods :

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

    如果你已经在使用番石榴,这很方便(如果你还没有,你可能应该使用)。

        13
  •  29
  •   fitorec    11 年前

    我有一个类(哈希)可以将纯文本转换为哈希格式:md5或sha1,类似于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进行测试

    PHP脚本:

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

    输出PHP脚本:

    MD5 :b10a8db164e0754105b7a99be72e3fe5
    SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
    

    使用JUnit进行示例和测试:

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

    GitHub中的代码

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

        14
  •  22
  •   marioosh    14 年前

    我的答案不太明确:

    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;
    }
    
        15
  •  18
  •   ylu    7 年前

    有一个 DigestUtils 类在 Spring 也:

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

    此类包含方法 md5DigestAsHex() 这就完成了任务。

        16
  •  17
  •   Austin Henley    13 年前

    你可以试着跟随。在此处查看详细信息和下载代码: 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();
    }
    }
    
        17
  •  15
  •   frankodwyer    17 年前

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

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

        18
  •  13
  •   Lukasz R.    15 年前

    另一种实现方式: Fast MD5 Implementation in Java

    String hash = MD5.asHex(MD5.getHash(new File(filename)));
    
        19
  •  11
  •   kriegaex    10 年前

    我不知道这是否与任何阅读本文的人有关,但我只是遇到了我想解决的问题

    • 从给定的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;        // 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)
            );
    }
    
        20
  •  8
  •   Giancarlo Romeo    8 年前
    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();
    
        21
  •  8
  •   Geordy James    7 年前

    与PHP不同,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哈希相匹配。

        22
  •  6
  •   Mihai Danila    13 年前

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

    无论如何,java.util。UUID可以从MD5字节中获得一个漂亮的字符串。

    return UUID.nameUUIDFromBytes(md5Bytes).toString();
    
        23
  •  5
  •   mike mike    17 年前

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

        24
  •  5
  •   Aurangzeb    10 年前

    这个给出了从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;            
        }
    
    }
    
        25
  •  5
  •   HimalayanCoder    9 年前
    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)
    
        26
  •  4
  •   Marcelo Lopes    11 年前

    你可以 generate MD5 hash 对于给定的文本,通过使用 MessageDigest 类在 java.security 包裹。下面是完整的代码片段,

    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哈希值。

        27
  •  4
  •   Ali Ha Quang    7 年前

    试试这个:

    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 "";
        }
    }
    
        28
  •  2
  •   Priyank Desai    10 年前

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

    def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
    
        29
  •  0
  •   dcaswell    12 年前
     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

        30
  •  0
  •   Janez Kuhar    5 年前

    您可以尝试使用 Caesar .

    第一种选择:

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