Lorsqu'un utilisateur de notre site perd son mot de passe et se rend sur la page Mot de passe perdu, nous devons lui donner un nouveau mot de passe temporaire. Cela ne me dérange pas vraiment à quel point c'est aléatoire, ou si cela correspond à toutes les règles de mot de passe fort "nécessaires", tout ce que je veux faire, c'est leur donner un mot de passe qu'ils pourront changer plus tard.
L'application est une application Web écrite en C #. donc je pensais être méchant et opter pour la voie facile d'utiliser une partie d'un Guid. c'est à dire
Guid.NewGuid().ToString("d").Substring(1,8)
Suggesstions? pensées?
Réponses:
Il y en a toujours
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .la source
ASP.NET Core
?Cela a un bon avantage de pouvoir choisir parmi une liste de caractères disponibles pour le mot de passe généré (par exemple, chiffres uniquement, uniquement en majuscules ou uniquement en minuscules, etc.)
la source
Random
n'est pas cryptographiquement sécurisé;System.Security.Cryptography.RNGCryptoServiceProvider
est un meilleur choix.Les principaux objectifs de mon code sont:
La première propriété est obtenue en prenant une valeur de 64 bits modulo la taille de l'alphabet. Pour les petits alphabets (comme les 62 caractères de la question), cela conduit à un biais négligeable. Les deuxième et troisième propriétés sont obtenues en utilisant
RNGCryptoServiceProvider
au lieu deSystem.Random
.(Ceci est une copie de ma réponse à Comment puis-je générer des chaînes alphanumériques aléatoires à 8 caractères en C #? )
la source
(Vous pouvez également avoir la classe où cette méthode réside implémenter IDisposable, conserver une référence à la
RNGCryptoServiceProvider
, et la supprimer correctement, pour éviter de l'instancier à plusieurs reprises.)Il a été noté que comme cela renvoie une chaîne en base 64, la longueur de sortie est toujours un multiple de 4, avec l'espace supplémentaire utilisé
=
comme caractère de remplissage. Lelength
paramètre spécifie la longueur du tampon d'octets, pas la chaîne de sortie (et n'est donc peut-être pas le meilleur nom pour ce paramètre, maintenant j'y pense). Cela contrôle le nombre d'octets d' entropie du mot de passe. Cependant, parce que la base-64 utilise un bloc de 4 caractères pour coder chaque 3 octets d'entrée, si vous demandez une longueur qui n'est pas un multiple de 3, il y aura un "espace" supplémentaire, et il sera utilisé=
pour remplir le supplémentaire.Si vous n'aimez pas utiliser des chaînes de base 64 pour une raison quelconque, vous pouvez remplacer l'
Convert.ToBase64String()
appel par une conversion en chaîne régulière ou par l'une desEncoding
méthodes; par exemple.Encoding.UTF8.GetString(tokenBuffer)
- assurez-vous simplement de choisir un jeu de caractères qui peut représenter la gamme complète de valeurs provenant du RNG, et qui produit des caractères compatibles avec l'endroit où vous envoyez ou stockez cela. L'utilisation d'Unicode, par exemple, tend à donner beaucoup de caractères chinois. L'utilisation de la base 64 garantit un ensemble de caractères largement compatible, et les caractéristiques d'une telle chaîne ne devraient pas la rendre moins sûre tant que vous utilisez un algorithme de hachage décent.la source
C'est beaucoup plus grand, mais je pense que cela semble un peu plus complet: http://www.obviex.com/Samples/Password.aspx
la source
Je sais que c'est un vieux fil, mais j'ai ce qui pourrait être une solution assez simple à utiliser. Facile à mettre en œuvre, facile à comprendre et facile à valider.
Tenez compte de l'exigence suivante:
L'expression régulière suivante peut valider ce cas:
Cela sort du cadre de cette question - mais l'expression rationnelle est basée sur lookahead / lookbehind et lookaround .
Le code suivant créera un ensemble aléatoire de caractères correspondant à cette exigence:
Pour répondre à l'exigence ci-dessus, appelez simplement le suivant:
Le code commence par un caractère non valide (
"!"
) - de sorte que la chaîne a une longueur dans laquelle de nouveaux caractères peuvent être injectés.Il boucle ensuite de 1 au nombre de caractères en minuscules requis et, à chaque itération, récupère un élément aléatoire de la liste en minuscules et l'injecte à un emplacement aléatoire dans la chaîne.
Il répète ensuite la boucle pour les lettres majuscules et pour les chiffres.
Cela vous donne des chaînes de longueur =
lowercase + uppercase + numerics
dans lesquelles les caractères minuscules, majuscules et numériques du compte que vous voulez ont été placés dans un ordre aléatoire.la source
System.Random
pour des choses critiques pour la sécurité comme les mots de passe. UtilisationRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Ce code ne générera jamais de «z». random.Next produit des entiers inférieurs au nombre fourni, vous ne devez donc pas soustraire celui supplémentaire de la longueur.Pour ce type de mot de passe, j'ai tendance à utiliser un système susceptible de générer plus facilement des mots de passe "utilisés". Court, souvent composé de fragments prononçables et de quelques nombres, et sans ambiguïté intercaractère (est-ce un 0 ou un O? A 1 ou un I?). Quelque chose comme
(Tapé directement dans le navigateur, utilisez-le uniquement à titre indicatif. Ajoutez également d'autres mots).
la source
Je n'aime pas les mots de passe créés par Membership.GeneratePassword (), car ils sont trop laids et ont trop de caractères spéciaux.
Ce code génère un mot de passe à 10 chiffres pas trop laid.
Bien sûr, je pourrais utiliser un Regex pour faire tous les remplacements, mais cela est plus lisible et maintenable IMO.
la source
J'ai créé cette classe qui utilise RNGCryptoServiceProvider et elle est flexible. Exemple:
la source
J'ai créé cette méthode similaire à celle disponible dans le fournisseur d'adhésion. Ceci est utile si vous ne souhaitez pas ajouter la référence Web dans certaines applications.
Cela fonctionne très bien.
la source
System.Random
pour des choses critiques pour la sécurité comme les mots de passe. UtilisationRNGCryptoServiceProvider
J'ai toujours été très satisfait du générateur de mots de passe intégré à KeePass. Étant donné que KeePass est un programme .Net et open source, j'ai décidé de creuser un peu autour du code. J'ai fini par referncer KeePass.exe, la copie fournie dans l'installation standard de l'application, comme référence dans mon projet et écrire le code ci-dessous. Vous pouvez voir à quel point il est flexible grâce à KeePass. Vous pouvez spécifier la longueur, les caractères à inclure / ne pas inclure, etc ...
la source
la source
Je vais ajouter une autre réponse mal avisée au pot.
J'ai un cas d'utilisation où j'ai besoin de mots de passe aléatoires pour la communication machine-machine, donc je n'ai aucune exigence de lisibilité humaine. Je n'ai pas non plus accès à
Membership.GeneratePassword
dans mon projet, et je ne veux pas ajouter la dépendance.Je suis assez certain de
Membership.GeneratePassword
faire quelque chose de similaire à cela, mais ici, vous pouvez régler les pools de personnages à partir desquels puiser.Et un exemple de sortie:
Pour anticiper les plaintes concernant l'utilisation de
Random
: La principale source d'aléatoire est toujours le crypto RNG. Même si vous pouviez prédéterminer de manière déterministe la séquence qui sortaitRandom
(disons qu'elle ne produisait que1
), vous ne sauriez toujours pas le prochain caractère qui serait choisi (bien que cela limiterait la gamme de possibilités).Une extension simple serait d'ajouter une pondération aux différents jeux de caractères, ce qui pourrait être aussi simple que d'augmenter la valeur maximale et d'ajouter des cas de chute pour augmenter le poids.
Pour un générateur de mot de passe aléatoire plus humaniste, j'ai une fois implémenté un système d'invite utilisant la liste de mots de dés EFF .
la source
J'aime regarder la génération de mots de passe, tout comme la génération de clés logicielles. Vous devez choisir parmi un tableau de caractères qui suivent une bonne pratique. Prenez ce que @ Radu094 a répondu et modifiez-le pour suivre les bonnes pratiques. Ne placez pas chaque lettre dans le tableau de caractères. Certaines lettres sont plus difficiles à dire ou à comprendre par téléphone.
Vous devez également envisager d'utiliser une somme de contrôle sur le mot de passe généré pour vous assurer qu'il a été généré par vous. Une bonne façon d'y parvenir est d'utiliser l' algorithme LUHN .
la source
Voici ce que j'ai rassemblé rapidement.
la source
J'utilise ce code pour générer un mot de passe avec une composition équilibrée d'alphabet, de caractères numériques et non alphanumériques.
la source
C'est court et ça fonctionne très bien pour moi.
la source
Sur mon site Web, j'utilise cette méthode:
Modifiez la chaîne
_SymbolsAll
de votre liste de tableaux.la source
Ajout d'un code supplémentaire à la réponse acceptée. Il améliore les réponses en utilisant simplement aléatoire et permet certaines options de mot de passe. J'ai également aimé certaines des options de la réponse KeePass mais je ne voulais pas inclure l'exécutable dans ma solution.
Ce fut le premier lien lorsque j'ai cherché à générer des mots de passe aléatoires et ce qui suit est hors de portée pour la question actuelle, mais pourrait être important à considérer.
System.Web.Security.Membership.GeneratePassword
est cryptographiquement sécurisée avec un minimum de 20% des caractères non alphanumériques.la source
validChars peut être n'importe quelle construction, mais j'ai décidé de sélectionner en fonction des plages de code ascii en supprimant les caractères de contrôle. Dans cet exemple, il s'agit d'une chaîne de 12 caractères.
la source
la source
Random
aussi statiqueCe package vous permet de générer un mot de passe aléatoire tout en indiquant couramment les caractères qu'il doit contenir (si nécessaire):
https://github.com/prjseal/PasswordGenerator/
Exemple:
la source
Si vous souhaitez utiliser la génération de nombres aléatoires cryptographiquement sécurisée utilisée par System.Web.Security.Membership.GeneratePassword mais souhaitez également restreindre le jeu de caractères aux caractères alphanumériques, vous pouvez filtrer le résultat avec une expression régulière:
la source
la source
Insérez un Timer: timer1, 2 boutons: button1, button2, 1 textBox: textBox1 et un comboBox: comboBox1. Assurez-vous de déclarer:
Code source:
la source
System.Random
pour la sécurité.