2017-09-17 19 views
-1

私はPythonでランダムなパスワードジェネレータを作っています。ユーザとパスワードの数からテンプレートを取り出し、そのテンプレートに従うランダムなパスワードを作成します。このコードを繰り返しにくくするにはどうすればよいですか?ランダムパスワードジェネレータ

今のところうまくいきますが、基本的に同じことをする4つのif文がありますが、反復性を低くする方法がわかりません。ここで

は私が持っているものだ -

#!/usr/bin/python 

import random, sys, string 

digit = string.digits 
lower = string.lowercase 
upper = string.uppercase 
symbol = string.punctuation 


if len(sys.argv) != 3: 
    print 'error, not enough arguments, need a template and the number of passwords' 
    print 'ex: ./passgen Template1! 100' 

else: 
    passlist =[] 
    template = sys.argv[1] 

    for j in range(0,int(sys.argv[2])): 
     password = '' 
     charSet = '' 
     for i in template: #runs through every character in the template provided by the user and checks what each character is and adds the appropriate string constants to the character set 
      if i.islower(): 
       charSet += lower 
       password += charSet[random.randint(0,len(charSet)-1)] 
       charSet = '' 
      elif i.isupper(): 
       charSet += upper 
       password += charSet[random.randint(0,len(charSet)-1)] 
       charSet = '' 
      elif i.isdigit(): 
       charSet += digit 
       password += charSet[random.randint(0,len(charSet)-1)] 
       charSet = '' 
      elif i in string.punctuation: 
       charSet += symbol 
       password += charSet[random.randint(0,len(charSet)-1)] 
       charSet = ''  

     passlist.append(password) 

print passlist 

私は文は、それが冗長と思われる場合、私はすべてのために、このアクション

  password += charSet[random.randint(0,len(charSet)-1)] 
      charSet = '' 

をやっていることを好きではないが、私は知りませんそれを行うための他の方法。

例入力と出力 -

./passgen.py Password1! 10 
['Hozxmtll1*', 'Grprwixi2,', 'Fwqarvcu5.', 'Ikfywvth6_', 'Sndcnecv3&', 'Pkeerxpm0(', '[email protected]', 'Ibftiisa8_', "Xiljjsss8'", 'Ukfupsri6]'] 
+0

パスワードを生成する方法を正確に説明できますか?つまり、入力とは何か、期待される出力は何ですか?うまくいけば、あなたも実際のパスワードを生成するためにこれを使用していないでしょう。 – pvg

+0

@pvg私はペンテストを学んでいるので、最終目標は辞書攻撃をするプログラムを作ることです。メインポストに入力と出力を追加例 – Muffinator

+0

パスワードを生成する目的のプロセスを記述する必要があります。 – pvg

答えて

0

私はiが常に与えられた条件(、最後elifブロックの下else:continueを入れていない場合)のいずれかと一致していることを前提としています。

for i in template: #runs through every character in the template provided by the user and checks what each character is and adds the appropriate string constants to the character set 
    if i.islower(): 
     charSet += lower 
    elif i.isupper(): 
     charSet += upper 
    elif i.isdigit(): 
     charSet += digit 
    elif i in string.punctuation: 
     charSet += symbol 

    password += charSet[random.randint(0,len(charSet)-1)] 
    charSet = '' 

シンプルなものです。 BTW:擬似乱数でパスワードを作成することは非常に安全です。

P.S:それは私のために魔法のように動作:

$ python2 /tmp/pytest.py "sfid!" 5 
['eqeu-', 'uztv,', "qxdg'", 'mahe+', 'wvsn['] 
+0

これは前に行ったことですが、正しく動作しません。それは私がそれを与えるテンプレートと一致しない、それはちょうどテンプレートの長さにランダムな文字列を生成するようだ。私はこれを最終的に辞書攻撃をするプログラムにするつもりです。私はこれらのパスワードを使用していません。 – Muffinator

+0

論理の結果で、分離された状態にかかわらず実行される2行のコードは、 if-elseブロックのしたがって、これらの2つのプログラムは同じように動作する必要があります。 –

+0

それは私のためにうまくいくようです、更新された答えを見てください。 –

0

あなたはリストにあなたの文字セットを保存してあれば、一致する項目を選択することができます。

charsets = [string.digits, string.lowercase, string.uppercase, string.punctuation] 
passlist =[] 
template = sys.argv[1] 

for j in range(0, int(sys.argv[2])): 
    password = '' 
    for i in template: 
     charset = [cs for cs in charsets if i in cs] 
     if charset: 
      charset = charset[0] 
      password += charset[random.randint(0, len(charset)-1)] 
    passlist.append(password) 

文字がcharsetsで任意の項目の一部ではない場合、ループがpasswordを変更せずに次の文字に移動していますが、それは一定の長さを持たせたい場合は、代わりにデフォルト値を設定することができます。

また、ランダムな文字列ジェネレータを小さな関数でラップする方が良いと思います。

def pass_gen(template): 
    password = '' 
    charsets = [string.digits, string.lowercase, string.uppercase, string.punctuation] 
    for i in template: 
     charset = [cs for cs in charsets if i in cs] 
     if charset: 
      charset = charset[0] 
      password += charset[random.randint(0, len(charset)-1)] 
    return password 
関連する問題