Le serveur de domaine requiert que tous les employés disposent d'un mot de passe fort et aléatoire, conforme aux règles suivantes:
- Exactement 15 caractères.
- Caractères saisis au clavier uniquement (comme indiqué dans le type de code ci-dessous). Apprendre aux vendeurs à utiliser les codes ALT + NUMPAD n'est pas autorisé.
- Au moins 1 lettre minuscule:
abcdefghijklmnopqrstuvwxyz
- Au moins 1 lettre majuscule:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Au moins 1 chiffre:
0123456789
- Au moins 1 symbole:
`~!@#$%^&*()_+-={}|[]\:";'<>?,./
À cette fin, le service informatique a commandé et distribuera un générateur de mot de passe aléatoire à tous les employés. Tous les employés devront utiliser le générateur de mot de passe aléatoire. En plus des restrictions de mot de passe ci-dessus, la configuration requise pour Random Password Generator est la suivante:
- Il doit être capable de générer toutes les permutations de tous les caractères autorisés.
- Il doit afficher le mot de passe généré à l'écran.
- Le code doit être aussi petit que possible (en octets).
S'il vous plaît soumettre votre solution proposée dans la semaine prochaine.
correcthorsebatterystaple
Réponses:
Mathematica (18)
Laisse moi un peu tricher
PS pas de sécurité :)
la source
Ruby,
7469 octetsJuste un échantillon aléatoire de la gamme ascii 33 - 126 jusqu'à ce que toutes les classes de caractères soient présentes:
Ruby, 39 octets
À l'aide de la découverte intelligente de l'orignal:
Modifier pour satisfaire la foule:
Notez que les règles ont changé après que j'ai posté ceci pour la première fois. Au moment où les deux entrées précédentes s'appliquaient aux règles. Je voudrais également souligner que les règles ne sont pas encore très bien définies:
"Permutations". Il n'y a pas de permutations des caractères autorisés qui soit conforme au reste des règles, car toute permutation de l'ensemble de caractères autorisés est aussi longue que l'ensemble de caractères autorisés lui-même (alors que le mot de passe est supposé comporter 15 caractères). Et il n'y a pas de répétition dans une permutation. Cependant, ma première entrée est encore plus "aléatoire" que la plupart des réponses bien plus votées ici.
Néanmoins, vous l'avez. Permet la répétition de caractères et de soulignement:
Ruby, 77 octets
J'ai aussi utilisé à la
puts
place dep
celui-ci carp
imprime la chaîne entre guillemets et certains caractères échappés avec une barre oblique inverse.Ruby, 70 octets
Comme Ventero le fait remarquer,
~
peut être ignoré devant les expressions rationnelles etprint
peut être remplacéputs$_
. Mais avec la sortie laide que cela provoque, vous pouvez aussi bien imprimer tous les mots de passe rejetés, en les compressant dans un seul support:Explication
Comme demandé.
$_
est une variable semi-magique qui contient la dernière ligne lue depuis l'entrée - vous n'avez donc pas toujours besoin de la stocker, comme ceci . Ici, cependant, nous l’utilisons à cause d’une autre propriété, à savoir que l’~
opérateur lui applique directement une expression rationnelle, ce que j’ai appris en premier par chron . J'ai remplacé l'usage deall
, mais il devrait être assez facile à comprendre si vous obtenez le reste ( voir la documentation ).la source
.all?{|r|~r}
-il? Que fait$_=
-il?\W
Ruby inclut le trait de soulignement_
? Dans la plupart des dialectes regex, je sais que ce n'est pas le cas. Et si votre code ne pouvait pas générer de mots de passe alors qu'un seul_
était le seul symbole non alphanumérique, il contreviendrait à une exigence. La deuxième approche viole très évidemment cette exigence, mais j’imagine qu’elle n’était pas bien formulée à cette époque.\W
ne contient pas un trait de soulignement dans Perl RegEx compatible ( la source ).sample
ne répète pas les éléments, donc les mots de passe contenant des éléments répétés ne peuvent pas être générés par votre code. Pouvez-vous résoudre ces deux problèmes pour que votre réponse soit conforme à la question? Si votre solution est la meilleure, à l'exception de Wolfram Alpha, il serait bon de voir si vous pouvez vous conformer et conserver la tête. Je suppose que cela ne devrait pas être trop difficile.Java 8 -
354329319275267 caractèresJuste pour vous amuser, utilisez lambdas avec Java 8 - chaque sortie possible a la même probabilité d’être trouvée.
Il utilise le fait que les caractères autorisés ont des codes ASCII consécutifs, allant de 33 à 126.
Exemple de sortie:
Programme compressé:
class A{static int a,A,d,p;public static void main(String[]x){String s;do{s=new String(new java.util.Random().ints(15,33,127).toArray(),0,15);a=A=d=p=0;s.chars().map(c->c>96&c<123?a=1:c>64&c<90?A=1:c>47&c<58?d=1:(p=1)).min();}while(a+A+d+p<4);System.out.println(s);}}
la source
while(a+A+d+p<4)
aveca|=1
au lieu dea++
? Ou encore, utilisez des masques de bits, c'est-à-dire des trucs comme àa|=1
traversa|=8
, aveca<15
comme condition de boucle. Cela économise 13 caractères si je compte correctement.new String(int[],int,int)
enregistre une quarantaine de caractères!Python 2.X + 3.X (229 caractères): générer et remplacer
Idée
r
par un chiffre aléatoires
pars != r
, par une lettre majusculeCode
Python 2.X + 3.X (194 caractères): générer et vérifier
\u
et\l
n’existe pas dans une regex Python.random.sample
n’y avait pas de remplacement, soyez en mesure d’obtenir tous les mots de passe autorisés dont nous avons besoin.Utilisation de la faille dans la description du problème
Actuellement, la description du problème n'exige pas que chaque symbole / chiffre apparaisse avec la même probabilité. Avec la solution suivante, vous ne pouvez faire aucune hypothèse sur un seul symbole et / ou une seule position. Mais vous pouvez le faire avec plusieurs.
Python 2.X + 3.X (62 caractères)
Merci à daniero pour l'idée d'utiliser l'échantillon.
la source
\l
et ainsi de suite pour les regexes en python? Ne le voyez pas dans la référence . Mon Python 3.3.3 n'accepte même pas"\u"
. Lestr(…)
ne joint pas les lettres dans 3.3.3 ou 2.7.6. Une suggestion pour optmization:all(s("\\"+i,p)for i in "dluW")
.random.sample
choisit des éléments sans les remplacer, de sorte que tous les mots de passe ne sont pas possibles.\u
et\l
est vim-only.Bash on * nix (109)
Pour fonctionner correctement, vous
$a
ne devez pas définir un mot de passe valide mais non aléatoire à l’avance. Si vous voulez inclurea=
et séparer une ligne, cela fait trois caractères de plus, mais cela vous permet d’exécuter la chose à plusieurs reprises. Vous pouvez évidemment aussi remplacer toutes les nouvelles lignes par;
afin que vous ayez une ligne que vous pouvez exécuter aussi souvent que vous le souhaitez.De plus, vous devez avoir défini
LC_ALL=C
ou non des variables d’environnement spécifiques aux paramètres régionaux (LANG
etLC_CTYPE
en particulier) , car les plages de caractères dépendent du fait que l’ordre de classement est égal à l’ordre ascii./dev/urandom
est la source d'octets aléatoires.!-~
est la plage de tous les caractères autorisés, comme spécifié dans la question.tr -dc
supprime tous les caractères non listés dans son argument suivant.head
prend 15 des caractères restants.grep
vérifie si chacun des types requis apparaît au moins une fois. Son entrée consiste en quatre copies du candidat. L'ordre des symboles n'a donc pas d'importance. Tous les mots de passe possibles ont donc une chance d'être sélectionnés. La-q
grep sortie de supprime.Pour des raisons inconnues,
/dev/random
au lieu de/dev/urandom
prend des âges. Il semble que l'entropie se soit épuisée assez rapidement. Si vouscd
en/dev
, vous pouvez éviter certains plus d' octets, mais qui se sent un peu comme la tricherie.Python 2 (138)
Pour rendre le code lisible, j'ai ajouté une nouvelle ligne et une indentation après la boucle, ce qui n'est pas nécessaire et que je n'ai pas compté.
C'est essentiellement la même idée que dans la version bash. La source aléatoire est ici
random.sample
, qui ne répétera pas les éléments. Pour contrer ce fait, nous utilisons 15 exemplaires de la liste des lettres autorisées. De cette façon, chaque combinaison peut encore se produire, bien que celles avec des lettres répétées se produisent moins souvent. Mais je décide de considérer cela comme une fonctionnalité et non comme un bug, car la question n'exigeait pas une probabilité égale pour toutes les permutations, mais seulement la possibilité.Python 3 (145)
Une nouvelle ligne et un retrait à nouveau ne comptent pas. Hormis une surcharge de syntaxe spécifique à Python-3, il s'agit de la même solution que pour Python 2.
JavaScript (161)
J'ai ajouté les nouvelles lignes pour plus de lisibilité, mais je ne les ai pas comptées.
R (114)
Le saut de ligne et l'indentation dans la boucle ont été ajoutés mais non comptés. Si vous en avez envie, vous pouvez à nouveau déplacer ceci sur une
;
ligne à simple séparation.la source
grepl
votre code R. Si seulement j'avais pensé à répéter le mot de passe de test quatre fois pour pouvoir effectuer toutes les vérifications en même temps. Et vous savez, si seulement j'avais pensé àsample
etintToUtf8
. Cependant, vous devez ajouterreplace=TRUE
(ou plus simplement, vous devez simplement ajouter,T
) à votre exemple de méthode pour vous assurer d'obtenir tous les mots de passe possibles.replace=T
erreur, merci de l'avoir signalé. TrouverintToUtf8
en devinant des noms probables en complétant l'onglet m'a pris un certain temps; Je savais qu'une telle fonction devait exister, mais les noms les plus communs tels quechr
et ainsi de suite n'étaient pas utilisés.*4
? Je pensais que votre regex correspondrait à n'importe quelle chaîne, à cette annonce en premier une lettre majuscule, puis à n'importe quoi, puis à une lettre minuscule, à quoi que ce soit ... qu'est-ce que je me suis trompé?re.search
n'est pas le casre.match
, de sorte que l'expression régulière puisse correspondre n'importe où dans le mot de passe du candidat. Cela explique-t-il pourquoi il se terminera éventuellement?re.search
au lieu dere.match
. Ceci explique cela. Mais je pense toujours que tu n’as pas besoin de la*4
. Merci pour l'explication (+1)C # (
123 - 139103 - 127 caractères compactés):Utiliser une méthode cadre parfaitement adéquate dans
System.Web.dll
:Compacté:
Exemple:
Sinon, prenez la valeur du deuxième paramètre (
int numberOfNonAlphanumericCharacters
) à partir de la ligne de commande:la source
GeneratePassword
ne prend pas en charge l'ensemble des symboles spécifiés dans la question. Je n'ai pas non plus trouvé de garantie quant au nombre minimum d'occurrences de chaque catégorie de personnage.class P
etstring[] a
.R (
301322 caractères)La correction a oublié de vérifier les chiffres.
(espace ajouté pour plus de clarté).
Génère toutes les permutations possibles de 15 caractères des 94 caractères. Puis en sélectionne un au hasard jusqu'à ce qu'il corresponde aux critères.
La magie réside dans l'
q:q
opération, qui génère un nouveau type de données factoriel, à savoir l' interaction de tous les facteurs de la premièreq
liste avec tous les facteurs de la seconde liste , toutes les combinaisons possibles de ces deux listes étant incluses dans la liste " niveaux "de ce facteur. Interagissez 15 copies de la liste des caractères autorisés et vous obtenez (94 ^ 15) niveaux possibles.S'il vous plaît, n'essayez pas cela à la maison. Le code prend quelques secondes pour comprendre toutes les permutations à trois caractères. Je ne peux vraiment pas imaginer combien de temps il faudrait pour comprendre toutes les permutations à 15 caractères, si votre ordinateur ne manquait pas de mémoire en attendant. Lorsque j'ai exécuté le script terminé (mot de passe à trois caractères) pour le vérifier, le premier mot de passe qu'il a recruté était "oO =", ce qui, selon moi, résume la réaction que vous devriez avoir à l'égard de ce code.
la source
Mathematica 170
Exemples
"<]} Pg3 / e? 3 + Z ~ Oz"
"X / 8jWe @ f (_x5P: ="
"2wz2VQhtJC? * R7 ^"
la source
Python 2.7 (182)
la source
join
genre doit être là: les utilisateurs devraient-ils comprendre la syntaxe de la liste python à partir de la sortie['q', 'u', ...]
:?aA$bc1111111111
impossible l' utilisation d'un mot de passe avec plusieurs des autres groupes (comme ).Golfscript (60)
Depuis l'obl. golfscript est manquant et en tant que noob j'ai besoin de la pratique quand même :)
Il construit simplement un tableau avec les 4 caractères aléatoires requis + 11 et les trie dans un ordre aléatoire.
la source
{r}$
. C'est une façon assez sale de mélanger une liste - j'aime ça! ;-)0Aa~~~~~~~~~~~~
. :-(JavaScript
258240233225En utilisant une règle où:
function(x){return x*x}
peut être ré-écrit commefunction(x)x*x
. Ne semble fonctionner que pour les fonctions renvoyant une valeur.Prochaine itération, réduite
x.sort(function().5-R())
àx.sort(y=>.5-R())
Prochaine itération, réduite davantage avec la notation de la flèche grasse, qui ne fonctionne malheureusement que pour Firefox 22 et les versions ultérieures.
la source
JavaScript (269 caractères compactés)
Pour plus de clarté, voici le code avant de le compacter avec JS-Fiddle :
Ici, il est réduit à 269 caractères (dont JS-Fiddle ):
la source
shuffle()
"fonction personnalisée"? Est-ce une partie de JavaScript ou du code que vous auriez à écrire vous-même?Clojure (63):
Mais il faut améliorer pour que celui-ci contienne au moins 1 caractère de chaque catégorie (Supérieur, Inférieur, Chiffre, Symbole).
la source
Dans sql-server
Voyez-le en action - 1
le voir en action - 2
la source
~0Aa
, ni aucun mot de passeb
suivi dea
.SAS (191)
*TQP,(f=h10*)S=
Commenté / en retrait:
la source
PowerShell: 119
Code Gofled
Non-golfé et commenté
la source
^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$
vous pouvez faire une correspondance avec celle-ci, ce qui ne se fera que s’il ya une seule majuscule, une minuscule, un chiffre et un symbole.1aZ%
et(p3R
correspondre? J'ai eu du mal à trouver des moyens de le faire en ligne.$x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'
Bonnes correspondances: Correspondances manquéesC>suD1?hTwbDx(z
j%4O]HyeG|u[U$5
O/rGeD0$hJk=GO/
:3evthX3_X^nBrR`
.nA ~ uYzrR4YV-r.`u-IjZE48ntQ;HxV
Python 2.7 (149)
Ecrit de manière plus lisible (et non exécutable);
Assez simple et étonnamment pas plus long qu'une version "générer, réessayer sur correspondance échec".
la source
0Aa~~~~~~~~~~~~
? (Notez que'~' == chr(126)
.)PSQL (189)
On se sent comme PSQL est un peu prolixe ... :)
Démo SQLfiddle .
la source
PHP,
235225Ce script mélange les caractères et est ensuite vérifié via RegEx pour s'assurer que le mot de passe est fort (ou qu'il est régénéré).
la source
while(true) ... if (condition) break
vous pouvez utiliserwhile (!condition)
Javascript (209)
Semi-ungolfé;
la source
Perl, 92
Pas aussi concis que la réponse de Ruby, mais je suis sûr qu'un assistant de Perl pourrait rendre cela encore plus court ... Je ne suis pas trop content de tout ce qu'il y a
m//
à la fin, mais semble fonctionner et devrait satisfaire aux conditions pour éventuellement générer toutes les permutations.Exemple d'utilisation:
Modifié pour corriger la validation et passer
[[:punct:]]
à[\W_]
après les commentaires MvG.la source
aaaaaaaaaaaaaa
provoquerait la fin de la boucle. Vous devez tester les critères avec des mots de passe non aléatoires pour vous assurer qu'ils font ce que vous souhaitez.[[:punct:]]
? Je suppose que je préférerais la, which is shorter and of which I'm even more sure that it is correct, at least combined with your
gamme '[\ W_] 33..127`.\W
cela n'inclue pas_
, cependant vous avez absolument raison, ce n'est pas nécessaire: gist.github.com/anonymous/8301237 . Merci!Java 7 (
270234 caractères)Le principe est le même que celui utilisé par @assylias avec java 8 (générer des mots de passe aléatoires jusqu’à obtention d’un mot de passe valide). Cependant, au lieu d'utiliser lambdas, le mot de passe est généré en itérant un tableau de caractères et validé en faisant correspondre une expression régulière.
Code minifié:
la source
Powershell
Version One Liner (143 octets)
Version mini (146 octets)
Version lisible (860 octets)
la source
abcd1234ABCD{|}~
ne sera jamais évoqué car$symbol
oblige au moins l'un des symboles à se situer entre ASCII 33 et 47.$SR
peut$Q
- être ?(g(65..90))
les65..90|g'. And change the
instructions foreach` jusqu'à desforeach-object
boucles utilisant l'%
alias. Exemple:foreach($N in (1..11)){
...}
devrait être faisable que1..11|%{
...}
. Je suis presque sûr que d'autres optimisations sont possibles, mais j'ai en réalité une implémentation complètement différente que je prévois d'essayer plus tard.Facteur, 196 caractères
Même algorithme que MvG et Moose's. Ce n'est pas le plus court mais doit satisfaire à tous les critères (actuels) de la question:
la source
~{}|1234abcdABCD
va échouer à l'expression régulière."~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
C - 154 caractères
Comment je déteste
srand()
? Laisse-moi compter les chemins.la source
Haskell, 192
La chaîne imprimée est entourée de guillemets et échappe aux barres obliques inverses et aux guillemets; si cela est inacceptable,
print
peut être remplacé parputStrLn
3 octets supplémentaires. Voici une version plus lisible:C'est assez simple, il crée simplement une liste infinie / lazy de caractères ASCII aléatoires dans la plage
'!'
de'~'
, puis jette le premier élément jusqu'à ce que les 15 premiers caractères contiennent au moins un caractère de chaque chaîne de caractères requis.la source
Excel VBA, 209 octets
Génère au hasard 15 caractères ASCII afin que toutes les combinaisons possibles soient possibles. Utilise ensuite un modèle d’expression régulière pour vérifier s’il contient au moins un de chaque critère.
Si c'est le cas, le mot de passe est affiché, sinon "redo" est affiché.
Nous remercions Bart Kiers pour le modèle d’expression régulière: https://stackoverflow.com/questions/1559751/regex-to-make-sure-that-the-string-contains-at-least-one-lower-case-char- plus haut
la source
AutoHotkey 352
Utiliser - Il suffit de lancer le script
la source
Python (121 caractères)
Utilise le fait que vous pouvez multiplier des listes en Python [1,2,3] * 2 donne [1,2,3,1,2,3]. Importations aléatoires. Les nombres dans une liste multipliés par trois sont des frontières entre les plages du tableau ascii pour les caractères nécessaires, par exemple [65, 90] mappent en lettres majuscules.
la source
import random
in the code.PHP 5.5 (230 bytes)
Or on one line (211 bytes)
la source