ハッシュ化したマイナンバーからもとのマイナンバーを復元する
なにやら、個人番号(マイナンバー)をユーザーに入力させ、不可逆な形で変換したものを本人認証のために使用しているサービスが炎上しているらしいという話を聞いた。
ハッシュ関数を使えば不可逆です、みたいな考え方であるが、法的な問題以前に、個人番号となりえる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日かかる計算になるだろうか。
ただハッシュ化しただけということはないだろうが、理論上不可能ではないということで。