私はLAMP(erl)スタックで開発しており、隠されたパスワードを保存するいくつかの方法を知っています。MySQL4.1.1とPerl5.8を考えると、ベストプラクティスがあると感じている人たちと、それがベストである理由を聞きたいと思います。
MySQL ENCODE()およびDECODE()関数を使用して私が読んだ1つのオプションは、私にはかなり良いように聞こえます...あなたの考えは?
一般的に、私はパスワードを復号化できる暗号化されたアイテムとして保持するよりも、復元できないハッシュとして保持することを好みます。
ビジターが提供した文字列からハッシュを計算することにより (もちろん、いくつかのソルトも)、ユーザーが同じパスワードを 2 回提供したかどうかを判断できます。アプリケーションが提供されたパスワードをおそらく悪意を持って復号化できるというセキュリティ上のリスクはありません。 .
データを回復可能にしたい場合は、encode() と decode() がおそらく良い解決策ですが、保存されたパスワードには回復不能なハッシュ (Crypt::MD5 を使用) の方が適していると思います。
SHA-256のような適切なハッシュ関数を使用したソルト ハッシュが最適だと思います。元に戻せるパスワードは、元に戻せないパスワードほど安全ではありません。外部 Perl モジュールがなければ、代わりにビルトインの SHA1() 関数を使用できます。SHA256 ほどではありませんが、ENCODE/DECODE よりは優れています。
さらに、コードからデータベースへのパスを考慮する必要があります。これは傍受される可能性があります。コード内でハッシュするか、データベース接続を暗号化することで、そのリスクを回避できます。接続を暗号化する場合でも、クエリ ログが構成され、平文がログ ファイルのどこかに保存されるリスクがあるため、コードで実行することをお勧めします。
自分自身/ユーザーを認証するためのパスワードのみが必要な場合は、一方向の保存 (md5 など) の方が適しています。
まあ、DECODE()
関数があるので、パスワードをハッシュ形式で保存したいという単純な事実のために、私はノーと言います.
古典的な塩漬けハッシュ法を使用することをお勧めします。
一部のアプリケーションでは、ユーザーのパスワードを忘れた場合にランダムにリセットされるシステムとは対照的に、ユーザーのパスワードを取得できるようにする必要があります (ハッシュを使用しているため、パスワードを復号化できないため)。この場合、エンコードとデコードは問題ありませんが、代わりに組み込みの AES_ENCRYPT および AES_DECRYPT 関数を使用してみませんか?
また、ハッシュするか暗号化するかにかかわらず、salt 値を使用するという提案を守ってください。両方のシナリオで有益です。
これらの関数が何をするのかはわかりませんが、LAMP スタック Web サイトのパスワードには、間違いなくソルト フィールドも使用します。
ユーザーテーブルには次のものがあります。
平文のパスワードは、平文のパスワードとソルトを連結したエンコード関数を使用してエンコードされます。この結果は pass フィールドに入ります。塩も保存されます。そうすれば、ユーザーがログインするときにプレーンテキストのパスワードを確認できます。ソルトは何でもかまいませんが、長くてランダムなほど良いですが、それほど敏感ではないと思います.
これにより、セキュリティが大幅に向上します。ユーザーは 5 文字のパスワードを使用しなくなり、5+len(salt) サイズのパスワードを使用し、salt が十分に大きい場合、どのレインボー データベースにもハッシュが含まれなくなるためです。
パスワードを解読できる場合、セキュリティに欠陥があります。パスワードは常にソルトでハッシュする必要があります。MD5 が一般的ですが、SHA や SHA-256 などの優れたハッシュもあります。