Pythonのhashlibモジュールは、メッセージを簡単にハッシュ化するためのインタフェースです。
これは、暗号化されたフォーマットで任意の生のメッセージをハッシュ処理する多数のメソッドを含んでいます。
このモジュールの主な目的は、文字列に対してハッシュ関数を使用し、それを暗号化して、復号するのが非常に難しくすることです。
一般的に、暗号化された文字列は十分に長く、元の文字列を取り戻すのはほとんど不可能です。
以下のブロック図は、私たちのアプリケーションでパスワードを安全に保存するために、どのようにこれを実現するかを示しています。
import hashlib
|
ハッシュ関数は、ハッシュ化された出力の長さが同じで、入力文字列の長さよりずっと大きいことを保証していることに注意してください。
このため、ブルートフォースでハッシュをクラックすることは非常に困難です。
この概念を理解した上で、このモジュールを使ってみましょう。
Python hashlib
Pythonのインストールに直接付属しているこのモジュールをインポートする必要があります。
import hashlib
print (hashlib.algorithms_available)
print (hashlib.algorithms_guaranteed)
|
文字列を暗号化するために、さまざまなハッシュアルゴリズムが利用可能です。
どのようなものが利用可能かを見てみましょう。
{ 'whirlpool' , 'sha3-224' , 'sha3-256' , 'sha512-224' , 'sha3-384' , 'sha384' , 'shake256' , 'sha1' , 'md5-sha1' , 'md5' , 'md4' , 'mdc2' , 'blake2b512' , 'blake2s256' , 'sha3_512' , 'sha512-256' , 'blake2s' , 'ripemd160' , 'sha3_384' , 'shake128' , 'shake_128' , 'blake2b' , 'sha512' , 'sha3_224' , 'shake_256' , 'sha256' , 'sha3_256' , 'sha3-512' , 'sha224' , 'sm3' }
{ 'blake2b' , 'md5' , 'sha512' , 'blake2s' , 'sha3_224' , 'shake_256' , 'sha256' , 'sha3_256' , 'sha384' , 'sha3_384' , 'sha224' , 'sha1' , 'shake_128' , 'sha3_512' }
|
algorithms_available属性は、システムで使用されているすべてのアルゴリズムを表示します。
この属性には、sshや
OpenSSL` などの他のプログラムも含まれます。
algorithms_guaranteed` 属性は、そのモジュールに含まれるすべてのアルゴリズムを表示します。
つまり、私(Linuxシステム)の場合、出力はこのようになります。
Windows/macOSの場合、出力は若干異なるかもしれません。
import hashlib
# Initialize the empty message using SHA-256 message = hashlib.sha256()
# Update the message using byte strings message.update(b 'Hello there,' )
message.update(b 'how are you?' )
# Print the message digest print (message.digest())
|
それでは、文字列の暗号化について説明します。
Pythonのhashlibを使った文字列の暗号化
ハッシュ関数に文字列を直接渡すことはできません。
これは、ハッシュ関数がバイトのリストしか受け付けないためで、文字列をバイト列に変換してから、ハッシュ関数に渡す必要があります。
今回は、256ビットのハッシュを与えるSHA-256アルゴリズムを使用します。
b ',xe1xff7xe7xa0xe7xb2xb4xf9E!xf2xd9xb8;xdfx7fx10xa8x1ad1xc0x7f=xbbxb1xf7xeb7xcf'
|
結果は以下の通りです。
import hashlib
def hash_string( input ):
byte_input = input .encode()
hash_object = hashlib.sha256(byte_input)
return hash_object
def update_hash(hash_object, input_str):
# Adds the string to the hash string
hash_object.update(input_str.encode())
hash_object = hash_string( 'Hello from Python' )
# Print the encrypted message print (hash_object.hexdigest())
# Update the hash message update_hash(hash_object, 'hello, how are you?' )
# Print the encrypted message print ( 'After updating:' , hash_object.hexdigest())
new_str = 'Hello from Pythonhello, how are you?'
print (hash_string(new_str).hexdigest() = = hash_object.hexdigest())
|
メッセージオブジェクトからハッシュ文字列を取得するために message.digest()
を使用します。
メッセージオブジェクトのハッシュ値を直接渡さない場合は、 message.update()
メソッドは非バイト文字列に対しては動作しませんので、 string.encode()
を使ってエンコードする必要があります。
e0a59a3889b1db4cc27f4fcc03353bf1db55114add1112f95532794fd392b202 After updating: 32f9cffab10b7bfef72892d5059de865914319a05bdf394b18d7b068fd806a0a
True |
結果は以下の通りです。
ハッシュ関数に文字列を渡して暗号化ハッシュを取得し、それに応じて更新することに成功しました!
これを別のハッシュアルゴリズムに拡張することができます。
近い将来、このモジュールをビルディングブロックとして使い、良いハッシュ関数を実装するためのステップバイステップの手順をお見せする予定です。
さらなるアップデートにご期待ください。
この記事もチェック:Pythonの辞書(dict)をupdateメソッドで更新する方法
まとめ
この記事では、異なるハッシュ関数を使用して文字列を暗号化するためのPython hashlib
モジュールについて学びました。