Hachage MD5 et SHA en Java

MD5 est une des séries d'algorithmes développés par le professeur Ronaled Rivest à l'université MIT (Rivest, 1994). Lorsque des travaux ont indiqué que MD4 était probablement peu sûr, MD5 a été conçu pour remplacer MD4. Les faiblesses de MD4 ont été retrouvées plus tard par Hans Dobbertin.
Les fonctions de hachage SHA on été conçues par l'agence de sécurité nationale américaine (NSA). SHA signifie algorithme de hachage sécurisé. Les trois algorithmes SHA sont structurés différemment et se distinguent par SHA-0, SHA-1 et SHA-2. La famille SHA-2 utilise un algorithme identique avec une taille de digeste variable qui se distingue par SHA-224, SHA-256, SHA-384 et SHA-512.
Ce tutoriel explique comment hasher un string, fréquement des mots de passe pour raison de sécurité en utilisant deux méthodes de hachage MD5 et SHA-256. Le hachage permet d'encoder dans un seul sens. Et c'est bien là son plus grand avantage, donc le hachage est irréversible contrairement au chiffrement qui utilise une clé pour le cryptage et le décryptage.

Hacher un String avec MD5

Dans cet exemple, on hash un mot de passe avec l'algorithme 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();

//convertir le tableau de bits en une format hexadécimal - méthode 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("En format hexa : " + sb.toString());

//convertir le tableau de bits en une format hexadécimal - méthode 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<byteData.length;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("En format hexa : " + hexString.toString());
}
}
Sortie:

 
En format hexa : 25f9e794323b453885f5181f1b624d0b
En format hexa : 25f9e794323b453885f5181f1b624d0b

Pourquoi faut-il utiliser SHA-256 au lieu de MD5

La sécurité du MD5 a été sérieusement compromise, ses faiblesses ayant été exploitées sur le terrain. L'utilisation de MD5 pour les mots de passe est une mauvaise idée parce qu'il n'est pas un moyen sécurisé. Vous devez toujours utiliser SHA pour vos données sensibles comme les mots de passe des utilisateurs.

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

//convertir le tableau de bits en une format hexadécimal - méthode 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("En format hexa : " + sb.toString());

//convertir le tableau de bits en une format hexadécimal - méthode 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<byteData.length;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("En format hexa : " + hexString.toString());
}
}
Sortie:

 
En format hexa : 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
En format hexa : 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225

Références:
https://en.wikipedia.org/wiki/MD5
https://en.wikipedia.org/wiki/Secure_Hash_Algorithm
How weak is MD5 as a password hashing function ?