<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hashlibPython Tech</title>
	<atom:link href="https://tech.nkhn37.net/category/python/python-libraries/hashlib/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Wed, 03 Dec 2025 21:14:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>hashlibPython Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】hashlibによるハッシュ化</title>
		<link>https://tech.nkhn37.net/python-hashlib-basic/</link>
					<comments>https://tech.nkhn37.net/python-hashlib-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 18 Mar 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[hashlib]]></category>
		<category><![CDATA[file_digest]]></category>
		<category><![CDATA[pdkbf2_hmac]]></category>
		<category><![CDATA[Salt]]></category>
		<category><![CDATA[SHA-256]]></category>
		<category><![CDATA[Streching]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[ストレッチング]]></category>
		<category><![CDATA[ソルト]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=1308</guid>

					<description><![CDATA[Python でデータをハッシュ化するための hashlib モジュールについて解説します。 ハッシュ化 ハッシュ関数（一方向関数） パスワードなどのデータを解読できないように変換するによく使われる関数がハッシュ関数です [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python でデータをハッシュ化するための <span class="jinr-d--text-color d--marker1 d--bold"><code>hashlib</code></span> モジュールについて解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="ハッシュ化">ハッシュ化</h2>



<h3 class="wp-block-heading jinr-heading d--bold" id="ハッシュ関数-一方向関数">ハッシュ関数（一方向関数）</h3>



<p class="wp-block-paragraph">パスワードなどのデータを解読できないように変換するによく使われる関数が<span class="jinr-d--text-color d--marker1 d--bold">ハッシュ関数</span>です。ハッシュ関数は、任意の長さのデータを通すと特定の長さのデータ（ハッシュ値）に変換します。</p>



<p class="wp-block-paragraph">ハッシュ関数の特徴は、ハッシュ値を生成するのは簡単である一方、ハッシュ値から元のデータを復元することが非常に困難である点です。このような性質からハッシュ関数は、<span class="jinr-d--text-color d--marker1 d--bold">一方向関数</span>と呼ばれます。</p>



<p class="wp-block-paragraph">ハッシュ関数で代表的で一般的によく使用される SHA-256 は、長さが 256 ビットのハッシュ値に変換されます。暗号資産で有名なビットコインのハッシュ値計算でも SHA-256 が使用されています。</p>



<p class="wp-block-paragraph">この記事では、Python でハッシュ化するためのモジュールである <span class="jinr-d--text-color d--marker1 d--bold"><code>hashlib</code></span> について紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="暗号化との違い">ハッシュ化と暗号化の違い</h3>



<p class="wp-block-paragraph">ハッシュ化の他に暗号化という技術もあります。ハッシュ関数は、説明したように元に戻すことが非常に困難である一方向関数です。</p>



<p class="wp-block-paragraph">暗号化は、鍵となる情報を用いることでもとのデータに戻すための復号化ができます。ハッシュ化と暗号化の違いは「<span class="jinr-d--text-color d--marker1 d--bold">データに戻すことができるかできないか</span>」です。</p>



<p class="wp-block-paragraph">ハッシュが使われる代表的な例がパスワード保管です。システムのデータベースに、パスワードをハッシュ化した値を保存します。パスワード認証では、入力値にハッシュ関数を通して、データベースのハッシュ値の一致を確認して認証します。</p>



<p class="wp-block-paragraph">このようにしておくことで、クラッカーが悪意を持ってデータベースからパスワードを盗んでも元の文字列を復元することはできないため、システムの認証を通過することはできません。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">Python での暗号化・復号化については「<a href="https://tech.nkhn37.net/python-pcryptodome-basic/" target="_blank" rel="noreferrer noopener">PyCryptodomeによる暗号化・復号化</a>」を参考にしてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold" id="hashlibによるハッシュ化"><code>hashlib</code> によるハッシュ化</h2>



<p class="wp-block-paragraph">Python ではハッシュ化のためのモジュールとして <span class="jinr-d--text-color d--marker1 d--bold"><code>hashlib</code></span> が提供されています。以降では、簡単な例を使ってハッシュ化の方法を説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>hashlib</code> で提供されているアルゴリズム</h3>



<p class="wp-block-paragraph"><code>hashlib</code> では、複数のハッシュ化アルゴリズムが提供されています。対応可能なハッシュについては以下のように <span class="jinr-d--text-color d--marker1 d--bold"><code>algorithms_guaranteed</code></span> で確認することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import hashlib

print(hashlib.algorithms_guaranteed)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
{'sha1', 'blake2s', 'shake_128', 'md5', 'shake_256', 'sha3_384', 'sha256', 'sha224', 'sha512', 'sha3_224', 'blake2b', 'sha384', 'sha3_512', 'sha3_256'}</pre>



<p class="wp-block-paragraph"><code>hashlib</code> では上記のような多くのハッシュ化アルゴリズムが提供されています。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>hashlib</code> を用いたハッシュ化の方法</h3>



<p class="wp-block-paragraph">以降では、一般的によく使用される <span class="jinr-d--text-color d--marker1 d--bold">SHA-256</span> でのハッシュ化を例に <code>hashlib</code> の使い方を説明します。SHA-256 を例に使い方を記載しますが、SHA-256 以外のアルゴリズムを使いたい場合は、関数名や引数に指定する文字列を変更するだけでアルゴリズムの変更が可能です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な使い方</h4>



<p class="wp-block-paragraph"><code>hashlib</code> で SHA-256 でハッシュ化する場合には、SHA-256 に対応する <span class="jinr-d--text-color d--marker1 d--bold"><code>sha256</code></span> を使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import hashlib


def main():
    password = "P@ssw0rd"
    print(password)

    # SHA-256でハッシュ化
    digest = hashlib.sha256(password.encode("utf-8")).hexdigest()
    print(digest)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
P@ssw0rd
b03ddf3ca2e714a6548e7495e2a03f5e824eaac9837cd7f159c67b90fb4b7342</pre>



<p class="wp-block-paragraph">引数としては、上記のようにハッシュ化文字列をエンコードした値を渡します。上記では返却値に <code>hexdigest()</code> を適用して16進数表記のハッシュ値にしています。</p>



<p class="wp-block-paragraph">例えば、SHA-512 を使いたい場合には、<code>sha256</code> の部分を <span class="jinr-d--text-color d--marker1 d--bold"><code>sha512</code></span> とするだけでアルゴリズムの変更が可能です。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>update</code> で複数対象を結合してハッシュ化</h4>



<p class="wp-block-paragraph">複数の対象を結合してハッシュしたい場合には、以下のように <span class="jinr-d--text-color d--marker1 d--bold"><code>update</code></span> で対象を順番に追加してからハッシュ化を実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import hashlib


def main():
    target_str1 = "sample01"
    target_str2 = "sample02"
    joined_str = target_str1 + target_str2
    print(target_str1)
    print(target_str2)
    print(joined_str, "\n")

    # updateで複数対象をつなげてハッシュ化
    h = hashlib.sha256()
    h.update(target_str1.encode("utf-8"))
    h.update(target_str2.encode("utf-8"))
    digest = h.hexdigest()
    print(digest)

    # 文字列を結合したもののハッシュ化と同じ
    digest = hashlib.sha256(joined_str.encode("utf-8")).hexdigest()
    print(digest)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
sample01
sample02
sample01sample02 

af239deb316d2daad434f8ec780f2e89184d81ae60f3d98c76ca3de4dcca5e45
af239deb316d2daad434f8ec780f2e89184d81ae60f3d98c76ca3de4dcca5e45</pre>



<p class="wp-block-paragraph"><code>update</code> を使用する場合には、まず引数なしで <code>sha256</code> を呼び出します。その後、ハッシュ化対象の文字列を順に <code>update</code> に渡していきます。</p>



<p class="wp-block-paragraph">上記では、<code>update</code> で文字を順に追加してからハッシュ化したものと、文字列をあらかじめ結合してからハッシュ化したものを表示していますが、ハッシュ値は同じになっていることが分かります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ファイルのデータをハッシュ化 (Python 3.11 で追加)</h4>



<p class="wp-block-paragraph">ファイル内のデータに対してハッシュ化したい場合には、以下のように <span class="jinr-d--text-color d--marker1 d--bold"><code>file_digest</code></span> を使用することができます。<code>file_digest</code> は、<span class="jinr-d--text-color d--marker1 d--bold">Python 3.11</span> で追加されているため、それ以前のバージョンの場合は使えませんのでご注意ください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import hashlib


def main():
    filepath = "targetfile.txt"

    # ファイルを読み込んでハッシュ化
    with open(filepath, "rb") as f:
        h = hashlib.file_digest(f, "sha256")
    digest = h.hexdigest()
    print(digest)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
b03ddf3ca2e714a6548e7495e2a03f5e824eaac9837cd7f159c67b90fb4b7342</pre>



<p class="wp-block-paragraph">上記の結果は「<code>P@ssw0rd</code>」と書かれているだけの <code>targetfile.txt</code> というテキストファイルを用意しておいて実行した結果です。</p>



<p class="wp-block-paragraph">対象パスのファイルをバイナリ読み取り専用 (<code>"rb"</code>) で開き、<code>file_digest</code> にファイルオブジェクトとハッシュアルゴリズム文字列を指定します。</p>



<p class="wp-block-paragraph">このようにファイルの内容をハッシュ化する際に <code>file_digest</code> は非常に便利です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">解読耐性のあるハッシュ値を取得する <code>pdkbf2_hmac</code></h4>



<p class="wp-block-paragraph">上記で見てきた単純なハッシュ化は、ハッシュ値の対応表がある場合にクラッキングされる恐れがあります。解読対策として、以下のような方法が有効です。</p>



<ol class="wp-block-list jinr-list">
<li>ハッシュ化するデータに <span class="jinr-d--text-color d--marker1 d--bold">Salt（ソルト）</span>と呼ばれるデータを付け足してからハッシュ化する。</li>



<li>得られたハッシュ値に対して、一定回数以上のハッシュ化を繰り返す。この処理を <span class="jinr-d--text-color d--marker1 d--bold">Stretching（ストレッチング）</span>という。</li>
</ol>



<p class="wp-block-paragraph"><code>hashlib</code> には、Salt（ソルト）、Stretching（ストレッチング）に対応した <span class="jinr-d--text-color d--marker1 d--bold"><code>pdkbf2_hmac</code></span> が用意されています。<code>pdkbf2_hmac</code> は以下のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import base64
import hashlib
import os

# saltの生成
salt = base64.b64encode(os.urandom(32))
# hash化の回数
iter_num = 100000


def main():
    password = "P@ssw0rd"
    print(password)

    # ハッシュ化
    digest = hashlib.pbkdf2_hmac(
        "sha256", password.encode("utf-8"), salt, iter_num
    ).hex()
    print(digest)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
P@ssw0rd
3e4e252b3d998a58b28cdce579264439d458c1c1228831b239c86458b244d7f3</pre>



<p class="wp-block-paragraph">Salt（ソルト）値は、<code>os.urandom</code> で 32 バイトのランダムな文字列を生成し、<code>base64</code> モジュールでエンコードして生成しています。Salt（ソルト）値は、<code>os.urandom</code> で 16 バイトかそれ以上のバイト列にするべきと言われています。ここは、こういった書き方ぐらいに覚えてしまってもよいかと思います。</p>



<p class="wp-block-paragraph"><code>pdkdf2_hmac</code> には、ハッシュ化方法である <code>"sha256"</code> と Salt（ソルト）値、Stretching（ストレッチング）の繰り返し回数を指定してハッシュ値を計算します。</p>



<p class="wp-block-paragraph">Salt や繰り返し回数が分からないとハッシュ値の計算は非常に困難になるため、クラッカーによる解読に対する耐性を持たせることができます。このように <code>pdkdf2_hmac</code> を使うことで解読耐性のあるハッシュ値を取得して利用することが可能です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ログインを想定したハッシュ化の使用例</h3>



<p class="wp-block-paragraph">ハッシュ化の使用例として、ログインパスワードをハッシュ化する例を紹介します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import base64
import hashlib
import os

# ユーザーとパスワードのDB
db = {}
# saltの生成
salt = base64.b64encode(os.urandom(32))
# hash化の回数
iter_num = 100000


def get_digest(password: str):
    """パスワードのハッシュ値計算

    Args:
        password: パスワード文字列

    Returns:
        ハッシュ値
    """
    digest = hashlib.pbkdf2_hmac(
        "sha256", password.encode("utf-8"), salt, iter_num
    ).hex()

    return digest


def is_login(user_name: str, password: str):
    """ログイン処理

    Args:
        user_name: ユーザー名
        password: パスワード

    Returns:
        ログイン結果
    """
    return get_digest(password) == db[user_name]


def main():
    user_name = "user01"
    user_password = "P@ssw0rd"

    digest = get_digest(user_password)
    db[user_name] = digest
    print(f"db: {db}\n")

    print(f"正常なログインの場合: {user_name} {user_password}")
    print(is_login(user_name, user_password))

    user_password_ng = "password"
    print(f"パスワード不正の場合: {user_name} {user_password_ng}")
    print(is_login(user_name, user_password_ng))


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">db: {'user01': '4320c4509b9c068312131f719cac5380572eb5062000a95d9ae1ce5fca139ecd'}

正常なログインの場合: user01 P@ssw0rd
True
パスワード不正の場合: user01 password
False</pre>



<p class="wp-block-paragraph">例において、<code>get_digest</code> 関数は、入力されたパスワードに対して <code>hashlib</code> の <code>sha256</code> でハッシュ値を求めるものです。また、<code>is_login</code> 関数はログイン時の認証のための関数で、与えられたパスワードに対してハッシュ化を行い、データベースに登録されているユーザー名に対応するパスワードと一致すれば <code>True</code> を返す関数です。</p>



<p class="wp-block-paragraph"><code>main</code> 関数では、与えられたパスワードに対してハッシュ値を求めて、DB を想定した辞書にユーザー名と合わせて記録しています。ここが、ユーザー名とパスワードをシステムのデータベースへ登録する部分をイメージしています。</p>



<p class="wp-block-paragraph"><code>main</code> 関数内でのログイン認証に該当する部分では、ユーザー名とパスワードを <code>is_login</code> 関数へ渡します。パスワードが一致する場合には、<code>True</code> が返却されますが、一方で、パスワードが誤っている場合には、<code>False</code> となっていることが分かります。</p>



<p class="wp-block-paragraph">このように <code>hashlib</code> によるハッシュ化を使用することで、ハッシュ値を用いた様々制御を実装することが可能です。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python でデータをハッシュ化するための <span class="jinr-d--text-color d--marker1 d--bold"><code>hashlib</code></span> モジュールについて解説しました。</p>



<p class="wp-block-paragraph">基本的なハッシュ化の使い方や <code>pdkdf2_hmac</code> による解読耐性のあるハッシュ値を取得について説明しました。また、ログインを想定した時のパスワードのハッシュ化の使用例についても紹介しています。</p>



<p class="wp-block-paragraph">ハッシュは、一方向関数である特徴から色々な場面で使用されます。ぜひ、<code>hashlib</code> の使い方を覚えてもらい活用していただければと思います。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>hashlib</code> の公式ドキュメントは<a href="https://docs.python.org/ja/3/library/hashlib.html#module-hashlib" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/hashlib" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-hashlib-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-12 01:22:03 by W3 Total Cache
-->