1

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 が失われた場合にキーをどのように復号化するかという疑問が生じます。これとトークンの違いは、トークンが暗号化キー自体ではない別のレイヤーが追加されることです。とにかく、解決策は、公開鍵/秘密鍵以外で、私が意図したものに最も近いと思います。どうもありがとうございました。

4

4 に答える 4

1

ユーザーのログ記録を維持するには

シンプルなトークン システムを使用し、トークンをユーザー データベースと Cookie ユーザー側に保存します。それについてさらに情報が必要な場合は、Googleをお勧めします(非常に簡単です)

平文パスワードの場合

いくつかの方法を使用して RAM に保存できます。これは memcache の例です。

$memcache->set($token, $password); 

次に、次のコマンドを使用して RAM から情報を取得します。

$user_password = $memcache->get($_COOKIE['token']);

PHP を使用して RAM にデータを保存する方法はいくつかあります: MemcacheAPC (ユーザー キャッシュ部分)

于 2012-06-08T10:20:07.880 に答える
1

token最初にユーザーを挿入するときにランダムハッシュになる可能性のあるユーザーテーブルにフィールドを作成します...

$token = md5(uniqid(mt_rand(), true));

次に、ユーザー ID とトークンを Cookie に保存します。これを使用して、ユーザーを検索できます。

于 2012-06-08T08:53:31.877 に答える
1

あなたの要件を理解しているので、パスワードをクライアント側またはサーバー側に保存することはできません。そのため、保管は一切できません。ページが読み込まれるたびにユーザーにパスワードを入力させます。

memcached や APC などを使用して RAM に保存するか、サーバー上で通信できる独自のソフトウェアを作成して保存できます。(シェルを介して) サーバーにアクセスできる人は誰でも、ソフトウェアとまったく同じ方法でパスワードを要求できるため、これによってセキュリティが大幅に強化されるわけではありません。私の意見では、「ファイルなし、データベースなし」という要件の目的のほとんどを破壊しますが、それはあなたにとっての解決策になるかもしれません.

于 2012-06-08T09:01:55.570 に答える
1

鍵となるのは、Cookie に情報を保存し、データベースに情報を保存する方法を見つけることです。これらの情報は一緒にプレーンテキストのパスワードを取得しますが、個別には役に立ちません。

私が思いつく最善の方法は、@fire が提案したものと同様のランダム トークンを作成することです。

$token = md5(uniqid(mt_rand(), true));`

次に、このトークンを使用してパスワードを暗号化し、暗号化されたパスワードuseridを .

クライアントが戻ると、Cookie を使用してデータベース行を取得できますid。また、データベースからトークンを取得して Cookie 情報を復号化し、平文のパスワードを取得できます。このようにして、誰かが Cookie をハッキングすると、暗号化されたパスワードが取得されます。データベースに侵入すると、パスワードをロック解除するためのキーを取得しますが、暗号化されたパスワードは取得しません。

于 2012-06-08T09:23:37.137 に答える