11
votes

Comment puis-je créer un mot de passe?

Je veux donner peut-être un million de mot de passe à certains utilisateurs qui devraient être comme:

  1. Il doit avoir au moins 6 caractères
  2. Il doit avoir des chiffres et des lettres

    devrais-je utiliser aléatoire ici? Comment?


2 commentaires

J'ai vu une solution intéressante au problème "aléatoire" lorsque je me suis inscrit à mes codes de signature de jante. Ils vous font déplacer la souris une tonne entière pour générer des données truite aléatoires, par opposition à avoir le matériel dédié à faire la même chose.


Est une exigence aléatoire? Sinon, alors simplement itérale de plus de 000000 à 9999999 et AA-ZZ.


10 Réponses :


10
votes

Utilisez SE SE SE SECURAINDOM , Il fournit un mot de passe plus aléatoire.

Vous pouvez créer un seul mot de passe à l'aide de quelque chose comme ceci (Remarque: Code non testé). P>

// put here all characters that are allowed in password
char[] allowedCharacters = {'a','b','c','1','2','3','4'};

SecureRandom random = new SecureRandom();
StringBuffer password = new StringBuffer();

for(int i = 0; i < PASSWORD_LENGTH; i++) {
    password.append(allowedCharacters[ random.nextInt(allowedCharacters.length) ]);
}


3 commentaires

SecureDandom renvoie des chiffres, mais elle a demandé des chiffres et des lettres.


Ce code fait référence à un tableau de caractères par la valeur entière renvoyée, de sorte qu'il renvoie en effet des caractères et des chiffres!


ne peut pas arrêter de guérir chaque fois que je lis comme "plus aléatoire": -}



1
votes

Ce que je ferais, c'est quelque chose comme ceci:

  1. Créez deux matrices, une avec les lettres autorisées et autres avec les chiffres autorisés.
  2. Utilisez aléatoire pour décider de la longueur du mot de passe.
  3. Utilisez aléatoire pour décider si le caractère suivant est une lettre ou un chiffre.
  4. Utilisez une fois de plus aléatoire pour générer un index pour la matrice de lettres ou de chiffres (en fonction de ce que vous avez obtenu à l'étape 3). Ajouter le caractère obtenu au mot de passe.
  5. Répétez la répétition de 3 jusqu'à ce que vous ayez la quantité de caractères obtenus dans 2.

2 commentaires

Cela ne garantit pas les chiffres et les lettres du mot de passe


@JK: Vous avez raison. Ensuite, le mot de passe doit être vérifié à la fin du processus, et s'il ne contient que des lettres ou uniquement des chiffres, il peut être rejeté et le processus démarré, ou quelques caractères du groupe manquant pourraient être ajoutés manuellement. Quoi qu'il en soit, cela devrait arriver rarement.



0
votes

Ce sera le plus facile :) xxx


3 commentaires

Cela initialise le générateur de nombres aléatoires à l'intérieur de la boucle, en utilisant l'heure actuelle. Le mot de passe ne sera pas très aléatoire. Le mot de passe généré également peut également contenir des caractères non déroutants.


@juha ... c'est vraiment raison, peut-être que j'étais à moitié endormi tout en répondant à cela ... je vais mettre à jour la réponse :)


Vous utilisez le même numéro aléatoire pour décider d'utiliser des chiffres et des caractères et comme des tableaux d'index sur digit_group / char_group. C'est un peu suspect. Vous devez également utiliser un paramètre beaucoup plus grand sur la deuxième appel RND.NextSint (), quelque chose comme Max_int, sinon la distribution de mots de passe peut être asymétrique.



34
votes

Randomstringutils de Apache Commons Lang fournit des méthodes pour générer une chaîne randomisée, qui peut être utilisée comme mot de passe.


Voici quelques exemples de mots de passe de 8 caractères Création: p>

D13DD1Eb
cac1Dac2
FE1bD2DE
2ab3Fb3D
213cFEFD
3c2FEDDF
FDbFcc1E
b2cD1c11


5 commentaires

+1 Le randomhabétique et randomalpharumérique est bon pour cela, sauf si vous voulez des mots de passe aléatoires vraiment cryptographiques.


Randomstringutils est cassé, pouvez-vous fournir le bon lien.


Randomstringutils n'est pas bien adapté à la génération de mot de passe, car il est basé sur la norme Aléatoire , mais pas sur


Sauf si vous spécifiez manuellement une génératrice aléatoire sécurisée, voir Randomstringutils.Random


Cette réponse est un peu dangereuse, car Java.Utill.Random est utilisé par défaut (qui est indiqué par d'autres). Java.Util.Random est fissuré, donc si cela est utilisé pour générer de nouveaux mots de passe / jetons pour la réinitialisation du mot de passe, un attaquant peut prédire le mot de passe / jeton suivant et commencer à voler des comptes. -1 en raison de cela.



3
votes

Ceci est aussi une belle:

String password = Integer.toString((int) (Math.random() * Integer.MAX_VALUE), 36);


0 commentaires

5
votes

Voici celui que j'ai écrit un moment:

package com.stackoverflow.does.my.code.for.me;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;

public class PasswordUtil {

    /** Minimum password length = 6 */
    public static final int MIN_PASSWORD_LENGTH = 6;
    /** Maximum password length = 8 */
    public static final int MAX_PASSWORD_LENGTH = 8;

    /** Uppercase characters A-Z */
    public static final char[] UPPERS = new char[26];
    /** Lowercase characters a-z */
    public static final char[] LOWERS = new char[26];
    /**
     * Printable non-alphanumeric characters, excluding space.
     */
    public static final char[] SPECIALS = new char[32];
    public static final char[] DIGITS = new char[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    static {
        // Static initializer block for populating arrays
        int U = 'A';
        int l = 'a';
        int d = '0';
        for (int i = 0; i < 26; i++) {
            UPPERS[i] = (char) (U + i);
            LOWERS[i] = (char) (l + i);
            if (i < 10) {
                DIGITS[i] = (char) (d + i);
            }
        }
        int p = 0;
        for (int s = 33; s < 127; s++) {
            char specialChar = (char) 32;

            if (s >= 'a' && s <= 'z')
                s = 'z' + 1; // jump over 'a' to 'z'
            else if (s >= 'A' && s <= 'Z')
                s = 'Z' + 1; // jump over 'A' to 'Z'
            else if (s >= '0' && s <= '9')
                s = '9' + 1; // jump over '0' to '9'

            specialChar = (char) s;
            SPECIALS[p] = specialChar;
            p++;
        }
    }

    public String generatePassword() {
        List<char[]> activeSets = new ArrayList<char[]>(4);
        List<char[]> inactiveSets = new ArrayList<char[]>(4);

        activeSets.add(UPPERS);
        activeSets.add(LOWERS);
        activeSets.add(SPECIALS);
        activeSets.add(DIGITS);

        SecureRandom random = new SecureRandom();

        int passwordLength = 5 + random.nextInt(3);
        StringBuffer password = new StringBuffer(passwordLength + 1);

        for (int p = 0; p <= passwordLength; p++) {
            char[] randomSet = null;
            if (activeSets.size() > 1) {
                int rSet = random.nextInt(activeSets.size());
                randomSet = activeSets.get(rSet);
                inactiveSets.add(randomSet);
                activeSets.remove(rSet);
            } else {
                randomSet = activeSets.get(0);
                inactiveSets.add(randomSet);
                activeSets.clear();
                activeSets.addAll(inactiveSets);
                inactiveSets.clear();
            }
            int rChar = random.nextInt(randomSet.length);
            char randomChar = randomSet[rChar];
            password.append(randomChar);
        }

        return password.toString();
    }
}


0 commentaires

24
votes

Lorsque vous utilisez le aléattringutils de Apache Code> pour des raisons de sécurité (c.-à-d. mots de passe em>), il est très important de combiner l'utilisation d'un SECURERANDOM code> Source:

RandomStringUtils.random(6, 0, 0, true, true, null, new SecureRandom());


0 commentaires

0
votes

Un peu en retard, mais j'utilise habituellement le code suivant: xxx

Il n'y a aucune garantie qu'il y aura toujours un nombre, un caractère spécial, des minuscules et des caractères majuscules dans le mot de passe. Cela pourrait être appliqué en ajoutant d'abord un caractère et un chiffre, mais cela créerait des mots de passe un peu plus prévisibles.


0 commentaires

0
votes

Voici comment vous pouvez vous assurer que votre mot de passe généré répond à vos critères de mot de passe, par exemple: Dans votre cas, j'utiliserais cette regex: xxx

Cette regex répond aux critères suivants:

1.- au moins 1 lettre minuscule

2.- au moins 1 lettre majuscule

3.- au moins 1 chiffre (nombre) < p> 4.- Au moins 6 caractères (note que l'ajout d'un nombre supérieur à 6 après la virgule à la fin de la regex, répondra désormais à un critère d'au moins 6 caractères et un maximum de tout ce que vous avez placé) xxx

Qu'est-ce que ce code est que tandis que Votre mot de passe généré ne répond pas à vos critères, il va boucler le pour boucle encore et encore.


0 commentaires

0
votes

implémenté un Passwordbuilder . Prend en charge la limite passive, doit avoir des caractères et combien d'entre eux, de gammes de caractères et une liste d'entre eux.

Utilisation Exemple: p> xxx pré>

exemple Résultat: Qu1gy7P + J + -PUW + _ CODE> P>

//Version=1.0
//Source=https://www.dropbox.com/s/3a4uyrd2kcqdo28/PasswordBuilder.java?dl=0
//Dependencies=java:7 com.google.guava:guava:18.0 commons-lang:commons-lang:2.6

import com.google.common.primitives.Chars;
import org.apache.commons.lang.ArrayUtils;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by alik on 5/26/16.
 */
public class PasswordBuilder {
    private int size = 16;
    private List<Character> options = new ArrayList<>();
    private Map<List<Character>, Integer> musts = new java.util.LinkedHashMap<>();
    private SecureRandom secureRandom = new SecureRandom();

    public PasswordBuilder() {
    }

    public PasswordBuilder setSize(int size) {
        this.size = size;
        return this;
    }

    public PasswordBuilder addRangeOption(char from, char to, int mustCount) {
        List<Character> option = new ArrayList<>(to - from + 1);
        for (char i = from; i < to; ++i) {
            option.add(i);
        }
        return addOption(option, mustCount);
    }

    public PasswordBuilder addCharsOption(String chars, int mustCount) {
            return addOption(Chars.asList(chars.toCharArray()), mustCount);
    }

    public PasswordBuilder addOption(List<Character> option, int mustCount) {
        this.options.addAll(option);
        musts.put(option, mustCount);
        return this;

    }

    public String build() {
        validateMustsNotOverflowsSize();
        Character[] password = new Character[size];

        // Generate random from musts
        for (Map.Entry<List<Character>, Integer> entry : musts.entrySet()) {
            for (int i = 0; i < entry.getValue(); i++) {
                int charIndex = secureRandom.nextInt(entry.getKey().size());
                char c = entry.getKey().get(charIndex);
                addChar(password, c);
            }
        }

        // Generate from overall
        for (int i = 0; i < password.length; i++) {
            if (password[i] != null) continue;
            password[i] = options.get(secureRandom.nextInt(options.size()));
        }
        return new String(ArrayUtils.toPrimitive(password));
    }

    private void addChar(Character[] password, char c) {
        int i;
        for (i = secureRandom.nextInt(password.length); password[i] != null; i = secureRandom.nextInt(password.length)) {
        }
        password[i] = c;
    }

    private void validateMustsNotOverflowsSize() {
        int overallMusts = 0;
        for (Integer mustCount : musts.values()) {
            overallMusts += mustCount;
        }
        if (overallMusts > size) {
            throw new RuntimeException("Overall musts exceeds the requested size of the password.");
        }
    }

    public static void main(String[] args) {
        System.out.println(new PasswordBuilder().addCharsOption("!@#$%&*()_-+=[]{}\\|:/?.,><", 1).addRangeOption('A', 'Z', 1).addRangeOption('a', 'z', 0).addRangeOption('0', '9', 1).build());
        System.out.println(new PasswordBuilder().addCharsOption("!@#$%&*()_-+=[]{}\\|:/?.,><", 1).addRangeOption('A', 'Z', 1).addRangeOption('a', 'z', 0).addRangeOption('0', '9', 1).setSize(5).build());
    }
}


0 commentaires