Есть ли способ генерировать MD5 хэш строки в Java?
Есть ли способ генерировать MD5 хэш строки в Java?
Ответы:
Вам нужно java.security.MessageDigest
.
Позвоните, MessageDigest.getInstance("MD5")
чтобы получить экземпляр MD5, который MessageDigest
вы можете использовать.
Вычислить хеш, выполнив одно из следующих действий:
byte[]
и вычислите хеш за одну операцию с md.digest(bytes)
.MessageDigest
один byte[]
кусок за раз, позвонив md.update(bytes)
. Когда вы закончите добавлять входные байты, вычислите хеш с помощью
md.digest()
.byte[]
Возвращаемый md.digest()
является хэш MD5.
MessageDigest
позволяет вводить данные кусками. Это было бы невозможно с помощью статического метода. Хотя вы можете утверждать, что они должны были добавить один в любом случае для удобства, когда вы можете передать все данные одновременно.
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
, так что редакторы не будут предупреждать вас о том, что вы выполняете конкатенацию строк внутри цикла.
Возможно, вы также захотите взглянуть на класс 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
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 и получил идеальный php как md5. Здесь руководство .
Просто импортируйте его в свой проект и используйте
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()));
Нашел это решение, которое намного чище с точки зрения получения представления 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));
}
}
Код был извлечен отсюда .
String.format("%032x", new BigInteger(1, hash));
Это должно решить эту проблему. 'hash' - это байт [] хэша.
Другой вариант заключается в использовании методов хэширования гуавы :
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 (например, навязанный вам для обеспечения совместимости), лучшим выбором будет SHA1, поскольку MD5 имеет недостатки для долгосрочного использования.
Я должен добавить, что SHA1 также имеет теоретические уязвимости, но не такие серьезные. Современное состояние хэширования состоит в том, что существует ряд возможных хэш-функций для замены, но ни одна из них еще не стала стандартной передовой практикой для замены SHA1. Таким образом, в зависимости от ваших потребностей, вам бы лучше сделать настраиваемый алгоритм хеширования, чтобы в будущем его можно было заменить.
Другая реализация: быстрая реализация MD5 в Java
String hash = MD5.asHex(MD5.getHash(new File(filename)));
Я не знаю, относится ли это к любому, кто читает это, но у меня просто была проблема, которую я хотел
Я хотел сделать это только с классами 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)
);
}
Посмотрите на следующую ссылку, Пример получает хеш-код MD5 предоставленного изображения: Хеш-код MD5 изображения
Что бы это ни стоило, я наткнулся на это, потому что я хочу синтезировать GUID из естественного ключа для программы, которая будет устанавливать компоненты COM; Я хочу изменить размер, чтобы не управлять жизненным циклом 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();
В отличие от 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);
Здесь вы можете видеть, что к хеш-тексту добавляется ноль, чтобы он соответствовал хешированию md5 в PHP.
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;
}
}
попробуй это:
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 представляют собой 128-битный хэш, представленный 32 шестнадцатеричными числами.
В случае, если вы используете базу данных, такую как MySQL, вы можете сделать это и более простым способом. Запрос Select MD5(“text here”)
вернет MD5-хеш текста в скобках.
Вот для чего я пришел сюда - удобная функция scala, которая возвращает строку хеша MD5:
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