Я сделал это. Я использую это асимметричное шифрование RSA на стороне клиента JavaScript, чтобы предотвратить отправку учетных данных в виде обычного текста через HTTP.
Цель состоит в том, чтобы предотвратить атаки повторного воспроизведения запросов на вход в систему, основанные на сниффинге сети. Конечно, это не так безопасно, как HTTPS, поскольку он не будет противостоять атакам «злоумышленник посередине», но этого может быть достаточно для локальных сетей.
Шифрование на стороне клиента использует Отличная работа Трэвиса Тридвелла, основанная на JSBN. Веб-страница Трэвиса также может генерировать частный и открытый ключи RSA (если вам лень использовать openssl
). Ключи генерируются в формате PKCS # 1 PEM. Я зашифрую username+password+timeInMs+timezone
, чтобы зашифрованное содержимое изменялось при каждом входе в систему.
На стороне сервера мой код Java прочитал, прочитал файл PEM PKCS # 1, используя org.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader
Apache JMeter:
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");
Затем я проверяю, совпадает ли временная метка / часовой пояс на стороне клиента с временной меткой / часовым поясом на стороне сервера. Если задержка меньше нескольких секунд, процесс входа в систему продолжается. В противном случае запрос считается атакой повторного воспроизведения, и вход в систему не выполняется.
person
Julien Kronegg
schedule
03.02.2014