реализация - хеширование java




Как я могу генерировать хеш MD5? (20)

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

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


В отличие от PHP, где вы можете сделать шифрование md5 вашего текста, просто вызвав функцию md5($text) то есть md5($text) , в java это было сделано немного сложнее. Я обычно выполнял его, вызывая функцию, возвращающую хэш-текст md5. Вот как я его реализовал: сначала создайте функцию с именем md5encryption внутри вашего основного класса, как 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);

Здесь вы можете увидеть, что hashtext добавляется с нулем, чтобы он соответствовал шифрованию md5 в PHP.


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

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 .


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

Для чего это стоит, я наткнулся на это, потому что хочу синтезировать GUID из натурального ключа для программы, которая будет устанавливать COM-компоненты; Я хочу, чтобы syhthesize, чтобы не управлять жизненным циклом GUID. Я буду использовать MD5, а затем использовать класс UUID, чтобы получить из него строку. (http://.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 поднимает эту проблему).

В любом случае java.util.UUID может получить вам хорошую строку из байтов MD5.

return UUID.nameUUIDFromBytes(md5Bytes).toString();

Другая реализация:

import javax.xml.bind.DatatypeConverter;

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

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

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

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


Если вы действительно хотите, чтобы ответ возвращался как строка, а не массив байтов, вы всегда можете сделать что-то вроде этого:

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

Мой не очень показательный ответ:

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

Найдено:

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

на сайте ниже, я не беру на себя ответственность за это, но это решение, которое работает! Для меня много другого кода не работало должным образом, я закончил отсутствовать 0s в хеше. Кажется, что это похоже на PHP. источник: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


Не нужно слишком усложнять ситуацию. DigestUtils отлично работает и делает вас удобными при работе с хешами md5.

DigestUtils.md5Hex(_hash);

или же

DigestUtils.md5(_hash);

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


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

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


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

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

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

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

Я просто скачал commons-codec.jar и получил совершенный php, как md5. Вот manual .

Просто импортируйте его в свой проект и используйте

String Url = "your_url";

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

и там у вас это есть.


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

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

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)




hashcode