Je veux donner peut-être un million de mot de passe à certains utilisateurs qui devraient être comme: p>
devrais-je utiliser aléatoire code> ici? Comment? P>
10 Réponses :
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) ]); }
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": -}
Ce que je ferais, c'est quelque chose comme ceci: p>
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.
Ce sera le plus facile :)
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.
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
+1 Le randomhabétique code> et
randomalpharumérique code> 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 a > 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
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.
Ceci est aussi une belle:
String password = Integer.toString((int) (Math.random() * Integer.MAX_VALUE), 36);
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(); } }
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());
Un peu en retard, mais j'utilise habituellement le code suivant: 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. P> p>
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: Cette regex répond aux critères suivants: p> 1.- au moins 1 lettre minuscule p> 2.- au moins 1 lettre majuscule p> 3.- au moins 1 chiffre (nombre) p> < 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é) p> Qu'est-ce que ce code est que tandis que code> Votre mot de passe généré ne répond pas à vos critères, il va boucler le
pour code> boucle encore et encore. p> p>
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> 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());
}
}
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.