0

ユーザーがログインして、特定のネットワークに関連するすべての GIS データ (グローバル情報システム) を表示できる場所を処理するアプリケーションを実行しています。

これは通常のドメインです(つまり、お金は関係ありません)

私の質問は、ユーザーがログインページでログインするときです(パスワードを保護するためにbase64.encodeを使用する予定です)

上記について3点質問があります

  1. ここではbase64.encodeを使用するのが適切ですか??
  2. ユーザーがログインページでユーザー名とパスワードを送信すると、サーブレットレベルで暗号化を使用する予定です(これは、パスワードを使用して受け取った後です)req.getparameter("password")

    static public char[] encode(byte[] data) {

    }

これが正しいかどうか教えてください??

  1. そして、正確にどこでパスワードを解読する必要がありますか?? (つまり、暗号化された値とともにデータベースに保存し、DAO レイヤーで復号化する必要がありますか??

これが正しいかどうか教えてください??

4

2 に答える 2

1

ここには 2 つの別個の (っぽい) 問題があります。認証と機密性。機密性が必要な場合は、HTTPS を使用してください。その後、transit-encryption について心配する必要はなく、すべてをクリアテキストで送信できます (SSL が完全な接続暗号化を実行するため)。

パスワードの保存に関しては; クリアテキストのパスワードをどこにも保存しないでください。常に最初にパスワードをハッシュし (少なくとも、より強力なアプローチのためにパスワードのソルティングを調べてください)、ハッシュされた値をデータベースに保存します。ユーザーがパスワードを送信すると、送信したものをハッシュし、それをデータベースの値と比較します。一致する場合、パスワードは正しかったです。

SSL/HTTPS を使用したくない場合は、パスワードを平文で送信しないようにする必要があるという考えは正しいです。これはさまざまな方法で実現できますが、私の意見ではChallenge-Responseが最も適切です。この方法では、ランダムな文字列を生成し、それを javascript 変数にエコーすることで、ログイン ページの php からランダムな「ノンス」を送信します。

次に、javascript を使用して計算します。

hash(hash(password) + nonce);

hash は、MD5 や SHA などの安全なハッシュ関数です。

そうすれば、サーバー上で、ユーザーに平文で送信させることなくパスワードを認証できます。これを行うには、データベースに保存した値を同じナンスと連結してハッシュし、それをユーザーから送信された値と比較します。値が一致する場合、パスワードは正しかったです。

これらすべての要点は、ユーザーが同じログイン文字列をサーバーに 2 回送信しないようにすることで、リプレイ攻撃から保護することです。攻撃者は、好きなだけログインを傍受して記録することができます。同じユーザー アカウントで同じ nonce が使用されるまで、それらはすべて役に立ちません。これを回避するのは、単に非常に大きなナンスを使用する場合です。

ただし、このアプローチではリレー攻撃中間者攻撃を防ぐことはできないことに注意してください。これらのクラスの攻撃には、認証局などのサード パーティを使用することによってのみ達成できる相互認証が必要です。これにより、SSL/HTTPS に完全に戻ることができます。

于 2012-07-02T14:32:19.557 に答える
1

base64 は暗号化方式ではなく、エンコード方式です。ある程度の経験で簡単に認識できる方法で送信データをわずかに覆い隠すことを除いて、セキュリティは提供されません。セキュリティ目的で使用しないでください。

ユーザー<->サーバー トラフィックを傍受されないように保護するために必要なほとんどすべてが、HTTPS/SSL に既に実装されています。これを使用して、開発時間を節約し、不十分に開発された社内スキームのエラーから身を守ります。

于 2012-07-02T14:08:51.027 に答える