Pythonでhashlibライブラリを使って暗号化する方法

スポンサーリンク

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属性は、システムで使用されているすべてのアルゴリズムを表示します。

この属性には、sshOpenSSL` などの他のプログラムも含まれます。

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

結果は以下の通りです。

Hash Function
Hash Function

ハッシュ関数に文字列を渡して暗号化ハッシュを取得し、それに応じて更新することに成功しました!

これを別のハッシュアルゴリズムに拡張することができます。

近い将来、このモジュールをビルディングブロックとして使い、良いハッシュ関数を実装するためのステップバイステップの手順をお見せする予定です。

さらなるアップデートにご期待ください。


まとめ

この記事では、異なるハッシュ関数を使用して文字列を暗号化するためのPython hashlib モジュールについて学びました。

タイトルとURLをコピーしました