Ein angemessenes Passwort generieren

8

Geschichte

Ich muss mir viele Passwörter merken und möchte nicht dasselbe für mehrere Websites verwenden, daher habe ich eine Regel entwickelt, aber die Regel sollte nicht transparent sein. Ich mache also Folgendes:

  • Denken Sie an ein langes Wort oder Konzept wie breadpudding.
  • Ersetzen Sie den ersten Buchstaben durch die Site, bei der wir uns anmelden. Wenn wir uns einloggen google, wird unser Wort greadpudding.
  • Machen Sie den ersten Buchstaben in Großbuchstaben.
  • Ändern Sie den zweiten Buchstaben in ein @Zeichen.
  • Wenn das Kennwort mit einem Nichtkonsonanten beginnt, fügen Sie eine bestimmte Nummer hinzu (z. B. 1234). Andernfalls fügen Sie eine weitere Nummer hinzu (z. B. 4321).

Ta da, Sie haben jetzt ein angemessenes Passwort.

Dieser Prozess ist jedoch mühsam, daher benötige ich ein Programm, um dies für mich zu generieren, basierend auf den folgenden:

Problem

Gegebener Input:

  • a : Das Anfangswort, das eine Zeichenfolge ist und immer in Kleinbuchstaben geschrieben wird und garantiert länger als 3 Zeichen ist.
  • b : Die Site, bei der wir uns anmelden. Dies ist eine Zeichenfolge, die immer in Kleinbuchstaben geschrieben ist und garantiert nicht leer ist.
  • c : Die Zahl für Nichtkonsonanten. Dies ist eine positive Ganzzahl, die führende Nullen haben kann.
  • d : Die Zahl für Konsonanten. Dies ist eine positive Ganzzahl, die führende Nullen haben kann.

Geben Sie eine Zeichenfolge basierend auf den oben genannten Kriterien aus.

Testfälle

Eingang a="volvo", b="gmail", c=5555, d="0001"

G@lvo0001

Eingang a="sherlock", b="9gag", c=31415926535, d=3

9@erlock31415926535

Eingang a="flourishing", b="+google", c=11111, d=2222

+@ourishing11111

Regeln

  • y ist ein Konsonant.
  • Wenn Sie sich für eine Ganzzahl entscheiden coder deine Ganzzahl sind, können Sie diese als solche analysieren, und führende Nullen können ignoriert werden ( 0091werden als behandelt 91).
  • Nachgestellte Leerzeichen und Zeilenumbrüche sind zulässig.
  • Sie können das Ergebnis an STDOUT ausgeben oder das Ergebnis in einer Funktion zurückgeben.
  • Zeichen erlaubt in aund bsind [a-z0-9!@#$%^&*()_+=-].
  • Sie können die 4 Eingaben in beliebiger Reihenfolge akzeptieren.

Das ist . Der kürzeste Code in Bytes gewinnt.

LiefdeWen
quelle
5
Durch 20 Jahre Bemühungen haben wir alle erfolgreich darin geschult, Passwörter zu verwenden, die für Menschen schwer zu merken sind, für Computer jedoch leicht zu erraten sind. Die Stärke des Passworts wird niemals davon bestimmt, wie viele Groß- / Sonderzeichen das Passwort enthält.
Undichte Nonne
@LeakyNun Ja, ich stimme zu, aber die Anzahl der zulässigen Zeichensätze macht es auch schwieriger. Stellen Sie sich also vor, wenn ein Kennwortfeld nur Kleinbuchstaben zulässt, verringert sich die Schwierigkeit, Brute-Forcing zu erzwingen.
LiefdeWen
Ja, bei einer bestimmten Länge erhöht die Einbeziehung weiterer Zeichentypen (Zahlen, Großbuchstaben, Symbole) die Sicherheit, jedoch nicht exponentiell. Ein langes Passwort mit Kleinbuchstaben ist viel stärker als ein kurzes Passwort mit gemischten Zeichen. Laut zxcvbn: "4321breadpudding" (10 ^ 9) in <1s gebrochen als schneller Hash, "4321G @ eadpudding" (10 ^ 11) in 8s gebrochen, "Oma macht großen Brotpudding" (10 ^ 24) in Jahrhunderten gebrochen "Oma, mach einen tollen Brotpudding!" (10 ^ 27) in Jahrhunderten gebrochen. Denken Sie daran, die Passwortschwierigkeiten in Größenordnungen zu berechnen. In diesem Fall ist 2 nicht viel!
vee_ess
3
"Wie lange dauert es, bis G @ anny großen Brotpudding1234 kaputt macht"? Nun, jetzt ist es auf allen Crackz0rd-Listen, also weniger als 1 Sekunde :-P
Olivier Grégoire
1
@LeakyNun Hast du den Flavour-Text für diesen xkcd-Comic gelesen?
Poke

Antworten:

2

Gelee , 17 Bytes

Ḣ©Œu;”@o;⁶⁵®eØC¤?

Ein volles Programm, die Argumente in der Reihenfolge nehmen b, a, c, d.

Probieren Sie es online aus!

Wie?

Die Hauptverbindung ist dyadischen unter bund awerden die Programmeingänge dann b, a, c, und d(die dritte bis sechste Befehlszeilenargumente), so , cund dals solche zugegriffen wird.

Ḣ©Œu;”@o;⁶⁵®eØC¤?  Main link: b, a           e.g. "gmail", "volvo" (c="5555" and d="0001")
Ḣ                  head b                         'g'
 ©                 copy to register and yield     'g'
  Œu               convert to uppercase           "G"
     ”@            literal '@' character          '@'
    ;              concatenate                    "G@"
       o           logical or with a (vectorises) "G@lvo"
                ?  if:
               ¤     nilad followed by link(s) as a nilad:
           ®           recall value from register  'g'
             ØC        yield consonants            "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"
            e          exists in?                  1
         ⁶         ...then: 6th arg = 4th in = d   "0001" 
          ⁵        ...else: 5th arg = 3rd in = c   "5555"
        ;          concatenate                     "G@lvo0001"
                   implicit print
Jonathan Allan
quelle
3

Python 3 , 69 Bytes

lambda a,b,*c:b[0].upper()+"@"+a[2:]+c[b[0]in"bcdfghjklmnpqrstvwxyz"]

Probieren Sie es online aus!

Undichte Nonne
quelle
Warum nicht b[0]not in"aeiou"stattdessen verwenden?
Officialaimm
3
@officialaimm, weil aus irgendeinem gottverlassenen Grund 9als Nichtkonsonant gezählt wird.
Undichte Nonne
Ja, die Regel in der Frage sagt nichts explizit über die Zahlen aus ...
offiziell am
2
Speichern Sie 3 Bytes (Hinweis: zist das maximal mögliche Zeichen):('a'<b[0])*b[0]not in"eiou"
Jonathan Allan
2

05AB1E , 22 20 18 Bytes

н©u'@I¦¦žN®åiI\}IJ

Eingabe genommen als b,a,c,d

Probieren Sie es online aus!

Erklärung (veraltet)

¦                     # remove the first char of a
 s                    # swap b to the top of the stack
  н©                  # push the head of b and store a copy in register
    uì                # convert the head to upper case and prepend to a
      U               # store in variable X
       žN®åi          # if the head of b is a consonant
            \}        # discard c
              X«      # concatenate X with c or d
                '@1ǝ  # insert an "@" at character position 1

wird im Link verwendet, da er нnoch nicht zu TIO gezogen wurde.

Emigna
quelle
2

Javascript ES6, 87 Bytes

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:c)

Demo

Weedoze
quelle
Ich wollte das gerade posten. Ich meine wörtlich das, Charakter für Charakter.
Schade
@Hankrecords Hehe, wir können es vielleicht verbessern
Weedoze
Da {|}~keine gültigen Zeichen sind, können Sie ersetzen /[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:cmit /[ -_aeiou]/.test(b[0])?c:dfür minus 13 Bytes
PunPun1000
2

C, 441 286 139 Bytes

#define o(c)*a[1]==0xc
int main(int b,char** a){printf("%c@%s%s",*a[1],a[2]+2,(*a[1]>97&*a[1]<128)
&!(o(65)|o(69)|o(6F)|o(75))?a[4]:a[3]);}
ulascan
quelle
1
ähm ... statt 21 Sätzen mit argv[1][0]='c'|argv[1][0]='c'|...c = Konsonant können Sie dies leicht reduzieren, indem Sie die !(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o'|argv[1][0]='u')Punktzahl um 264 reduzieren.
Baldrickk
Nein, wie anders erwähnt, das erlaubt Zahlen und andere Zeichen
Blue
@muddyfish dann machst du es (argv[0][1]>='a'&argv[0][1]<='z'&!(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o‌​'|argv[1][0]='u')). Noch etwas kürzer. Es gibt jedoch so viele Möglichkeiten, diesen Code zu spielen, dass ich nicht weiß, wo ich anfangen soll ...: s
Olivier Grégoire
Ich bin offen für Ideen :) Dies ist mein erster Versuch, Golf zu spielen
Ulascan
Nun, es geht dir gut! Ich bin sicher, es kann noch verbessert werden, wie die Verwendung einer Variablen anstelle eines Makros, aber ja, Sie beginnen auf dem richtigen Fuß! :) Diese Golftipps könnten Sie wahrscheinlich gut gebrauchen !
Olivier Grégoire
2

R , 105 103 Bytes

pryr::f({m=substr(b,0,1);paste0(toupper(m),'@',substring(a,3),'if'(grepl("[b-df-hj-np-tv-z]",m),d,c))})

Anonyme Funktion. Evaluiert zu

function (a, b, c, d) 
{
    m = substr(b, 0, 1)                      #first letter of website
    paste0(toupper(m),                       #concatenate that letter, capitalized,
           "@",                              #an '@',     
           substring(a, 3),                  #the rest of the long string,
           if(                               #and
           grepl("[b-df-hj-np-tv-z]", m)),   #if the first letter is a consonant,
           d                                 #the consonant string/num,
           else c)                           #else the other one
}

Welches ist, was auf TIO ist. Bitte helfen Sie mir, diesen Regex zu spielen, weil ich schrecklich darin bin.

2 Bytes von Giuseppe gespeichert.

Probieren Sie es online aus!

BLT
quelle
Sie könnten verwenden!grepl('[aeiouy]',m)
Giuseppe
1
oder noch besser, grepl('[aeiouy]',m)und einfach tauschen cund d.
Giuseppe
93 Bytes "if" machen die ifSyntax viel übersichtlicher, anstatt elseoder zu verwenden ifelse. Ich habe auch substringin einer Variablen gespeichert und msofort in Großbuchstaben geschrieben, um ein Byte zu speichern.
Giuseppe
1
Ich habe versucht, Ihre Funktion auszuführen, und bin auf zwei Probleme gestoßen: pryrversucht, substringein Argument vorzubringen; und du findest greplnur "keine Vokale", was nicht dasselbe ist wie Konsonanten. Das, "if"was ich gerade verpasst habe, danke, dass du darauf hingewiesen hast.
BLT
Ich hatte es nicht wirklich getestet; Ich wusste nicht, pryr::fdass mir das nicht gefallen würde; Sie könnten den regulären Ausdruck '[az && [^ aeiouy]]' aus Kevin Cruijissens Antwort verwenden?
Giuseppe
2

Netzhaut , 80 75 Bytes

^..(.*)¶(.).*
$2@$1
^([ -_aeiou].*)¶(.*)¶.*
$1$2
(.*)¶.*¶(.*)
$1$2
T`l`L`^.

Probieren Sie es online aus!

Wenn Sie hier eine neue Sprache ausprobieren, werden Eingaben in der in der Frage angegebenen Reihenfolge vorgenommen

Erläuterung:

^..(.*)¶(.).*
$2@$1

Erstellen Sie ein Wort, bei dem es sich um das zweite Wort, den ersten Buchstaben, das @ -Zeichen und das erste Wort ab dem 3. Zeichen handelt.

^([ -_aeiou].*)¶(.*)¶.*
$1$2

Wenn das Wort mit einem Nichtkonsonanten beginnt, fügen Sie die erste Zahl hinzu

(.*)¶.*¶(.*)
$1$2

Wenn noch 3 Zeilen übrig sind (keine Substitution im letzten Schritt, also beginnt es mit einem Konsonanten), fügen Sie die zweite Zahl hinzu

T`l`L`^.

Den ersten Buchstaben in Großbuchstaben schreiben

PunPun1000
quelle
1

QBIC , 81 Bytes

G=ucase$(_s;,1|)+@@`+_s;,3,_lC||~instr(@bcdfghjklmnpqrstvwxyz`,_sC,1|)|?G+;\?G+;

Erläuterung

Parameters are Website(A$), base word(C$), consonant-number(E$), and nonsonant-number(F$)
G=                           SET G$ to
 ucase$(      )              the upper-case version of (also works for '9gag', '+google')
        _s;,1|                  the first char of the website A$ read from cmd line
 +@@`                        plus a literal @ (B$)
 +_s;,3,_lC||                plus all characters from base word C$ from 3rd char onwards
~instr(                      IF the second arg to INSTR is in the first
 @bcdfghjklmnpqrstvwxyz`,      with all consonants in the first arg
 _sC,1|                        and the first char of the base word C$ in the second
 )
|?G+;                        THEN print G$ plus the consonant addition
\?G+;                        ELSE print G$ plus the other addition

Beachten Sie, dass die letzten beiden Zeilen gleich aussehen, der Interpreter jedoch das Verhalten in jeder Zeile geringfügig ändert ;: Immer wenn er die ;Anweisung sieht , erstellt er eine neue Variable (in diesem Fall sind die Variablen È $ andF $ `die ersten, die nach dem Lesen aller verfügbar sind andere Literale und cmd-Zeilenargumente) und weist dieser Variablen den ersten noch nicht zugewiesenen cmd-Zeilenparameter zu.

steenbergh
quelle
1

JavaScript (ES6), 76 Byte

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[aeiou\d_\W]/.test(b[0])?c:d)

Ich hätte dies als Vorschlag zur Verbesserung der Weedoze-Lösung hinzugefügt , aber es scheint, dass ich es nicht kommentieren kann, da ich größtenteils lauere

Ian
quelle
1

C # , 111 Bytes

(a,b,c,d)=>Char.ToUpper(b[0])+"@"+a.Substring(2)+(b.IndexOfAny("bcdfghjklmnpqrstvwxyz".ToCharArray()==0)?d:c);

Das Überprüfen des Konsonanten ist besonders teuer, da der stringTyp keine direkte Regex-Fähigkeit aufweist .


quelle
1

F # , 157 Bytes

let f(a:string)(b:string)c d=System.Char.ToUpper(b.[0]).ToString()+"@"+a.[2..]+(if((Seq.except['e';'i';'o';'u']['b'..'z'])|>Seq.contains b.[0])then d else c)

F # ist für mich noch sehr neu, daher gibt es wahrscheinlich bessere Ansätze dafür.


quelle
1

Java 8, 112 99 92 87 Bytes

(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)

-13 Bytes, indem der Parameter blast statt second verwendet wird.
-1 Byte durch Entfernen von y
-7 Bytes dank @ OlivierGrégoire (und die Parameter sind wieder in Ordnung)
-5 Bytes dank @ PunPun1000

Erläuterung:

Probieren Sie es hier aus.

(a,b,c,d)->                     // Method with 4 String parameters and String return-type
  b.toUpperCase().charAt(0)     //  First character of B capitalized
  +"@"                          //  + literal "@"
  +a.substring(2)               //  + A excluding first two characters
  +(b.matches("[ -_aeiou].*")?  //  If B starts with a consonant:
    d                           //   + D
   :                            //  Else:
    c)                          //   + C
                                // End of method (implicit / lambda with single return)
Kevin Cruijssen
quelle
1
yist ein Konsonant, so dass Sie den yin Ihrer Regex für 1 Byte ablegen können.
LiefdeWen
2
(a,b,c,d)->ist kürzer als a->b->c->d->. Currying ist nur für 2 Parameter hilfreich. Für 3 ist Curry das gleiche wie kein Curry. Ab 4 Jahren ist kein Curry kürzer.
Olivier Grégoire
1
(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)ist 92 Bytes lang. Außerdem werden die Parameter in der richtigen Reihenfolge verwendet (was mich zuerst verwirrte :-().
Olivier Grégoire
1
@ OlivierGrégoire Danke. Zum zweiten Mal mache ich diesen Fehler in Bezug auf das Currying mit vier Parametern. Und zuerst toUpperCase()und dann .charAt(0)ist es in der Tat kürzer. Ich bin mir nicht sicher, wie ich das verpasst habe. (Und die andere Reihenfolge war zu erlauben (b=...), was nicht möglich wäre, wenn es nicht der letzte Parameter mit Curry ist, weil es dann finalimplizit sein musste / war final.)
Kevin Cruijssen
1
Da {|}~es sich nicht um gültige Zeichen handelt, können Sie diese [ -_aeiou]für Nicht-Konsonanten und Swap dsowie cfür minus 5 Bytes verwenden
PunPun1000
0

V , 25 Bytes

ldvjr@Ç^[aeiou]ü^Á/j

DÍî

Probieren Sie es online aus!

Nimmt Argumente im Puffer in der folgenden Reihenfolge auf:

website
word/phrase
consonant number
non-consonant number
nmjcman101
quelle
0

Bash 4 , 76 Bytes

g(){
a=${2:0:1}
c=$4
[[ "aeiou[0-9]" =~ .*$a.* ]]&&c=$3
p="${a^}@${1:2}$c"
}

Funktioniert in Bash 4:

g volvo gmail 5555 0001; echo $p
g sherlock 9gag 31415926535 3; echo $p
g flourishing +google 11111 2222; echo $p
vee_ess
quelle
0

JavaScript (ES6), 69 Byte

(a,b,c,d)=>e=a[0].toUpperCase()+"@"+a.slice(2)+/[AEIOU]/.test(e)?c:d

Ziemlich einfach, kann wahrscheinlich Golf gespielt werden

BürgermeisterMonty
quelle