やりました。この JavaScript クライアント側の非対称 RSA 暗号化を使用して、ログイン資格情報が HTTP 経由でプレーン テキストで送信されるのを防ぎます。
目標は、ネットワーク スニッフィングに基づくログイン リクエストのリプレイ攻撃を防ぐことです。もちろん、これは中間者攻撃に耐えられないため、HTTPS ほど安全ではありませんが、ローカル ネットワークでは十分です。
クライアント側の暗号化は、 JSBNに基づくTravis Tridwell の優れた成果を使用しています。Travis の Web ページでは、RSA 秘密鍵と公開鍵を生成することもできます (使用するのが面倒な場合)。キーは PKCS#1 PEM 形式で生成されます。ログインごとに暗号化されたコンテンツが変更されるように暗号化します。openssl
username+password+timeInMs+timezone
サーバー側では、私の Java コードは、 Apache JMeterorg.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader
を使用して PKCS#1 PEM ファイルを読み取りました。
PrivateKey pk = (new PrivateKeyReader("myPrivateKeyFile.pem")).getPrivateKey();
次に、暗号化されたコンテンツを復号化します
byte[] enc = DatatypeConverter.parseBase64Binary(clientData);
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.DECRYPT_MODE, pk);
byte[] dec = rsa.doFinal(enc);
String out = new String(dec, "UTF8");
次に、クライアント側のタイムスタンプ/タイムゾーンがサーバー側のタイムスタンプ/タイムゾーンと一致するかどうかを確認します。遅延が数秒未満の場合、ログイン プロセスは続行されます。それ以外の場合、リクエストはリプレイ アタックと見なされ、ログインは失敗します。