Python パスワードハッシュ

Salman Mehmood 2023年10月10日
  1. Python の bcrypt ライブラリを使用したソルトおよびハッシュ パスワード
  2. hashlib ライブラリを使用してパスワードをハッシュする
Python パスワードハッシュ

パスワードのハッシュ化と、bcryptと呼ばれるサードパーティ ライブラリを使用してソルトおよびハッシュ パスワードを暗号化する方法について学習します。 また、Python の hashlib ライブラリからのさまざまなハッシュ アルゴリズムも調べます。

Python の bcrypt ライブラリを使用したソルトおよびハッシュ パスワード

ハッシュとは、文字列を固定長の一見ランダムな文字列に変換するプロセスであり、そのプロセスは元に戻すことができません。 これは一方向関数であるため、メッセージを暗号化してから復号化できる暗号化のように、ハッシュを元の文字列に戻すことはできません。

ハッシュはユーザー管理に使用されます。 たとえば、データベースの侵害が発生したり、データが失われたり、平文のパスワードを使用しているときに誰かがシステムをハッキングしたりした場合です。 ハッシュは、保護の層を提供します。 ただし、ハッシュ化されたパスワードは、適切に維持すれば簡単に解読できません。

このセクションでは、bcrypt モジュールを使用してハッシュ化されたパスワードを操作する方法を説明します。 コードに飛び込みましょう。 ハッシュアルゴリズムであるbcryptと呼ばれるサードパーティのライブラリを使用します。

bcrypt は、パスワードをハッシュするための信頼性が高く、堅牢で、推奨されるアルゴリズムです。 物事を素早く終わらせるための使いやすくて便利な機能を提供してくれます。

まず、次のコマンドを使用してこのライブラリをインストールします。

pip install bcrypt

bcrypt をインポートし、パスワードを作成して変数に保存する必要があります。パスワードはバイト文字列でなければなりません。 このパスワードをハッシュ化するには、hashed_pswd という新しい変数を作成し、bcrypt から hashpw() メソッドを呼び出します。

2つの引数を取ります。 1つ目はパスワードで、2つ目は gensalt() と呼ばれるもので、数字またはソルトとハッシュのパスワードをランダムに生成します。

import bcrypt

My_pswd = b"Mypassword111"

hashed_pswd = bcrypt.hashpw(My_pswd, bcrypt.gensalt())
print(hashed_pswd)

出力:

b'$2b$12$KEW01pYNDc3ee9U0wZpmgOBpUvvjkig/qxs593hGh/aZ2AvvGTyWu'

hashlib ライブラリを使用してパスワードをハッシュする

このセクションでは、hashlib ライブラリを使用してソルトとハッシュ化されたパスワードを作成します。 パスワードなどの安全なデータをある場所から別の場所に渡す場合は、誰かがそれを読み取れないようにすることをお勧めします。

何かを非表示にしたり、ユーザーが読み取れないようにしたりする場合にできることは 2 種類あります。 1つ目はハッシュ、2つ目は暗号化です。 暗号化はパスワードではほとんど使用されません。

コンピューターから別のコンピューターにファイルを転送したり、ファイルを送信したりする場合は、暗号化を使用します。 ただし、パスワードが正しいかどうかを確認したり、サーバーにパスワードを保存したりする場合は、ほとんどの場合ハッシュが使用されます。

hashlib ライブラリの最も良い点は、何もインストールする必要がないことです。 Python 3 以降のバージョンが付属しています。 hashlib をインポートした後、MD5_Algo というオブジェクトを作成し、hashlib から md5() を呼び出します。

md5はハッシュアルゴリズムの一種で、mdmessage-digest5はバージョンです。 ここで、プレーンテキストをハッシュに変換したい文字列が必要です。このために、update() メソッドを呼び出して、ハッシュしたい文字列を書き込みます。

次に print() 関数内で hexdigest() メソッドを呼び出します。 ひずみを実際の md5 に変換した後、16 進形式に変換します。

import hashlib

MD5_Algo = hashlib.md5()
MD5_Algo.update("hello")
print(MD5_Algo.hexdigest())

このコードはエラーをスローします (Unicode オブジェクトはハッシュする前にエンコードする必要があります)。上記のセクションでは、文字列をバイトに変換する必要があることを既に説明しました。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_4064/2416014515.py in <module>
      2
      3 MD5_Algo=hashlib.md5()
----> 4 MD5_Algo.update('hello')
      5 print(MD5_Algo.hexdigest())

TypeError: Unicode-objects must be encoded before hashing

文字列をバイトに変換すると、md5 暗号化されたハッシュ化されたパスワードが得られることがわかります。

import hashlib

MD5_Algo = hashlib.md5()
MD5_Algo.update(b"hello")
print(MD5_Algo.hexdigest())

出力:

5d41402abc4b2a76b9719d911017c592

hashlib.sha512()

他の種類の暗号化ハッシュもあります。 Python の内部に実際にどのような種類のハッシュが含まれているかを調べてみましょう。 algorithms_available 属性を使用して、利用可能なアルゴリズムを出力できます。

print(hashlib.algorithms_available)

出力:

{'md4', 'md5', 'shake_256', 'shake_128', 'sha512_224', 'md5-sha1', 'sha224', 'sha3_512', 'sha1', 'sha3_384', 'sha512', 'sha3_224', 'sha512_256', 'sha384', 'sha256', 'blake2b', 'sha3_256', 'blake2s', 'ripemd160', 'whirlpool', 'sm3', 'mdc2'}

ご覧のとおり、多くの優れたアルゴリズムがあり、明らかに、これらのオブジェクトはすべて同じ種類の構造を持ち、同じ関数と変数を持ちますが、アルゴリズムが異なるだけです。

sha512 は、使用して文字列で渡すものです。 その後、ハッシュ化される文字列に hexdigest() を使用します。

import hashlib

MD5_Algo = hashlib.sha512(b"hello")
print(MD5_Algo.hexdigest())

このコードを実行すると、長い大量の文字が得られます。

9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

sha512sha1 よりも強力で、一種優れています。 それはすべて、状況に応じてより良いまたは最善であると判断したシナリオに依存します。

ソルティングとハッシュ

この種の古いアルゴリズムの問題は、ブルート フォースまたはリバース エンジニアリングが可能であり、誰もがこの暗号化されたハッシュを簡単に解読できるため、それほど安全ではないことです。 暗号化されたハッシュは hello です。 辞書攻撃を行って sha512 辞書から解読したらどうなるでしょうか?

sha512

sha512 の欠点は、多くの人が Facebook やその他のアプリケーションでパスワードを使用していることです。 通常、彼らはすでに反転して sha512 で見た誕生日を使用するため、安全な方法ではありません。

最も安全な方法の 1つは塩漬けです。 塩漬けは、元の文字列の前に文字を追加します。 "hello" の前に "a" を追加すると、元の文字列の前にソルトとして文字 "a" が追加されたとします。

hashlib.sha512(b"helloa")

この追加のソルトでこのハッシュを暗号化したので、ハッシュを解読する方法を見つけようとするハッカーや他の人々にとって非常に困難になるため、ソルトの出番です。

hashlib.pbkdf2_hmac()

Python では、hashlib ライブラリには、少し遅い関数がありますが、pbkdf2_hmac() という非常に優れた関数があります。 この関数を使用しますが、2 番目のライブラリは実際にはバイナリを ASCII 文字に変換するためのものです。

pbkdf2_hmac() にはいくつかのパラメーターが必要です。 最初のパラメータは使用するアルゴリズムの名前なので、この場合は sha512 を使用しています。 次のものは、ハッシュしたいパスワードまたはテキストです。 この場合、"hello" になります。

次のものはソルトと呼ばれ、このパスワードにソルトが追加され、sha512 を使用して暗号化されます。 最後は反復回数です。 この繰り返しを 10 万回行うと、解読するのが非常に難しくなります。

コードの最後の行では、binascii ライブラリの hexlify() メソッドを使用して、暗号化されたハッシュを ASCII 文字に変換します。

import hashlib
import binascii

Enc_Salt = hashlib.pbkdf2_hmac("sha512", b"hello", b"a", 100000)
print(binascii.hexlify(Enc_Salt))

出力:

b'40b5957a2d2f5aebcdd878a04e644215d4f3aba3f11c00a1f24e75f8ea2efa11611b2a923a9050832cb768a3a3ad282011cab524b741d392c664b8efbb5f389f'

これで、sha512 辞書が復号化できないことがわかります。

sha512 は復号化できません

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn