Cookie / セッションと DB データに関する問題の安全な解決策を見つけようとしています。
私はすでにhttp://www.devshed.com/c/a/PHP/Sessions-and-Cookies/のようなさまざまな記事を読んで、さまざまな Cookie の盗難とセッションの固定方法を説明しており、セキュリティの問題について理解しています。向き合います。
AES_ENTRYPT()
問題は次のとおりです。ユーザーパスワードを使用して暗号化するデータエントリを格納する DB テーブルがあります。つまり、情報を読み取るためにも、平文のパスワードを使用してデータを復号化する必要があります。
パスワードを変数に保存するだけであれば、これはおそらく問題にはなりませんが、それでは$_SESSION
、Cookie を介して数日間ログインし続けることができなくなります。
言い換えれば、プレーンテキストのパスワードを Cookie に保存する必要があります (少なくとも、ログイン状態を維持する機能を有効にするため)。
パスワードの代わりに、salted MD5() または SHA-256() ハッシュを識別子として使用できるようになりました。しかし、ハッシュを使用してデータを復号化することはできません。これは、パスワードをサーバー側に(データベースに? または他の安全な方法がありますか?) 格納し、それを識別子に接続する必要があることを意味しますが、データベースにアクセスできるすべての人がパスワードにアクセスでき、直接そこでデータを復号化します。
私がCookieに保存した識別子を接続し、それをサーバーに保存されたユーザー入力(パスワード/アカウント名)に接続して、データベースにアクセスできる人にそのサーバー側を読み取る可能性を実際に与える安全な方法はありますか保存されたユーザー入力?
要件は、誰かがデータベースと Cookie のダンプを持っている (ただしサーバー RAM にはアクセスできない) という最悪のシナリオであっても、その人がユーザー パスワードにアクセスして保存されたデータを復号化できないようにすることです。
混乱を避けるために、簡単に要約します。
これはユーザー識別の問題ではありません。ログイン プロセスは個別に行われます (通常の方法: パスワードの md5() ハッシュ / logindata)。私の問題は、ユーザーデータ (住所、名前、電子メールなど) がユーザーパスワードで暗号化されていることです。したがって、それらを復号化するには、ログインからのパスワードが必要です。$_POST データにパスワードがあり、それを使用できるため、ユーザーがログインするだけであれば問題ありません。でもログイン後?$_POST または $_SESSION がなくなるとすぐに、データを再度復号化する方法がありません。
考えられる解決策
いくつかの入力の後、私は方法を考え出したかもしれません - それは完全に安全ではありませんが、十分にうまくいくはずです:
(これはログイン/ユーザー認証プロセスとは別のものであり、暗号化/鍵部分のみを参照しています)
user registers OR changes password:
generate a new hash out of $email and $password => $auth
do NOT store $auth in the usertable, just keep it
generate a new random key for the user => $key (only on registering, not on pw change)
encrypt $key with $auth, storing it into the usertable
encrypt all user data with $key
user logs in (or after registering / password change):
generate $auth ($password + $email)
set cookie with $auth as variable
user is logged in (cookie / session / after login):
decrypt $key with $auth
use $key for data encryption / decryption (serverside)
ここでの唯一の問題は、誰かが $auth を取得できた場合、$key を復号化してからデータを復号化できることです。ログインごとに新しい $auth を生成することを考えていますが、古い $auth が失われた場合にキーをどのように復号化するかという疑問が生じます。これとトークンの違いは、トークンが暗号化キー自体ではない別のレイヤーが追加されることです。とにかく、解決策は、公開鍵/秘密鍵以外で、私が意図したものに最も近いと思います。どうもありがとうございました。