LoginSignup
44
20

More than 1 year has passed since last update.

「英数字を含めた13桁のパスワードなので解除は難しい」のか【検証してみた】

Last updated at Posted at 2022-06-24

初めに

2022年 6月23日、兵庫県尼崎市でこのようなニュースが流れました。

個人情報を紛失してしまった点についても落ち度はありますが、この会見でパスワードの桁数利用されている文字種を公開してしまったことで世間を騒がせています。
(そもそも機密情報を簡単に持ち出せる仕組みがNGですが...)
今回は「13桁とわかっているパスワードはどのくらいの速さで解読されてしまうのか」を検証して、ITリテラシーの啓蒙活動をしたいと思います。

検証環境

パスワード付きのUSBが用意できなかったので、解読速度の低いPC(低スペックのPC)で検証しました。

  • 端末:ラズパイ4B
  • CPU:4コア(1.5GHz)
  • メモリ:4GB

検証結果

Pythonスクリプトを作成し、実行してみました。
また今回は大文字を含む英数字(0~9, a~z, A~Z)の総当たり(ブルートフォースアタック)で検証を行います。

$ sudo python3 pass_unlock.py
0000000000000
0000000000001
0000000000002
....

~数分後~

0000000050XV4
0000000050XV5
0000000050XV6
....

...全然解析が終わりません。
少しずるいですが、1分経過したタイミングでの解析数をもとに計算してみます。(鉄は熱い内に..ってやつです。)

計測した結果、1分時点の結果は以下でした。

0000000004JGK

つまり1分間あたり「約140,000」の計算量になります。

仮にパスワードが「amagasaki2022」だった場合、「約40,005,707,853,733,957,781,094 通り目」ですので、ラズパイで解析にかかる想定時間は「約9億年」ですね!

9億年!?
数分で終わるかと思ったのですが、思ったより時間がかるんですね。

※9億年かかるからって、もちろん安全ってわけではないです。今回のプログラムは「確認のために毎回コンソール出力する」かつ「並列処理」も行っておりません。
プロプラムの最適化やマシンを変更したら、何10倍何100倍も計算結果が変わると思います。

ソースコード全文はこちら!
pass_unlock.py
import itertools
import sys
import random
import string
import time

# 時間計測開始
time_start = time.perf_counter()


# パスワード生成関数
def get_random_password(length):
    letters_and_digits = string.ascii_letters + string.digits
    result = ''.join((random.choice(letters_and_digits) for i in range(length)))
    print('パスワード: '+ result)
    return result


#ランダム生成された13桁のパスワード
password_answer = get_random_password(13)

#パスワードの確認に使用する文字
characters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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', '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']

#パスワードの桁数の設定
count = 13

#総当たり開始
for password in itertools.product(characters,repeat=count):
    password = ''.join( password )
    print(password)
    if password==password_answer:
        # 時間計測終了
        time_end = time.perf_counter()
        time_result = time_end- time_start
        print('パスワードの解析に「' + str(time_result) + '秒」かかりました。')
        #処理終了
        sys.exit()

最後に

IPAでは今回のパスワード件以外にも、様々な情報セキュリティ対策が記載されたガイドラインがあります。
今回の件を機に、エンジニアだけでなくITを活用する「ユーザー側のリテラシー」が向上するきっかけになればと思います。

USB見つかったんですね!!
よかった!!

44
20
13

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
20