web-dev-qa-db-ja.com

どうやってMD5ハッシュを生成できますか?

Javaで文字列のMD5ハッシュを生成する方法はありますか?

949
Akshay

Java.security.MessageDigest はあなたの友達です。使用できるMD5メッセージダイジェストを取得するには、 getInstance("MD5") を呼び出します。

564
Bombe

MessageDigestクラスはMD5ダイジェストのインスタンスを提供します。

文字列と暗号クラスを扱うときは、必ず always バイト表現を希望するエンコーディングを指定してください。単にstring.getBytes()を使う場合はプラットフォームのデフォルトが使われます。 (すべてのプラットフォームが同じデフォルトを使用するわけではありません)

import Java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

大量のデータがある場合は、繰り返し呼び出すことができる.update(byte[])メソッドを見てください。それから.digest()を呼び出して結果のハッシュを取得します。

663
koregan

また、Apache commonsコーデック プロジェクトの DigestUtils クラスを調べてみてください。これは、MD5またはSHAダイジェストを作成するための非常に便利な方法を提供します。

252
lutzh

バイト配列ではなく文字列として答えを実際に返したい場合は、常に次のようにすることができます。

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;
}
251
user49913

これが見つかりました:

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と同じようです。 source: http://m2tec.be/blog/2010/02/03/Java-md5-hex-0093

153
dac2009

使い方は次のとおりです。

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

ここで、16進数は Apache Commonsプロジェクトのorg.Apache.commons.codec.binary.Hex です。

84
adranale

commons-codec.jar をダウンロードして、md5のような完璧なPHPを入手しました。これは manual です。

プロジェクトにインポートして使用するだけです。

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

そしてあなたはそれを持っています。

82
Eugene

これを行うための最も明確で簡潔な方法がこれであることがわかりました。

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

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 から抽出されました。

32
Heshan Perera

もう1つの選択肢は、 Guava Hashingメソッド を使用することです。

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

すでにGuavaを使用している場合は便利です(そうでない場合はおそらくそうするべきです)。

31
andrewrjones

もう一つの実装:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
30
stacker

プレーンテキストをハッシュに変換するクラス(ハッシュ)があります。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 :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

28
fitorec

あまり明らかにされていない答え:

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;
}
22
marioosh

あまりにも複雑にする必要はありません。 DigestUtils md5ハッシュで作業しながら、正常に動作し、快適に動作するように.

DigestUtils.md5Hex(_hash);

または

DigestUtils.md5(_hash);

どちらも、shaやmdなどの他の暗号化方式を使用できます。

19
Fatih Karatana

Bombeの答えは正しいですが、絶対にMD5を使用しなければならないのでない限り(相互運用性のために強制された場合など)、MD5は長期使用に対して弱点があるのでSHA1がより良い選択です。

SHA1にも理論上の脆弱性がありますが、それほど深刻ではありません。ハッシングにおける現在の最先端技術は、いくつかの置換ハッシュ関数候補があることですが、SHA1を置き換えるための標準的なベストプラクティスとしてはまだ登場していないものがあります。それで、あなたのニーズに応じて、あなたはあなたがあなたのハッシュアルゴリズムを将来それが置き換えられることができるように構成可能にすることをお勧めします。

16
frankodwyer

Spring にもDigestUtilsクラスがあります。

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

このクラスには、その仕事をするメソッドmd5DigestAsHex()が含まれています。 

15
Raul Luna

あなたは以下を試すことができます。ここで詳細とダウンロードコードを見てください: 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();
}
}
14
ylu

もう一つの実装: Javaでの高速MD5実装

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

これがこれを読んでいる人に関係があるかどうか私は知りませんが、私はただ私がしたいという問題を抱えていました

  • 与えられたURLからファイルをダウンロードする そして
  • そのMD5を既知の値と比較します。

私はJREクラスだけでそれをやりたかったのです(Apache Commonsやそれに類似したものではありません)。クイックWeb検索で、 both を同時に実行するサンプルコードスニペットが表示されず、各タスクのみが別々に表示されました。これには同じファイルを2回読み込む必要があるため、両方のタスクを統合して、ファイルのダウンロード中にチェックサムを計算するコードを書くのは価値があるかもしれません。これは私の結果です(それが完璧な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)
        );
}
9
kriegaex

次のリンクを見てください。例では、提供された画像のMD5ハッシュが取得されます。 画像のMD5ハッシュ

6
Thomas

それが価値があるもののために、私はCOMコンポーネントをインストールするプログラムのための自然なキーからGUIDを合成したいので、私はこれをつまずきました。 GUIDライフサイクルを管理しないように合成したいです。私はMD5を使い、それからUUIDクラスを使って文字列を取り出します。 (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439この問題が発生します)。

いずれにせよ、Java.util.UUIDはMD5バイトからNice Stringを取得できます。

return UUID.nameUUIDFromBytes(md5Bytes).toString();
6
Mihai Danila

あなたが最高のセキュリティを必要としないならMD5は完全に素晴らしいです、そしてあなたがファイルの整合性をチェックするような何かをしているならセキュリティは考慮事項ではありません。そのような場合は、JavaライブラリでもサポートされているAdler32のように、もっとシンプルで速いものを検討したいと思うかもしれません。

5
Mike
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();
4
Giancarlo Romeo

これを試して:

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 "";
    }
}
4
Marcelo Lopes
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)
3
HimalayanCoder

これは、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;            
    }

}
3
Aurangzeb

単にmd5関数、つまりmd5($text)を呼び出すことによってテキストのMD5ハッシュを行うことができるPHPとは異なり、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);

ここでは、ハッシュテキストにPHPのmd5ハッシュと一致させるためにゼロが追加されていることがわかります。

3
Geordy James

これは私がここに来たものです - MD5ハッシュの文字列を返す便利なスカラ関数です。 

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

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個の16進数で表される128ビットのハッシュです。

場合によっては、MySQLのようなデータベースを使っているなら、もっと簡単な方法でこれを行うことができます。クエリSelect MD5(“text here”)は括弧内のテキストのMD5ハッシュを返します。 

0
Prasanna L M
 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));
 }
}

それについてはCodi​​ngkitに関する記事があります。チェックアウト: http://codingkit.com/a/Java/2013/1020/2216.html

0
shouyu