ハッシュ化したマイナンバーからもとのマイナンバーを復元する

なにやら、個人番号(マイナンバー)をユーザーに入力させ、不可逆な形で変換したものを本人認証のために使用しているサービスが炎上しているらしいという話を聞いた。

ハッシュ関数を使えば不可逆です、みたいな考え方であるが、法的な問題以前に、個人番号となりえる12桁の数字全てを総当たりで計算すれば、もとの個人番号を簡単に得ることができるのである。

そこで、Pythonで簡単なコードを書いて実証してみた。

まずは、個人番号をハッシュ値に変換するスクリプト(絶対個人番号を入力しないこと!)。

import hashlib, re
while True:
   myna=input('マイナンバーっぽい12桁の数字を入れてね:')
   if re.match('\d\d\d\d\d\d\d\d\d\d\d\d',myna):
       break
   print('12桁の数字じゃないみたいだよ。')
print(hashlib.sha256(myna.encode('utf-8')).hexdigest())

次に、ハッシュ値からもとの個人番号を得るスクリプト。

import hashlib,time
mynasha = input('マイナンバーっぽい12桁の数字のSHA256を入れてね:')
starttime=time.time()
for i in range(10**12):
   myna = f'{i:0>12}'
   if mynasha == hashlib.sha256(myna.encode('utf-8')).hexdigest():
       print(f'マイナンバーは {myna} だよね?{time.time()-starttime}秒くらいかかったよ。')
       exit()
print('見つからなかったよ')

12桁の数字が、000000000000だと一瞬で終わり、999999999999だともっとも時間がかかるわけである。手元のMacBook Pro (16-inch, 2019)で 000099999999 を試したところ、132秒ほどかかった。999999999999まで試すとして、1320000秒≒15.27日かかる計算になるだろうか。

ただハッシュ化しただけということはないだろうが、理論上不可能ではないということで。

いいなと思ったら応援しよう!