ユーザーを確認するときや同様のことを行うときに、パスワードをプレーンテキストで保持してはなりません。
多くの人が同じパスワードを使用しているため、攻撃者が暗号化されていないパスワードのデータベースを発見した場合、一致する電子メールと組み合わせてそれらを簡単に使用して、リンクされた Web サイトまたはアカウントにアクセスしたり、他のアカウントへのアクセスを試みたりすることさえできます。
現在、パスワードが提供されると、パスワードはハッシュ化されることがよくあります。 ソルトでハッシュし、ソルトをハッシュ化されたパスワードと一緒に保持することをお勧めします。
ソルティングは、ハッシュ ブラウンのレシピの手順の XNUMX つに見えるかもしれませんが、暗号化では、ハッシュ関数の入力にランダム データを追加して、入力が同一であってもハッシュが常に一意の結果を提供することを意味します。
その結果、salt を追加することによって作成された独自のハッシュは、ハッシュ テーブルへの攻撃を含むいくつかの攻撃方法から私たちを守ることができますが、辞書やブルート フォース オフラインの試みは抑圧されます。
ここでは、コード スニペットを使用して、「bcrypt」を使用してパスワードを保護する方法を示します。
では、「bcrypt」とは何ですか?
Bcrypt は、複数の言語をサポートし、特別なパスワード暗号化を提供するハッシュ ライブラリです。 パスワードのセキュリティを強化するために、文字列を暗号化するときに追加のランダム文字 (salt) が自動的に生成されます。
入力文字列に追加する文字数を定義することもできます。
bcrypt ライブラリは生の文字列ではなく、バイト コードのみを読み取ります。 したがって、受信パスワード文字列を暗号化のために bcrypt に送信する前に、まずそれをエンコードする必要があります。
暗号化とエンコードは同じものではありません。 暗号化技術によって隠蔽される前に、文字列が機械可読であることを確認するだけです。
Python で bcrypt を使用してパスワードを暗号化する
Python は bcrypt パスワード暗号化をシンプルにします。 フレームワークの助けを借りずにこれを行うことに集中します。 ただし、ユーザー入力を保存してデータベースから読み取る方法を理解していれば、フレームワークでも手順は同じです。
インストール
Python 仮想環境をセットアップして、PyCharm などの IDE を利用するだけです。 次に、ライブラリを最初にインストールする必要があります。
暗号化パスワード
インストール後に bcrypt を使用してテキストを暗号化する方法を見てみましょう。
前述の Python コードが実行され、暗号化されたバイト文字列が出力されます。 しかし、スクリプトを実行するたびに、結果は異なります。 Bcrypt はこの方法を使用して、すべてのユーザーが明確に暗号化されたパスワードを持っていることを確認します。
ちなみに、これはパスワード暗号化用です。
Bcrypt を使用したパスワードの比較と確認
ハッシュ化されたパスワードを保存し、後でユーザーが認証のために送信したパスワードと一致するかどうかを確認したい場合はどうなりますか?
それは簡単です。 認証パスワードのみをデータベースのエントリ (またはこの場合はメモリ内) と比較する必要があります。
bcrypt はバイト文字列しか読み取れないため、データベース内のパスワードと比較する前に、認証パスワードもエンコードする必要があります。 基本的に、エンコードされた認証入力を、現在データベースにあるエンコードされたハッシュ化されたパスワードと比較します。
架空の Python 入力を使用して、これをテストしてみましょう。
前述のコードを実行すると、新しいパスワードの入力を求められます。 これは Python によってメモリに保存されます。 認証セクションでは、同じパスワードを入力しますが、これはあなただけのものです。
パスワードが比較され、以前に暗号化されて保存されたパスワードが一致した場合、Python は成功メッセージを出力します。
そうでない場合は、エラー メッセージが出力され、else 文が追加されます。
基本的な考え方は、認証のためにデータベースにパスワードを登録してから提供するのと同じです。
まとめ
単純な Python ショート メモリで bcrypt がどのように機能するかを示すために暗号化されたパスワードを使用しただけですが、その実際の適用範囲はユーザーベースのアプリにあります。
とはいえ、この記事では、実際の状況であっても、これを達成するためにコードを編成するための重要な方法を示します。
たとえば、Flask を使用している場合、入力の代わりに別の Web フォームを介して登録フィールドと認証フィールドを提供できます。
もちろん、パスワードを比較するときは、現実世界に保管されている暗号化されたパスワードを含むデータベースから読み取ります。
ジョナ・ニッチュ
分かりやすく丁寧な説明ありがとうございます、
これは、現在のプロジェクトに非常に役立ちました。
サンプルコードが必要最小限に限定されており、他の多くの説明のように過負荷になっていないのは非常に良いことだと思います。
敬具