Хеширование MD5 и SHA в Java
MD5 — один из серии алгоритмов, разработанных профессором Роналедом Ривестом в Массачусетском технологическом институте (Rivest, 1994). Когда работа показала, что MD4, вероятно, небезопасен, MD5 был разработан для замены MD4. Слабые места MD4 позже были обнаружены Хансом Доббертином.В этом руководстве объясняется, как хэшировать строку, часто пароли из соображений безопасности, используя два метода хеширования MD5 и SHA-256. Хеширование позволяет кодировать только в одном направлении, и в этом его самое большое преимущество, поэтому хеш необратим, в отличие от шифрования, которое использует ключ для шифрования и расшифровки.
Хеш-функции SHA были разработаны Агентством национальной безопасности США (АНБ). Аббревиатура SHA расшифровывается как Secure Hash Algorithm (алгоритм безопасного хеширования). Три алгоритма SHA структурированы по-разному и различаются SHA-0, SHA-1 и SHA-2. Семейство SHA-2 использует идентичный алгоритм с переменным размером дайджеста, который отличается SHA-224, SHA-256, SHA-384 и SHA-512.
Hashing a String with MD5
В данном примере мы хешируем пароль с помощью алгоритма MD5.import java.security.MessageDigest;Output:
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());
}
}
В шестнадцатеричном формате: 25f9e794323b453885f5181f1b624d0b
В шестнадцатеричном формате: 25f9e794323b453885f5181f1b624d0b
Почему мы должны использовать SHA-256 вместо MD5
Безопасность MD5 была серьезно скомпрометирована, Его слабые места были использованы на местах. Использование MD5 для паролей — плохая идея, потому что это небезопасный способ. Вы всегда должны использовать SHA для конфиденциальных данных, таких как пароли пользователей.import java.security.MessageDigest;Output:
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());
}
}
В шестнадцатеричном формате: 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
В шестнадцатеричном формате: 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
References:
https:// en.wikipedia.org/wiki/MD5
https://en.wikipedia.org/wiki/Secure_Hash_Algorithm
Насколько слаб MD5 как функция хеширования паролей?