Java - Comment créer des nombres aléatoires forts

La classe SecureRandom en Java fournit un générateur de nombres pseudo-aléatoires sécurisé sur le plan cryptographique et destiné aux applications sensibles.

Dans cet exemple, nous ne l’utilisons pas aux fins pour lesquelles il a été conçu, mais nous présentons plutôt ses méthodes dans un générateur de mot de passe simple.

1. Générateur de mots de passe à l’aide de Secure Random

Une convention que nous avons définie pour notre générateur de mot de passe est que le mot de passe final peut être composé des lettres majuscules A-Z, des lettres minuscules a-z, des chiffres de 0 à 9 et des symboles #, $,%, & et @.

PasswordGenerator.java

package com.techfou.passwordgen;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;

public class PasswordGenerator {

    private SecureRandom srand;
    private ArrayList validch;

    public PasswordGenerator() throws NoSuchAlgorithmException, NoSuchProviderException {
        srand = new SecureRandom();
        validch = new ArrayList<>();

       //Filling the ArrayList with the characters we want to use based on ascii table:
       //https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
        for (int i = 65; i < 91; i++) {
            validch.add((char) i);//A-Z
            validch.add((char) (i + 32));//a-z
        }
        for (int i = 48; i < 58; i++) {
            validch.add((char) i);
        }
        for (int i = 35; i < 39; i++) {
            validch.add((char) i);
        }
        validch.add((char) 64);
        Collections.shuffle(validch);
    }

    public char randChar() {
        return (char) this.validch.get(srand.nextInt(this.validch.size()));
    }

    public static void main(String[]args) throws NoSuchAlgorithmException,
        NoSuchProviderException, UnsupportedEncodingException {

        PasswordGenerator pg = new PasswordGenerator();

        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < 10; j++) {//Generate 10 passwords
            for (int i = 0; i < 10; i++) {//Passwords are 10 characters long
                sb.append(pg.randChar());
            }
            System.out.println(sb.toString());
            sb.setLength(0);
        }

    }

}

Sortie:

s96g9RH%BH
%Cs5DjHgRD
xGea5Kb&5b
QomXOfC98s
BU0s%gqK6J
0yOkL%SHrT
j@drmKSwhy
aKwriP#xd9
XxdjIT7jr@
Qd7OE1RYNi

Dans l’exemple ci-dessus, nous avons appelé SecureRandom avec le constructeur par défaut. Au lieu de cela, nous aurions pu lancer le SecureRandom en utilisant un algorithme et un fournisseur. En fonction des besoins de notre application, nous pouvons être amenés à spécifier un fournisseur, mais en général, il est bon de s’abstenir et de permettre au système d’utiliser l’algorithme avec la priorité la plus élevée.

2. Définition de la graine sur SecureRandom

SecureRandom nous donne la possibilité de définir la graine via la méthode` .setSeed () . Cette méthode peut recevoir un nombre long ou un tableau d’octets. Evitez de placer le `SecureRandom car cela compromettra presque toujours la sécurité du générateur aléatoire; laissez-le plutôt utiliser son mécanisme d’ensemencement interne. Cela ne signifie pas qu’une graine doit être utilisée indéfiniment. Pour les applications qui utilisent beaucoup de nombres aléatoires, vous devriez générer un nouveau SecureRandom régulièrement, car cela créera un nouveau générateur avec un nouveau germe.

Références

Classe]

lien://tag/guest-post/[message invité]lien://tag/java-security/[java sécurité]lien://tag/mot de passe/[mot de passe] nombres aléatoires security