Хеширование MD5 и SHA в Java

MD5 — один из серии алгоритмов, разработанных профессором Роналедом Ривестом в Массачусетском технологическом институте (Rivest, 1994). Когда работа показала, что MD4, вероятно, небезопасен, MD5 был разработан для замены MD4. Слабые места MD4 позже были обнаружены Хансом Доббертином.
Хеш-функции SHA были разработаны Агентством национальной безопасности США (АНБ). Аббревиатура SHA расшифровывается как Secure Hash Algorithm (алгоритм безопасного хеширования). Три алгоритма SHA структурированы по-разному и различаются SHA-0, SHA-1 и SHA-2. Семейство SHA-2 использует идентичный алгоритм с переменным размером дайджеста, который отличается SHA-224, SHA-256, SHA-384 и SHA-512.
В этом руководстве объясняется, как хэшировать строку, часто пароли из соображений безопасности, используя два метода хеширования MD5 и SHA-256. Хеширование позволяет кодировать только в одном направлении, и в этом его самое большое преимущество, поэтому хеш необратим, в отличие от шифрования, которое использует ключ для шифрования и расшифровки.

Hashing a String with MD5

В данном примере мы хешируем пароль с помощью алгоритма MD5.

import java.security.MessageDigest; 

public class md5_java
{
public static void main(String[] args)throws Exception
{
String password = "123456789";

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());

byte byteData[] = md.digest();

//преобразуем битовый массив в шестнадцатеричный формат - метод 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println("В шестнадцатеричном формате: " + sb.toString());

//преобразуем битовый массив в шестнадцатеричный формат - метод 2
StringBuffer hexString = new StringBuffer();
для (int i=0; Я< byteData.length; i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("В шестнадцатеричном формате: " + hexString.toString());
}
}
Output:

 
В шестнадцатеричном формате: 25f9e794323b453885f5181f1b624d0b
В шестнадцатеричном формате: 25f9e794323b453885f5181f1b624d0b

Почему мы должны использовать SHA-256 вместо MD5

Безопасность MD5 была серьезно скомпрометирована, Его слабые места были использованы на местах. Использование MD5 для паролей — плохая идея, потому что это небезопасный способ. Вы всегда должны использовать SHA для конфиденциальных данных, таких как пароли пользователей.

import java.security.MessageDigest; 

public class sha_java
{
public static void main(String[] args)throws Exception
{
String password = "123456789";

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(password.getBytes());

byte byteData[] = md.digest();

//преобразуем битовый массив в шестнадцатеричный формат - метод 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println("В шестнадцатеричном формате: " + sb.toString());

//преобразуем битовый массив в шестнадцатеричный формат - метод 2
StringBuffer hexString = new StringBuffer();
для (int i=0; Я< byteData.length; i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("В шестнадцатеричном формате: " + hexString.toString());
}
}
Output:

 
В шестнадцатеричном формате: 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
В шестнадцатеричном формате: 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225

References:
https:// en.wikipedia.org/wiki/MD5
https://en.wikipedia.org/wiki/Secure_Hash_Algorithm
Насколько слаб MD5 как функция хеширования паролей?