• 2018-06-19
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/06/python-hashlib.html

Pythonでハッシュダイジェスト作成 hashlibまとめ

Pythonには標準でhashlibというライブラリを備えているので、簡単に文字列からハッシュ値を出力することが出来ます。

パスワードの保管などに便利です。

ハッシュ関数対応表

ライブラリの中身を覗いてみると、多数のハッシュ関数に標準対応しているようです。
一覧表にまとめてみました。

関数 長さ
md5 128ビット
sha1 160ビット
sha224 224ビット
sha256 256ビット
sha384 384ビット
sha512 512ビット
blake2b 512ビット
blake2s 256ビット
sha3_224 224ビット
sha3_256 256ビット
sha3_384 384ビット
sha3_512 512ビット
shake_128 可変
shake_256 可変

サンプルソース

ハッシュ化する文字列をエンコードした上で、hexdigest関数を使用することでハッシュ文字列を生成できます。

サンプルソース

import hashlib

# ハッシュ化する文字列(パスワード)など
password = 'heibon'

print(hashlib.md5(password.encode("UTF-8")).hexdigest())
print(hashlib.sha1(password.encode("UTF-8")).hexdigest())
print(hashlib.sha224(password.encode("UTF-8")).hexdigest())
print(hashlib.sha256(password.encode("UTF-8")).hexdigest())
print(hashlib.sha384(password.encode("UTF-8")).hexdigest())
print(hashlib.sha512(password.encode("UTF-8")).hexdigest())
print(hashlib.blake2b(password.encode("UTF-8")).hexdigest())
print(hashlib.blake2s(password.encode("UTF-8")).hexdigest())
print(hashlib.sha3_224(password.encode("UTF-8")).hexdigest())
print(hashlib.sha3_256(password.encode("UTF-8")).hexdigest())
print(hashlib.sha3_384(password.encode("UTF-8")).hexdigest())
print(hashlib.sha3_512(password.encode("UTF-8")).hexdigest())
print(hashlib.shake_128(password.encode("UTF-8")).hexdigest(64))
print(hashlib.shake_256(password.encode("UTF-8")).hexdigest(64))

結果

13cc212fd91c0908fee0dc30bcddcde5
472399b45c283b5c9fadc6611190450c2b4fe542
29372008ff6d3074cf83304e89a61d508c5aa8c14513532b801d4782
a7692f249695c18a980ca1f215e506121ebc546fc75f434e973b5d0a049d30d7
9af9d1499e38426226d77a8c973960da1f907c83ff0df5a91027548e0305489d1fd8503c7a26678a91c5463f3a5a9221
b2260bb052c8b8433c161b6b6b9b2c793c653d3dc75ad51590bae49bfb2a3a0ad36cfe6e89b3303306ac09c54688a83e40906d2bef3f81ec000ff038a7106867
38cc285c6b565c72c73ca14c090fdc29ebdec10e7c81a88ec9177879c537bd27126bb62b15e217c72de09294a27aeda42577688f242e2f86ccc6886d5d07e26f
189fe5c91a41778ff0bc75a70edf70cba6ecb0a11dc161fd7a967d6a6a9fc8bf
4d4d27d9d82e2c76eeb2282a4c38dbe0449264caacf88054c9291cff
60a7e873e5d3e0f53492da6a675a52f6fe61780ef556340bde8005c07b67e1a4
ba9ebc681440091dbb3669066bd416b71cb6acb0391ba603eb40b9690e181e7940fd52c3d0754b1ca5a0739b1906e230
bfe15b274f21cdd1670393059281e26356388dac7f4a12a01fb7dd252b97eef9edadf5fefe98d947a94c602831a866c8b338cb6e92b5c6acda5bab9bb61380de
59d8fee147eceddb70a9bb5e2bd3de8cc03b0df2b4968b4e7d3ef4311a0fd34f98e88874099905e719c48f9962962162f663b631de197e221a95aa75d52e1044
3dacacb4b763cc7ab377356e27051963ff4793e40f6f171ed5def09a3b5239f6f4cc55a2b30c1cadffaf8b64381c171e83e1b0249568759ffeb1f45c93f297cb

秘密鍵付与

ただし、上記のようにパスワード本体をそのままハッシュ化すると、使っている関数を推測して簡単に破られてしまいます。

そこで、ハッシュ化する際は秘密鍵をくっつける必要があります。
秘密鍵をくっつければ、それが漏えいしない限り破られることはありません。

サンプルソース(秘密鍵追加版)

import hashlib

# ハッシュ化する文字列(パスワード)など
password = 'heibon'

# 秘密鍵
secret_key = 'uzu123'

print(hashlib.md5((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha1((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha224((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha256((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha384((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha512((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.blake2b((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.blake2s((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha3_224((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha3_256((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha3_384((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.sha3_512((password + secret_key).encode("UTF-8")).hexdigest())
print(hashlib.shake_128((password + secret_key).encode("UTF-8")).hexdigest(64))
print(hashlib.shake_256((password + secret_key).encode("UTF-8")).hexdigest(64))

結果(秘密鍵追加版)

1d87cb21834f5d7f024f35e2b16b054d
4c8fdd00913d09a4dfbe5e137abcc793d5a234ba
4dce6077ae7cb6b4173660108032da9867f90adeae6c9ea17851e86c
4b0e1a9ee64f16534b81891b9c72f64df7306077fe7724e2c2f550995ddee2b2
29ae3b5d789820ba67430af1ef6b34c9ed66864d4c9ba485d35e0d0936c8345f240ec262d9678b9deeab30ac067597de
57b3e7e2c9244793cd813116039984eb3db9cb2229da2cfaa159841b097aa355d6274376c1ce412e6d6723ece8d26d71208a7c5f407f044e2104ae9d6286479c
0c66ed9fc1a6d4bbf5d14a2eeb904d9d336c60f689cc4b26f9cd2749b814424e3c378215254b2fac2356de137f900652d7d3f1ca4c42278370a4b02f59add03f
188d4811a4c1453686b7b3575280877216ef81c398aa4a6210bd5ebab59c88ce
b9c32a8ed280938a5e14cc61e86c9f6a6bf9878f60f4cd9de4daa23c
6258efd933668bd15f673601f75f17bc53de7be79ef64bf7aaeb5aca4d806f32
5f5d00a55183d54b7bba21cac55e5e8ecd9bb652dbd86434fcbffa0d90c1a10902c8533464df17a5a9b8dcc3b8872fe2
a8dccae6c2fb2f92fa127f9394c49e37a2199d087dead03b120f3084ef5dac527bc0d01b5fa91dd3beb1a4a928d8291f6f10f76628be88c2a77b982115d0da00
ee946bfb3a892ad0c4cb66fd153be13fde5819b9736ec89dacd1f3996be3a991196c4ce64267768538b323fa2dc7b04945757264304f45fce4048276b8c66aeb
2f87e3066ab8eeae9b353d46db274fe330da01f18e46ef12451fc7ab9b9c92d701abc210e7a16975d885526e0e4f5679d41411839ef8de957bdd6b815127e8ce

これでひとまずOKと言いたいところですが、実はコレでもダメで……。

HMAC

早い話、hashlibを使っている時点でもうダメで、hmacを使わなければならないそうです。
hmacの紹介は以下にありますので、詳しくはこちらをご確認ください。


0 件のコメント:

コメントを投稿

お気軽にコメント下さい。