はじめに
今回は、Pythonでのハッシュ化を実装しながらハッシュ化と暗号化の違いについて理解していこうと思います。
ハッシュ化と暗号化の違い
ハッシュ化と暗号化の違いを簡単に説明すると「データを元に戻すことができるかできないか」です。
ハッシュ化は、特定の計算方法に基づいてデータを不規則な文字列に変換する処理のことで、同じ元データからは同じ値が得られるのが特徴です。
一方の暗号化は、データを第三者に見られても簡単に解読されないような状態にしておくことをいい、正しい鍵を用いることで元のデータを復号することができます。
Pythonでハッシュ化してみる
ここからは実際に手を動かして実践してみましょう。
Pythonでハッシュ化を実装するには標準ライブラリのhashlibを使います。hashlibではMD5、SHA1、SHA224、SHA256、SHA384、SHA512のアルゴリズムでハッシュ値を生成可能です。
ソースコード
それぞれのハッシュ関数の引数として文字列をエンコードした値を渡しています。
得られたハッシュ値を最終的にhexdigest()で16進数表記に変換しています。
import hashlib # 元のデータ word = "HelloWorld123" # MD5 h_md5 = hashlib.md5(word.encode()).hexdigest() print(f'MD5=> {h_md5}') # sha-1 h_sha1 = hashlib.sha1(word.encode()).hexdigest() print(f'sha1=> {h_sha1}') # sha-224 h_sha224 = hashlib.sha224(word.encode()).hexdigest() print(f'sha224=> {h_sha224}') # sha-256 h_sha256 = hashlib.sha256(word.encode()).hexdigest() print(f'sha256=> {h_sha256}') # sha-384 h_sha384 = hashlib.sha384(word.encode()).hexdigest() print(f'sha384=> {h_sha384}') # sha-512 h_sha512 = hashlib.sha512(word.encode()).hexdigest() print(f'sha512=> {h_sha512}')
出力結果
#出力結果 #MD5=> 624825620c7cdd818e697366727aa594 #sha1=> d7b29e5d98bc080b3c51393e926184851ead31e2 #sha224=> f91b8c454d019cb6a454c666e63ea6807e50e286938108f6db9d93fb #sha256=> ab31c8867f74940f883a49bea60432dd538a2a471ca99998737d5ded1d003902 #sha384=> 0662cf9a692e971136d6b4c8590d3708b0f3e30baeac4f99c9283139fb51b4970d462e67e2c3dcb113c3e216d0e03b16 #sha512=> cb3cfdf4e432c5923da3985f217dbc048e9634ad5205f55c945e458674b39cefa6bbc45c9aa451a15b78c4ddf904ce7e268f735990e1b320292e655dc6f12f88
まとめ
Pythonには、ハッシュ関数を提供する標準のhashlibライブラリがあり、簡単にハッシュ値を求めることができました。
実際にパスワード認証の一致確認などにはSHA-256がよく使われています。
※MD5は脆弱性があるため非推奨とされています。
私たちが日常生活でパスワードを入力している裏ではハッシュ関数が活躍しているんだな〜
今回はハッシュ関数の基本的な考え方について解説しました!