Это достаточно просто, чтобы создать случайную строку в Python (например, энтропия Python). Но есть ли там проекты Python, которые будут генерировать строки паролей, которые могут быть как произносимыми, так и читабельными? По понятным, я имею в виду не помещать как нули, так и O в одну строку и т.д. Меня не волнует, если он получит максимальную энтропию, просто что-то лучше, чем я, вероятно, выберу.:)
Любые генераторы паролей Python, которые можно читать и произносить?
Ответ 1
Если вы действительно ищете что-то "лучше, чем я могу составить" и
"произносится", то, возможно, просто используйте 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'
Моя статистика немного нечеткая, но этого может быть достаточно для не-NSA
цели. Обратите внимание, что random.sample()
работает без замены. Я должен также указать, что если злонамеренная сторона знала, что вы используете этот метод, она будет уязвима для атаки на словарь. Этот вопрос поможет salt.
Обновление: для тех, кого интересует обновленная версия, доступна в https://github.com/greghaskins/gibberish.
Ответ 2
Вы можете создать простой текстовый генератор Markov, а затем подготовить его со списком обычных/произносимых слов.
Некоторое время назад я написал простой генератор для удовольствия. Вот он:
#! /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
Ответ 3
Мне нравится версия Саймона Сапина: http://exyr.org/2011/random-pronounceable-passwords/
Ответ 4
Я большой поклонник генератора паролей xkcd. Очень настраиваемый, устанавливаемый на диск, а также функция "acrostic" обеспечивает отличный способ дать пользователям ключ памяти для их сгенерированного набора слов.
Ответ 5
Я предполагаю, что проект, над которым я работал, применим. Я изучил Марковскую модель из более чем 14 миллионов паролей (с дампа паролей RockYou.com) и таким образом создал искусственные пароли. Сообщение в блоге (и сопроводительный код) здесь. Некоторые выборочные искусственные пароли:
- tablester111
- genny0
- mikk92
- lvingree10633769
- bubuzzarap71666
- isamistilloro13020
- dunl0velyiristalecasia4799
Ответ 6
Тарабарщина
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()