Как я могу сгенерировать хеш MD5?
Есть ли способ генерировать MD5-хэш строки в Java?
36 ответов
java.security.MessageDigest
твой друг. Вызов getInstance("MD5")
чтобы получить дайджест сообщения MD5, который вы можете использовать.
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()
чтобы получить полученный хэш.
Если вы действительно хотите получить ответ в виде строки, а не байтового массива, вы всегда можете сделать что-то вроде этого:
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;
}
Возможно, вы захотите взглянуть на класс DigestUtils проекта кодеков Apache Commons, который предоставляет очень удобные методы для создания дайджестов MD5 или SHA.
Нашел это:
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
Я обнаружил, что это самый понятный и лаконичный способ сделать это:
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
Вот как я это использую:
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.
Я только что скачал commons-codec.jar и получил идеальный php как md5. Здесь руководство.
Просто импортируйте его в свой проект и используйте
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
и вот оно у тебя.
Не нужно делать это слишком сложным. DigestUtils отлично работает и позволяет вам комфортно работать с хэшами md5.
DigestUtils.md5Hex(_hash);
или же
DigestUtils.md5(_hash);
Либо вы можете использовать любые другие методы шифрования, такие как sha или md.
Нашел это решение, которое намного чище с точки зрения получения представления String из хеша 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));
}
}
Код был извлечен отсюда.
Еще одна реализация:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
Другой вариант - использовать методы хэширования в Гуаве:
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
Удобно, если вы уже используете Guava (а если нет, то, вероятно, вам следует).
У меня есть класс (хэш) для преобразования обычного текста в хэш в форматах: 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
Мой не очень показательный ответ:
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;
}
Вы можете попробовать следующее. Подробности и коды для скачивания смотрите здесь: 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();
}
}
E сть DigestUtils
Весенний урок также:
Этот класс содержит метод md5DigestAsHex()
это делает работу.
Ответ Bombe является правильным, однако учтите, что, если вам абсолютно не нужно использовать MD5 (например, навязанный вам для обеспечения совместимости), лучшим выбором будет SHA1, поскольку MD5 имеет недостатки для долгосрочного использования.
Я должен добавить, что SHA1 также имеет теоретические уязвимости, но не такие серьезные. Современное состояние хэширования состоит в том, что существует несколько возможных хэш-функций для замены, но ни одна из них еще не стала стандартной передовой практикой для замены SHA1. Таким образом, в зависимости от ваших потребностей, вам бы лучше сделать настраиваемый алгоритм хеширования, чтобы в будущем его можно было заменить.
Другая реализация: быстрая реализация MD5 в Java
String hash = MD5.asHex(MD5.getHash(new File(filename)));
Я не знаю, относится ли это к любому, кто читает это, но у меня просто была проблема, которую я хотел
- скачать файл с данного 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)
);
}
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();
В отличие от PHP, где вы можете выполнить шифрование md5 вашего текста, просто вызвав функцию md5, т.е. md5($text)
, в Java это было сделано немного сложнее. Обычно я реализовывал это, вызывая функцию, которая возвращает текст хеша md5. Вот как я это реализовал. Сначала создайте функцию с именем 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);
Здесь вы можете видеть, что к хеш-тексту добавляется ноль, чтобы он соответствовал шифрованию md5 в PHP.
Что бы это ни стоило, я наткнулся на это, потому что я хочу синтезировать GUID из естественного ключа для программы, которая будет устанавливать компоненты COM; Я хочу изменить размер, чтобы не управлять жизненным циклом GUID. Я использую MD5, а затем использую класс UUID, чтобы получить из него строку. (http://stackru.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 поднимает эту проблему).
В любом случае, java.util.UUID может получить хорошую строку из байтов MD5.
return UUID.nameUUIDFromBytes(md5Bytes).toString();
Посмотрите на следующую ссылку, Пример получает хеш-код MD5 предоставленного изображения: Хеш-код MD5 изображения
MD5 отлично подходит, если вам не нужна лучшая защита, и если вы делаете что-то вроде проверки целостности файла, тогда безопасность не имеет значения. В таком случае вы можете рассмотреть что-то более простое и быстрое, например Adler32, который также поддерживается библиотеками Java.
Этот дает точное значение md5, как вы получаете из функции md5 mysql или функций md5 php и т. д. Это то, что я использую (вы можете изменить в соответствии со своими потребностями)
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;
}
}
Вы можете сгенерировать хеш 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 представляют собой 128-битный хэш, представленный 32 шестнадцатеричными числами.
В случае, если вы используете базу данных, такую как MySQL, вы можете сделать это и более простым способом. Запрос Select MD5(“text here”)
вернет MD5 хеш текста в скобках.
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:
def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
Вы можете попробовать использовать Цезаря .
Первый вариант:
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();