mercredi 16 septembre 2009

java : créer une clé de hashage unique ...

Il est parfois utile de créer une valeur de hash, pour signer un fichier, ou crypter un mot de passe en base ... Pour cela , java propose une classe simple à utiliser, et tout une gamme d'algorithme (SHA1, MD-5, SHA-256,etc...) ...

1-Tout d'abord, on initialise le SecureRandom
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");

2-on obtient une instance de MessageDigester avec l'algo choisi.

//get its digest
MessageDigest sha = MessageDigest.getInstance("SHA-1");


3-encrypter une chaine quelconque, et récuperer le tableau de byte
byte[] result = sha.digest( randomNum.getBytes() );


4-Voici, un exemple complet (mais jamais testé), qui montre un bel affichage en hexa :


import java.security.SecureRandom;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class GenerateId {

public static void main (String... arguments) {
try {
//Initialize SecureRandom
//This is a lengthy operation, to be done only upon
//initialization of the application
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");

//generate a random number
String randomNum = new Integer( prng.nextInt() ).toString();

//get its digest
MessageDigest sha = MessageDigest.getInstance("SHA-1");
byte[] result = sha.digest( randomNum.getBytes() );

System.out.println("Random number: " + randomNum);
System.out.println("Message digest: " + hexEncode(result) );
}
catch ( NoSuchAlgorithmException ex ) {
System.err.println(ex);
}
}

/**
* The byte[] returned by MessageDigest does not have a nice
* textual representation, so some form of encoding is usually performed.
*
* This implementation follows the example of David Flanagan's book
* "Java In A Nutshell", and converts a byte array into a String
* of hex characters.
*
* Another popular alternative is to use a "Base64" encoding.
*/
static private String hexEncode( byte[] aInput){
StringBuilder result = new StringBuilder();
char[] digits = {'0', '1', '2', '3', '4','5','6','7','8','9','a','b','c','d','e','f'};
for ( int idx = 0; idx < aInput.length; ++idx) {
byte b = aInput[idx];
result.append( digits[ (b&0xf0) >> 4 ] );
result.append( digits[ b&0x0f] );
}
return result.toString();
}
}

Aucun commentaire:

Enregistrer un commentaire