この記事では、総当たりで調べた時にパスワードがどのくらいの時間で解かれてしまうのかを調べるプログラムを作ったので紹介します。
パスワード総当たりプログラムについて
総当たりプログラムの考え方
今回は、とりあえず総当たりで調べるプログラムを作りたかったので、繰り返し処理を用いて各要素にa~zを追加しています。
例えば、[a,b,c]の配列があれば各要素の末尾に[a,b,c]を加えることで、[aa,ab,ac,ba,bb,bc,ca,cb,cc]というような配列を作っています。
ソースコード
以下が私の作ったコードです。
import time
import matplotlib.pyplot as plt
def sol_pass(password, preList):
list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
ans = []
if(preList == ''):
for j in(list):
if(j == password):
print('Success')
print(j)
return
ans.append(j)
sol_pass(password, ans)
else:
for i in(preList):
for j in(list):
if((i+j) == password):
print('Success')
print(i+j)
return
ans.append(i+j)
sol_pass(password, ans)
def main(password):
startTime = time.time()
sol_pass(password, '')
endTime = time.time()
print('実行時間:', endTime-startTime, '秒')
return endTime-startTime
if __name__ == '__main__':
num = []
x = []
num.append(main('p'))
num.append(main('pa'))
num.append(main('pas'))
num.append(main('pass'))
num.append(main('passw'))
num.append(main('passwo'))
# num.append(main('passwor'))
# num.append(main('password'))
for i in range(len(num)):
x.append(i)
plt.plot(x, num)
plt.show()
実行結果
表
パスワード | かかった時間 |
p | 0.001秒 |
pa | 0.0秒 |
pas | 0.006秒 |
pass | 0.11秒 |
passw | 2.645秒 |
passwo | 71.976秒 |
グラフ
今回は小文字英字のみで6文字までの結果を求めました。
7文字にした場合、現状ではメモリエラーが発生してしまうため6文字で止めています。
まとめ
今回やってみて分かったのは6文字程度の短いパスワードだとあっという間にパスワードがばれてしまうことと、文字数が増えればそれに応じてパスワードが判明するまでにかかる時間もかなり長くなるということです。
今回は小文字英字のみでやっていますが、ここに数字や大文字、記号を入れることでさらに安全性が高いパスワードになるものと考えられます。