ここには 2 つの別個の (っぽい) 問題があります。認証と機密性。機密性が必要な場合は、HTTPS を使用してください。その後、transit-encryption について心配する必要はなく、すべてをクリアテキストで送信できます (SSL が完全な接続暗号化を実行するため)。
パスワードの保存に関しては; クリアテキストのパスワードをどこにも保存しないでください。常に最初にパスワードをハッシュし (少なくとも、より強力なアプローチのためにパスワードのソルティングを調べてください)、ハッシュされた値をデータベースに保存します。ユーザーがパスワードを送信すると、送信したものをハッシュし、それをデータベースの値と比較します。一致する場合、パスワードは正しかったです。
SSL/HTTPS を使用したくない場合は、パスワードを平文で送信しないようにする必要があるという考えは正しいです。これはさまざまな方法で実現できますが、私の意見ではChallenge-Responseが最も適切です。この方法では、ランダムな文字列を生成し、それを javascript 変数にエコーすることで、ログイン ページの php からランダムな「ノンス」を送信します。
次に、javascript を使用して計算します。
hash(hash(password) + nonce);
hash は、MD5 や SHA などの安全なハッシュ関数です。
そうすれば、サーバー上で、ユーザーに平文で送信させることなくパスワードを認証できます。これを行うには、データベースに保存した値を同じナンスと連結してハッシュし、それをユーザーから送信された値と比較します。値が一致する場合、パスワードは正しかったです。
これらすべての要点は、ユーザーが同じログイン文字列をサーバーに 2 回送信しないようにすることで、リプレイ攻撃から保護することです。攻撃者は、好きなだけログインを傍受して記録することができます。同じユーザー アカウントで同じ nonce が使用されるまで、それらはすべて役に立ちません。これを回避するのは、単に非常に大きなナンスを使用する場合です。
ただし、このアプローチではリレー攻撃や中間者攻撃を防ぐことはできないことに注意してください。これらのクラスの攻撃には、認証局などのサード パーティを使用することによってのみ達成できる相互認証が必要です。これにより、SSL/HTTPS に完全に戻ることができます。