2016-04-07 7 views
0

高いエントロピーで新しい(忘れた)ユーザーパスワードを生成するための高速でpythonicな方法を探します。これを達成するために、このコードでは "chars = []"という名前の64文字のリストを使用します。Pythonのパスワード生成:リスト内の一意の値を数え、倍精度を削除して、PW Genの新しい一意の値で置き換えます。

問題は、パスワードにcharが複数回限り、私は "セット"とリストから繰り返しアイテムを削除することができますがわかった。しかし、どのように私はこのコードで新しいアイテムを追加できますか?たぶんこれは、それを生成するときに一気に行うことができますか?

私はプログラミングにとって非常に新しいことを言う必要があります。多分私のコードは悪いですが、私はランダムとurandomについて多くのことを読んでいました。私はos.urandomを使いたいと確信しています。コードをより良くするための提案、スニペット、ヒントは非常に高く評価されます。

chars = [] 
z = map(ord, os.urandom(12)) 
passw = [] 

for i in z: 
    y = int(i) % 64 # modulo each item from urandom to map it to the list 
    passw.append(chars[y]) 

print ''.join(passw) 

ありがとうございました!

+3

に達しながら?それはそれらをよりランダムにするでしょう –

+0

@ Farhan.Kこれを指摘してくれてありがとう!私はそうではないと考えていました。私はエントロピーについてもっと読むべきだと思う。 – Horst23

答えて

2

ループパスワードで重複した文字を削除したいか、なぜあなたは好みの長さ

passw = '' 

while len(passw) <= 12: 
    char = chars[ord(os.urandom(1)) % 64] 
    if char not in passw: 
     passw += char 
+0

これにより、より大きなパスワードを作成しようとすると、多くの重大なループが発生します。 –

+0

あなたは正しいです。私はいくつかの不要なループで生きることができると仮定している。 – Francesco

+0

これは、パスワードの長さが文字の長さに近い場合に変わる。そのような場合は、あなたのソリューションはより良いです。しかし、パスワードの長さが12の場合、平均して100k回繰り返すと2.4の不要なループが発生します – Francesco

2

利用可能な文字のリストから各charを取り出した後に、それらを削除します。

import random 
import string 

def mkpwd(l=12): 
    # Start with all available characters. 
    chars = [c for c in string.ascii_letters + string.digits] 
    # Make sure we don't take more characters than are available. 
    l = min(l, len(chars)) 
    # Collect the picked characters. 
    cs = [] 
    for _ in range(l): 
     # Take a random character from the current list of characters. 
     i = random.randint(0, len(chars) - 1) 
     c = chars[i] 
     cs.append(c) 
     # Remove the taken character from the list. 
     # This ensures that every character is only taken once. 
     del chars[i] 
    return("".join(cs)) 

print(mkpwd()) 
print(mkpwd(24)) 
print(mkpwd(62)) 
print(mkpwd(1024)) 

出力(例):

0GEmMWXYbqeQ 
eL83iPTMNatK54Efr2ZhdqWn 
fIBj2DTw6P1grGJKZONdv9U8CaWet7l4n5QiFczRhqmxSALHMY0Vskp3oEXbuy 
v6Fpt3yrMcGwENTjXODk5W2bZYeL8AqHQ0lJ9oadfIsg7mhBzU14RVnKiuxSPC 
+0

'SystemRandom()'を使って文字のインデックスを選択することを検討してください。 次のようなものがあります: 'chars = [c for string.ascii_letters + string.digits]; pwIndexes = [範囲(l)のiのための[chooseRandomChars.randrange(len(chars))] –

+0

良い解決策。ユーザーがもっと便利になるためには、urandomを使うことができます。なぜなら、彼はos.urandom *を使いたいと確信しているからです。より洗練されたコードのために 'cs'のリストの代わりに文字列を使うこともできます – Francesco

+0

はい、ランダム性を改善することができます。このスニペットの主な焦点は、一度だけ取る方法を示すことです。 –

関連する問題