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
はハッシュアルゴリズムの一種で、md
はmessage-digest
、5
はバージョンです。 ここで、プレーンテキストをハッシュに変換したい文字列が必要です。このために、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
sha512
は sha1
よりも強力で、一種優れています。 それはすべて、状況に応じてより良いまたは最善であると判断したシナリオに依存します。
ソルティングとハッシュ
この種の古いアルゴリズムの問題は、ブルート フォースまたはリバース エンジニアリングが可能であり、誰もがこの暗号化されたハッシュを簡単に解読できるため、それほど安全ではないことです。 暗号化されたハッシュは hello
です。 辞書攻撃を行って 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
辞書が復号化できないことがわかります。
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