Cryptage du mot de passe – votre avis SVP!
Bonjour à tous,
Pour mon application web de fin d'études (dont l'URL est disponible exclusivement en https) j'ai utilisé le cryptage du mot de passe de l'utilisateur en suivant les indications disponibles ici
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public boolean authenticate(String attemptedPassword, byte[] encryptedPassword, byte[] salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
// Encrypt the clear-text password using the same salt that was used to
// encrypt the original password
byte[] encryptedAttemptedPassword = getEncryptedPassword(attemptedPassword, salt);
// Authentication succeeds if encrypted password that the user entered
// is equal to the stored hash
return Arrays.equals(encryptedPassword, encryptedAttemptedPassword);
}
public byte[] getEncryptedPassword(String password, byte[] salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
// PBKDF2 with SHA-1 as the hashing algorithm. Note that the NIST
// specifically names SHA-1 as an acceptable hashing algorithm for PBKDF2
String algorithm = "PBKDF2WithHmacSHA1";
// SHA-1 generates 160 bit hashes, so that's what makes sense here
int derivedKeyLength = 160;
// Pick an iteration count that works for you. The NIST recommends at
// least 1,000 iterations:
// http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf
// iOS 4.x reportedly uses 10,000:
// http://blog.crackpassword.com/2010/09/smartphone-forensics-cracking-blackberry-backup-passwords/
int iterations = 20000;
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);
return f.generateSecret(spec).getEncoded();
}
public byte[] generateSalt() throws NoSuchAlgorithmException {
// VERY important to use SecureRandom instead of just Random
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
// Generate a 8 byte (64 bit) salt as recommended by RSA PKCS5
byte[] salt = new byte[8];
random.nextBytes(salt);
return salt;
} |
Vue qu'il m'a été impossible de récupérer les tableaux de byte de la base de données PostgreSQL, dans la classe où ces méthodes sont appelées j'ai fait des conversions pour pouvoir stoker les valeurs en chaînes de caractères et les récupérer en binaire
Code:
1 2 3 4 5 6 7
| public static String toHexString(byte[] array) {
return DatatypeConverter.printHexBinary(array);
}
public static byte[] toByteArray(String s) {
return DatatypeConverter.parseHexBinary(s);
} |
Je voudrais améliorer cette fonctionnalité pour l'application que je suis en train de développer mais en regardant sur Internet (sujets datant de moins d'un an) je trouve des avis assez différents, en commençant par ceux qui proposent d'utiliser des API et / ou des librairies pour faire le cryptage jusqu'à ceux qui disent que même MD5 reste un algorithme de hachage acceptable si l'on l'applique plusieurs fois sur la séquence de byte.
Aucune vente via l'application n'est prévue, il n'y a pas de numéro de carte bancaire stocké. Le salt me serait utile pour crypter autre valeur concernant l'utilisateur et envoyer cette valeur cryptée par mail dans un bouton qui confirme l'enregistrement sur le site. L'URL sera disponible uniquement en https. Ce n'est pas le site d'une banque mais les données des utilisateurs doivent bien sûr être protégées de la meilleure façon.
Si vous pourriez me donner votre avis... Merci par avance!