有没有可读且易发音的Python密码生成器?

13 投票
5 回答
6879 浏览
提问于 2025-04-16 14:49

在Python中生成随机字符串其实很简单(就像Python的熵所示)。但是有没有一些Python项目可以生成既稍微容易发音又容易阅读的密码字符串呢?这里说的“容易阅读”是指不把数字零和字母O放在同一个字符串里等等。我并不在乎它的熵值有多高,只希望能比我自己随便选的要好一些。:)

5 个回答

3

你可以创建一个简单的马尔可夫文本生成器,然后用一堆常见的、容易发音的单词来训练它。

之前我为了好玩写了一个简单的生成器。下面就是它的代码:

#! /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
4

我非常喜欢这个xkcd密码生成器。它可以根据自己的需求进行很多自定义设置,而且可以通过pip安装。它的“首字母法”功能为用户生成的单词组合提供了一个很好的记忆提示。

23

如果你只是想找一些“比我自己想出来的更好”和“容易发音”的东西,那你可以用 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

撰写回答