Javaで文字列のMD5ハッシュを生成する方法はありますか?
Javaで文字列のMD5ハッシュを生成する方法はありますか?
回答:
あなたが必要java.security.MessageDigest
です。
を呼び出しMessageDigest.getInstance("MD5")
て、MessageDigest
使用できるMD5インスタンスを取得します。
次のいずれかを実行してハッシュを計算します。
byte[]
、を使用して1つの操作でハッシュを計算しmd.digest(bytes)
ます。MessageDigest
1つのbyte[]
チャンクにフィードしmd.update(bytes)
ます。入力バイトの追加が完了したら、を使用してハッシュを計算し
md.digest()
ます。byte[]
返されたmd.digest()
MD5ハッシュです。
MessageDigest
使用すると、データをチャンクで入力できます。これは静的メソッドでは不可能です。一度にすべてのデータを渡すことができる場合は、便宜上、いずれにせよ1つ追加する必要があると主張できます。
MessageDigest
クラスは、MD5ダイジェストのインスタンスを提供することができます。
文字列と暗号クラスを操作するときは、必ずバイト表現を入れたいエンコーディングを必ず指定してください。単に使用string.getBytes()
する場合は、プラットフォームのデフォルトを使用します。(すべてのプラットフォームが同じデフォルトを使用するわけではありません)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);
大量のデータがある場合は、.update(byte[])
繰り返し呼び出すことができるメソッドを見てください。次にを呼び出し.digest()
て、結果のハッシュを取得します。
yourString.getBytes(StandardCharsets.UTF_8)
。これにより、UnsupportedEncodingException
。
実際にバイト配列ではなく文字列として返答が必要な場合は、常に次のようにすることができます。
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;
}
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
ではwhile
、の代わりにを使用できるため、エディターはループ内で文字列連結を行っているという警告を表示しません。
MD5またはSHAダイジェストを作成するための非常に便利なメソッドを提供する、Apache CommonsコーデックプロジェクトのDigestUtilsクラスを確認することもできます。
これが見つかりました:
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
getBytes()
ない場合、コードはプラットフォームやユーザー設定によって異なる結果になります。
byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
これが私がそれを使う方法です:
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プロジェクトからです。
String result = Hex.encodeHexString(resultByte);
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()));
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));
}
}
String.format("%032x", new BigInteger(1, hash));
ためです。これで解決するはずです 。「ハッシュ」はハッシュのバイト[]です。
別のオプションはGuava Hashingメソッドを使用することです:
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
Guavaを既に使用している場合は便利です(使用していない場合は、おそらく使用する必要があります)。
Hashing.md5().hashString("my string").asBytes();
別の実装:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
プレーンテキストを次の形式でハッシュに変換するクラス(ハッシュ)があります: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");
}
}
<?php
echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";
MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
public class HashTest {
@Test
public void test() {
String txt = "Hello World";
assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
}
}
複雑にする必要はありません。
DigestUtilsは正常に動作し、md5
ハッシュを操作するときに快適になります。
DigestUtils.md5Hex(_hash);
または
DigestUtils.md5(_hash);
sha
またはなどの他の暗号化方法を使用することもできますmd
。
私のあまりはっきりしない答え:
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;
}
String.format("%1$032X", big)
大文字の形式持っている
以下を試すことができます。詳細とダウンロードコードはこちら: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();
}
}
Bombeの答えは正しいですが、MD5を絶対に使用する必要がない限り(相互運用性のために強制されるなど)、MD5には長期間使用するための弱点があるため、SHA1を選択することをお勧めします。
SHA1にも理論上の脆弱性があるが、それほど深刻ではないことを付け加えておきます。ハッシュの現在の最先端では、置換ハッシュ関数の候補がいくつかありますが、SHA1を置き換えるための標準的なベストプラクティスとしてはまだ浮上していません。したがって、必要に応じて、ハッシュアルゴリズムを構成可能にして、将来的に置き換えられるようにすることをお勧めします。
別の実装:Javaでの高速MD5実装
String hash = MD5.asHex(MD5.getHash(new File(filename)));
これがこれを読んでいる人に関係があるかどうかはわかりませんが、私がしたかった問題がありました
私はJREクラスのみでそれをしたかったのです(Apache Commonsなどではありません)。クイックWeb検索では、両方を同時に実行するサンプルコードスニペットは表示されず、各タスクのみが個別に表示されました。これには同じファイルを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)
);
}
次のリンクをご覧ください。例では、提供された画像のMD5ハッシュを取得しています。MD5 Hash of a Image
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();
MessageDigest
(nameUUIDFromBytes()ソースコードを参照)
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();
md5関数を呼び出すだけでテキストのMD5ハッシュを実行できるPHPとは異なり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);
ここでは、PHPのmd5ハッシュと一致させるために、ハッシュテキストにゼロが追加されていることがわかります。
最高のセキュリティが必要ない場合、MD5は完全に問題なく、ファイルの整合性のチェックなどを行っている場合、セキュリティは考慮されません。このような場合、JavaライブラリーでもサポートされているAdler32など、より単純で高速なものを検討する必要があります。
これは、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;
}
}
これを試して:
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 "";
}
}
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)
パッケージ内のクラスのメソッドを使用することにより、特定のテキストのMD5ハッシュを生成できます。以下は完全なコードスニペットです。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個の16進数で表される128ビットのハッシュです。
MySQLのようなデータベースを使用している場合は、これをより簡単な方法で行うこともできます。クエリSelect MD5(“text here”)
は、括弧内のテキストのMD5ハッシュを返します。
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