Вопрос

Есть ли способ генерировать хэш MD5 строки в Java?

Это было полезно?

Решение

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 кодек общего достояния Проект, который предоставляет очень удобные методы для создания дайджестов 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-гекс-0093

Вот как я это использую:

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

и вот оно у вас.

Я нашел, что это самый понятный и лаконичный способ сделать это:

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

Другой вариант - использовать методы хеширования гуавы :

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

Удобно, если вы уже используете Guava (а если нет, то, вероятно, вам следует).

Нашел это решение, которое намного чище с точки зрения получения представления 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")));

У меня есть класс (Hash) для преобразования обычного текста в хэш в форматах: 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 Script:

<?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

Мой не очень откровенный ответ:

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

Не нужно делать это слишком сложно. ДайджестUtils работает нормально и позволяет вам комфортно работать с хешами md5.

DigestUtils.md5Hex(_hash);

или

DigestUtils.md5(_hash);

Либо вы можете использовать любые другие методы шифрования, такие как sha или md.

Ответ Bombe верен, однако учтите, что если вы абсолютно не обязаны использовать MD5 (например, навязано вам для обеспечения совместимости), лучшим выбором будет SHA1, поскольку MD5 имеет недостатки для долгосрочного использования.

Я должен добавить, что SHA1 также имеет теоретические уязвимости, но не такие серьезные. Современное состояние хэширования состоит в том, что существует ряд возможных хэш-функций для замены, но ни одна из них еще не стала стандартной передовой практикой для замены SHA1. Таким образом, в зависимости от ваших потребностей, вам бы лучше настроить настраиваемый алгоритм хеширования, чтобы в будущем его можно было заменить.

В Spring также есть класс DigestUtils :

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

Этот класс содержит метод md5DigestAsHex () , который выполняет эту работу.

Вы можете попробовать следующее. Подробности и коды для загрузки здесь: 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();
}
}

Еще одна реализация: Быстрая реализация 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)
        );
}

Взгляните на следующую ссылку. Пример получает хеш-код 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();

MD5 отлично подходит, если вам не нужна лучшая защита, и если вы делаете что-то вроде проверки целостности файла, тогда безопасность не имеет значения. В таком случае вы можете рассмотреть что-то более простое и быстрое, например Adler32, который также поддерживается библиотеками Java.

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

попробуйте это

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

этот дает точное значение 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;            
    }

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

В отличие от 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.

Это то, что я пришел сюда - удобная функция scala, которая возвращает строку хеша MD5:

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

Ты можешь сгенерировать хеш 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.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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top