パスワードのハッシュ化

Feb 08 2023
パスワードの攻撃面
最も壊滅的なサイバー セキュリティ攻撃の一部は、サーバー側のデータベース内に適切に保存されていないパスワードの侵害から発生します。この問題は、基本的で覚えやすいパスワードを設定する傾向があるユーザーから始まる可能性があります。
Unsplash の Michael Dziedzic による写真

最も壊滅的なサイバー セキュリティ攻撃の一部は、サーバー側のデータベース内に適切に保存されていないパスワードの侵害から発生します。

この問題は、基本的で覚えやすいパスワードを設定する傾向があるユーザーから始まる可能性があります。これは、攻撃者がペットや親戚の名前など、個人の文脈を理解している場合、攻撃者によって簡単に推測される可能性があるため、リスクを生み出します。

より複雑なパスワードが選択された場合でも、パスワード クラッカー ソフトウェアがブルート フォース攻撃を引き起こす可能性があり、その結果、成功するまで多数のパスワードが試行されることになります。

別の攻撃ベクトルは、認証情報を保存しているデータベースへのアクセスを取得することです。CISO の悪夢のようなシナリオでは、攻撃者が暗号化されていない平文パスワードのデータベースにアクセスした場合、数千のユーザー アカウントが即座に侵害される可能性があります。残念ながら、これはあまりにも頻繁に発生しており、規模の大小を問わず組織に影響を与えています。

心配しないでください。これらの神経をすり減らす可能性は、パスワード ハッシュと呼ばれるものによって制限される可能性があります。

Unsplash の Markus Spiske による写真

ハッシュの定義

パスワード ハッシュは、平文を取得し、複雑なハッシュ関数を実行してハッシュ テキストを生成する暗号アルゴリズム技術です。このプロセスの鍵となるのは機能ですが、すべてが同じように亀裂の防止に適しているわけではありません。

OWASP (オープン ソース Web アプリケーション セキュリティ プロジェクト) の基準を満たすには、すべての関数が 2 つの主要なプロパティを満たす必要があります。

特定の望ましい出力に対応する初期入力を作成するのは困難です。

この特性を説明するために、一般的な sha256 暗号化アルゴリズムを通じて生成された「パスワード」のハッシュは次のとおりです。

e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a

「パスワード」のハッシュは次のとおりです。

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

ご覧のとおり、入力の 1 文字の大文字を変更するだけで、大幅に異なる出力が生成されます。これは、入力から出力を簡単に決定できないことを意味します。

ハッシュを生成することは実用的ですが、ハッシュ値しかわかっていない場合、入力を再生成することは事実上不可能です。

平文パスワードを平文に復号する前に暗号化テキストに変換する暗号化とは異なり、ハッシュは 1 つの機能です。パスワードのハッシュ化は決定的であるため、同じ入力からは常に同じ出力が生成されます。

この使用例は、ユーザーがパスワードを作成し、ハッシュ化して出力をデータベースに保存する場合です。ユーザーがパスワードを再試行すると、パスワードは再度ハッシュされ、データベース内のハッシュと照合して検証されます。攻撃者がハッシュ データベースにアクセスしたとしても、パスワードを平文に変換できないため、ほとんど役に立ちません。

この概念の単純なバージョンを確認するには、この Python スクリプトを実行してみてください :

# this and other fun scripts can be found at: https://github.com/Jay-Gokani

# install sha256 library for hashing
from hashlib import sha256

# demo explanation
print ('Hello, this demo will ask for a plaintext password, hash it and will verify the hash for access requests')

# first hash stored as a variable
hash1 = (sha256(input('What phony password would you like to set? ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash1)

# password hash stored confirmation
print ('Your password hash has been successfully stored.')

# promt the user for password re-entry, hash and store as another variable
hash2 = (sha256(input('I will test your hash. Please type your password: ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash2)

# access approval or deny check
while True:
    if hash1 == hash2:
        print('Success - password hash matches.')
        break
    else:
        print('The password hash does not match. Please run the programme again.')
        break

もちろん、ハッシュはパスワードの漏洩を防ぐオールインワンのソリューションではありません。たとえば、攻撃者は一般的なパスワードとそれに対応するハッシュのリストを作成する可能性があります。データベース内のハッシュがリストに含まれている場合、攻撃者は平文のパスワードを知ることになります。ただし、プレーンテキストのパスワードが十分に複雑に作成されている場合、これは問題にはなりません。さらに、平文パスワードを取り込んでハッシュを生成するアプリケーションが傍受される可能性があります。

パスワードのハッシュ化は、正しい方向への素晴らしい一歩です。この記事をお楽しみいただければ幸いです:-)