Любые генераторы паролей Python, которые читаемы и произносимы? - PullRequest
11 голосов
/ 31 марта 2011

Достаточно просто создать случайную строку в Python (например, Энтропия Python показывает). Но есть ли какие-нибудь проекты Python, которые будут генерировать строки пароля, которые несколько произносимы и читаемы? Под читабельностью я подразумеваю не помещать и нули, и О в одну и ту же строку и т. Д. Мне все равно, если она имеет энтропию максимум , просто что-то лучше, чем то, что я могу выбрать. :)

Ответы [ 6 ]

18 голосов
/ 31 марта 2011

Если вы действительно ищете что-то "лучше, чем я могу придумать" и "произносимый", тогда, возможно, просто используйте random.sample(), чтобы вытащить из списка согласные-гласные-согласные псевдослоги:

import string
import itertools
import random

initial_consonants = (set(string.ascii_lowercase) - set('aeiou')
                      # remove those easily confused with others
                      - set('qxc')
                      # add some crunchy clusters
                      | set(['bl', 'br', 'cl', 'cr', 'dr', 'fl',
                             'fr', 'gl', 'gr', 'pl', 'pr', 'sk',
                             'sl', 'sm', 'sn', 'sp', 'st', 'str',
                             'sw', 'tr'])
                      )

final_consonants = (set(string.ascii_lowercase) - set('aeiou')
                    # confusable
                    - set('qxcsj')
                    # crunchy clusters
                    | set(['ct', 'ft', 'mp', 'nd', 'ng', 'nk', 'nt',
                           'pt', 'sk', 'sp', 'ss', 'st'])
                    )

vowels = 'aeiou' # we'll keep this simple

# each syllable is consonant-vowel-consonant "pronounceable"
syllables = map(''.join, itertools.product(initial_consonants, 
                                           vowels, 
                                           final_consonants))

# you could trow in number combinations, maybe capitalized versions... 

def gibberish(wordcount, wordlist=syllables):
    return ' '.join(random.sample(wordlist, wordcount))

Тогда вы просто выбираете достаточно большое количество "слов":

>>> len(syllables)
5320
>>> gibberish(4)
'nong fromp glosk zunt'
>>> gibberish(5)
'samp nuv fog blew grig'
>>> gibberish(10)
'strot fray hag sting skask stim grun prug spaf mond'

Моя статистика немного нечеткая, но этого может быть достаточно для не-АНБ цели. Обратите внимание, что random.sample() работает без замены. Я также должен отметить, что если злоумышленник узнает, что вы используете этот метод, он будет уязвим для атаки по словарю. Щепотка соли поможет с этим.

Обновление : Для тех, кто заинтересован, доступна обновленная и разветвленная версия по адресу https://github.com/greghaskins/gibberish.

3 голосов
/ 31 марта 2011

Вы можете создать простой марковский текстовый генератор и затем обучить его списку общих / произносимых слов.

Некоторое время назад я написал простой генератор для развлечения. Вот оно:

#! /usr/bin/python

from cStringIO import StringIO
from sys import argv
import random

USAGE="usage: ./markov.py input_file"
END_TAG='<end>'
SEPARATOR='\n'

def append(model,token, target):
    if token not in model:
        model[token]=[]
    model[token].append(target)

def add_to_model(model,word, end_tag=END_TAG):
    append(model,'',word[:2])
    for i in xrange(len(word)-2):
        append(model, word[i:i+2],word[i+2])
    append(model,word[-2:],end_tag)

def generate(model, end_tag=END_TAG):
    ret=''
    while True:
        cur=random.choice(model[ret[-2:]])
        if cur==end_tag:
            break
        else:
            ret+=cur
    return ret

if __name__=='__main__':
    if len(argv)>1:
        data=file(argv[1],'r').read().split(SEPARATOR)
        model={}
        for word in data:
            add_to_model(model,word)
        print generate(model)
    else:
        print USAGE
2 голосов
/ 30 сентября 2015

Я большой поклонник генератора паролей xkcd .Очень настраиваемый, устанавливаемый в пипсах, и функция «acrostic» предоставляет хороший способ дать пользователям подсказку памяти для их сгенерированного набора слов.

2 голосов
/ 31 марта 2011

Мне нравится версия Саймона Сапина: http://exyr.org/2011/random-pronounceable-passwords/

1 голос
/ 20 апреля 2013

Я думаю, что проект, над которым я работал, применим. Я узнал модель Маркова из более чем 14 миллионов паролей (из дампа паролей RockYou.com) и таким образом создал искусственные пароли. Сообщение в блоге (и сопровождающий код): здесь . Некоторые примеры искусственных паролей:

  • tablester111
  • genny0
  • mikk92
  • lvingree10633769
  • bubuzzarap71666
  • isamistilloro13020
  • dunl0velyiristalecasia4799
0 голосов
/ 28 апреля 2016

Gibberish

import string
import random

__all__ = ('generate_word', 'generate_words')

initial_consonants = list(set(string.ascii_lowercase) - set('aeiou')
                      # remove those easily confused with others
                      - set('qxc')
                      # add some crunchy clusters
                      | set(['bl', 'br', 'cl', 'cr', 'dr', 'fl',
                             'fr', 'gl', 'gr', 'pl', 'pr', 'sk',
                             'sl', 'sm', 'sn', 'sp', 'st', 'str',
                             'sw', 'tr', 'ch', 'sh'])
                      )

final_consonants = list(set(string.ascii_lowercase) - set('aeiou')
                    # remove the confusables
                    - set('qxcsj')
                    # crunchy clusters
                    | set(['ct', 'ft', 'mp', 'nd', 'ng', 'nk', 'nt',
                           'pt', 'sk', 'sp', 'ss', 'st', 'ch', 'sh'])
                    )

vowels = 'aeiou'


def generate_word():
    """Returns a random consonant-vowel-consonant pseudo-word."""
    return ''.join(random.choice(s) for s in (initial_consonants,
                                              vowels,
                                              final_consonants))


def generate_words(wordcount):
    """Returns a list of ``wordcount`` pseudo-words."""
    return [generate_word() for _ in range(wordcount)]


def console_main():
    import sys
    try:
        wordcount = int(sys.argv[1])
    except (IndexError, ValueError):
        wordcount = 1
    print(' '.join(generate_words(wordcount)))


if __name__ == '__main__':
    console_main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...