これはちょっとばかげています、本当に。Quentin が述べたように、この時点で行ったことはパスワードを変更しただけであり、安全性を高めていません。現在、パスワードは「プライベート文字列」ではなく、sha1(「プライベート文字列」) です。16 進数でエンコードすると、たまたま「5ee913d43470d39020f15ac10ff9cf7a8761b55a」になります。
あるパスワードを別のパスワードと交換しただけです。
パスワードを安全に交換するには、HTTPS を使用するのが最善の方法です。手を下げて。なんらかの理由で HTTPS を機能させることができない場合、または証明書にお金を払いたくない場合は、創造力を働かせる必要があります。
克服するのが最も難しい問題は、ユーザーがパスワードを設定する最初の段階です。公開鍵暗号化を使用しない場合、最適なオプションは、ランダムに生成された対称鍵をフォームで渡し、その鍵を使用してクライアント エンドでパスワードを暗号化し、サーバー エンドで復号化することです。たまたま誰かが交換を監視していると、壊れる可能性があります。しかし、これは公開鍵暗号なしでは解決できない問題です。
パスワードを設定すると、非常に安全にログインできます。サーバーがクライアントのログイン フォームをレンダリングするとき、フォームの一部として nonce を生成できます。
<input type='hidden' name='nonce' value='b45354f5b437c82beeed71d4d56ef3a47d0df2d3'/>
Username: <input type='text' name='username'/><br/>
Password: <input type='password' name='password'/>
Javascript とcrypt-jsなどの暗号化ライブラリを使用して、クライアントはハッシュ化されたメッセージを作成します。メッセージには、タイムスタンプ、ユーザー名、ナンスが含まれている必要があります。次に、HMAC を作成します。
var ts = Math.round((new Date()).getTime() / 1000);
var message = '' + ts + ':' + username + ':' + nonce;
var hash = CryptoJS.HmacSHA1(message, password);
簡単に言えば、ハッシュはパスワードと一緒にハッシュされたメッセージです。
メッセージとハッシュをサーバーに送信します。サーバーはプロセスを逆にする必要があります。
- メッセージをノンス、日付、およびユーザー名に解析します
- ナンスがクライアントに与えられたものと同じであることを確認してください
- 日付が最近のものであることを確認してください (過去 5 分以内など)。
- ユーザーのパスワードを取得する
- HMAC 計算を実行し、結果がクライアントによって提供されたハッシュと等しいことを確認します。