At lave et godt password
Kategorier: Nørderier , Tanker , Udvikling
21. december, 2008
Jeg har fundet en måde hvorpå jeg endelig kan begynde at huske mine passwords uden at forfalde til let-genkendelige tricks. Jeg har til formålet skrevet et program der kan genere passwords der er relativt tilfældige og relativt nemme at huske. Som en advarsel kan jeg fortælle at jeg på ingen måde er sikkerhedsekspert, hvorfor råd givet i dette indlæg ikke bør stoles på over en dørtærskel. For eksempel er det sikkert en rigtigt dårlig idé at publicere den algoritme man bruger til at generere passwords.
Et godt password er vel i princippet minimum 16 tegn langt og består af en tilfældig række af store og små bogstaver, tal og specialtegn. Problemet ved denne type af passwords er at de for de fleste er relativt svære at huske, især hvis man arbejder et sted hvor passwordet skal skiftes jævnligt.
Problemet ved passwords der er nemme at huske er at man ofte forfalder til at bruge kendte ord, navne på ens børn og den slags.
Min løsning er ikke specielt original, og implementationen er ikke nødvendigvis optimal. Idéen bygger på passwords man kan udtale og derfor memorisere relativt hurtigt selvom de er delvist tilfældigt genereret.
Eksempler kunne være:
| Password | Udtale |
|---|---|
| W33cThig | wi:k-thig |
| ThiekSaiPet | Thi:k-saj-pet |
| c3rCrysMo | ser-krys-mo |
Implementationen bygger på at stykke et password sammen af stavelser. En stavelse skal ifølge min børnelærdom indeholde en vokal og et antal konsonanter. En funktion til at generere en stavelse kunne se sådan ud:
# Function to create a syllable up to a maximum length
def make_syllable(max_length):
syl = ''
# If there is only room for one character, use a number
if max_length == 1:
syl += random.choice(numbers)
else:
while True:
# syllable starts with a consonant and a vowel
syl = "%s%s" % (random.choice(start_consonants),
random.choice(vowels))
# maybe there is a consonant at the end
if random.choice((True,False)):
syl += random.choice(end_consonants)
# maybe the syllable is capitalized
if random.choice((True,False)):
syl = syl[0].upper() + syl[1:]
# break if syllable does not exceed max_length
if len(syl) <= max_length: break
return syl
En stavelse starter med en konsonant efterfulgt af en vokal. Muligvis sættes der en konsonant i slutningen. For at tilføre ekstra mystik kan stavelsen starte med stort bogstav. Hvis der kun er plads til ét tegn vil der blive indsat et tal.
Funktionen bygger på en række definerede grupper: vowels, start_consonants, end_consonants og numbers. Der kan tilføjes mere end blot enkelte tegn i som elementer i disse grupper. Eksempelvis er 'ee', 'ai' og 'ie' med i vowel-gruppen, 'pr' og 'tr' i start_consonant-gruppen og 'ng' og 'nt' i end_consonant-gruppen.
Man kunne beskylde funktionen for at være lidt for simpel og rigid - hvilket ville være berettiget. Men som et udgangspunkt virker den udemærket.
For at lave et helt password, skal stavelserne sættes sammen:
def generate_password(plength=8):
generated_password = ''
# add syllable until length is achieved
while not len(generated_password) == plength:
generated_password += make_syllable(plength-len(generated_password))
return generated_password
Tada!
Koden kan hentes som et sammenhængende python-program. Du kan bruge koden til hvad du vil, og du behøver ikke henvise til mig på nogen måde. Jeg er dog altid interesseret i at høre om den kan bruges til noget, ligesom forbedringer modtages med kyshånd.
Kommentarer
-
Jesper Louis Andersen
skriver:
Kig paa 'Automated password generator' - apg. Den er i de fleste distributioner.
-
Niels Kjøller Hansen
skriver:
Ja, den ser ud til at gøre præcis det jeg ledte efter. Men det var ganske sjovt at gøre et forsøg på at genopfinde den dybe tallerken.
Plus at jeg er virkelig dårlig til at læse c, så jeg har svært ved at lure præcis hvad apg laver.
-
Bottes UGG
skriver:
Votre article m'a donné beaucoup de reflexions. Allez-vous faire des folies sur une paire de bottes ugg cette saison ? Ces bottes sont très belles.