🔑

[実践]Pythonでハッシュ関数を実装しよう!〜公式ドキュメントを参考に〜

2022/04/25に公開

はじめに

今回はPythonでハッシュ関数を実装していこうと思います!

ハッシュ関数」とは、暗号について学んでいるとよく出てくる、「入力したデータを一見適当に見える値にして返す」関数です。

ハッシュ関数については以下の記事にわかりやすくまとめているので、ぜひ参考にしてください!

https://chaldene.net/hash

Pythonのドキュメントを参考に実装を進めていきます。

Pythonに限らず、プログラミング関係のドキュメントは非常に読みづらいです。

参考までに以下のPythonのドキュメントを見てみてください。

https://docs.python.org/ja/3/library/hashlib.html

どうでしょうか?

読むのみ抵抗があるくらい細かいですよね?

なのでこの記事ではドキュメントの重要な部分を抜き出してわかりやすく解説していきます!

ハッシュ関数を実装してみたい

Pythonのドキュメント読んだけど実装までできなかった

このような人のお役に立てれば幸いです。

前置きは早々に早速みていきましょう!

hashlib

Pythonでハッシュ関数を実装するには「hashlib」というモジュールをインポートする必要があります。

Pythonファイルを作成して、一番上に以下のコードを貼り付けてください。

import hashlib

これでインポートできました!

hashlibの基本的な使い方

まずは「hashlib」関数の基本的な使い方からみていきましょう。

基本

word = "かるでね"
word2 = "cardene"

# sha256
sha256 = hashlib.sha256()

# updateするたびにたされていく
sha256.update(word.encode()) # かるでね
sha256.update(word2.encode()) # かるでねcardene

print(f"sha256に渡されたダイジェスト値を確認: {sha256.digest()}")
# sha256に渡されたダイジェスト値を確認: b'*u\xb7\xef\xe1\xcc\xd1\x00t\xbe\x9e\xc0E\xb8@g\xee\xd7\xb0\xa0\x02AG\x16WW\xb0\xf7\x1d\xa1Z\x9a'

1つ1つ確認していきます。

word = "かるでね"
word2 = "cardene"

まずはハッシュ関数に通す変数を2つ用意しています。

# sha256
sha256 = hashlib.sha256()

ここでは使用するハッシュアルゴリズムを指定しています。

今回は「sha256」というハッシュアルゴリズムを使用していきます。

# updateするたびにたされていく
sha256.update(word.encode()) # かるでね
sha256.update(word2.encode()) # かるでねcardene

ここでは文字列をバイト文字列に変換して先ほどのハッシュアルゴリズムに渡しています。

変数.encode()

このようにすることでバイト文字列に変換できます。

ハッシュ関数に通すにはバイト文字列に変換する必要があるので忘れないようにしましょう。

ちなみに以下のような書き方でもバイト文字列に変換できます。

b"文字列"

詳しく知りたい方は以下の本を読むか、自分で調べてみてください!

print(f"sha256に渡されたダイジェスト値を確認: {sha256.digest()}")

最後にハッシュ関数の出力を確認していきましょう。

digest()」とすると「ダイジェスト値」を出力してくれます。

ダイジェスト値 = ハッシュ関数により求められた値。

# sha256に渡されたダイジェスト値を確認: b'*u\xb7\xef\xe1\xcc\xd1\x00t\xbe\x9e\xc0E\xb8@g\xee\xd7\xb0\xa0\x02AG\x16WW\xb0\xf7\x1d\xa1Z\x9a'

訳わからないですね。

以下のようにすると読みやすくなります。

print(sha256.hexdigest())
# 2a75b7efe1ccd10074be9ec045b84067eed7b0a0024147165757b0f71da15a9a

読みやすくなったとはいえさっぱりわからない英数字が並んでいますね。

これがハッシュ値となります。

短く書く

コードが何行にも渡ってしまい少し長くなってしまいましたね。

実はもっと短く書く方法があるのでみていきましょう。

sha256_word = hashlib.sha256(word.encode()).hexdigest()

print(f"ハッシュ関数[sha256]に通した結果(16進形式文字列で表示): {sha256_word}")
# ハッシュ関数(sha256)に通した結果: 3eb903c1a5d61e64e5d9de548763c133db857bfeb4c6fa1ac4f046bf

たった1行で済んでいますね。

こちらの方が使い勝手が良さそうですよね。

続き

これより先は以下の記事にまとめています。

https://chaldene.net/hash-python

より詳しくハッシュ関数について学ぶことができるので、興味がある方はぜひ!
(もちろん無料です!)

Discussion