SSL Alternative – шифрование пароля с помощью JavaScript для PHP для расшифровки

Я создаю сайт, и моими платежными методами будут Google Checkout и Paypal. Появятся ссылки / кнопки, которые перенаправят пользователя на безопасные сайты Google / Paypal для обработки платежей. Это означает, что мне не нужны дополнительные расходы в размере 150 долларов США за год и сложность установки SSL-сертификатов для моего сайта.

Однако я хотел бы зашифровать пароли пользователей во время их входа в систему, чтобы, если они находятся в сети, какой-то вредоносный пользователь, работающий с FireSheep и т. Д., Не может прочитать фактический пароль пользователя, поскольку он отправляется на сервер. Остальная часть сайта не нуждается в шифровании, так как это не очень чувствительные данные и, вероятно, значительно замедлит работу пользователя.

Я думаю, что это может быть реализовано с помощью криптографии с открытым ключом. Допустим, что процесс выглядит примерно так:

  1. Открытый ключ находится в внешнем файле JavaScript, закрытый ключ в PHP на сервере
  2. Пользователь вводит свое имя пользователя и пароль в форму и нажимает кнопку отправить
  3. JavaScript запускается и шифрует пароль, сохраняя его обратно в текстовом поле
  4. Форма отправляется на сервер и пароль дешифруется с помощью PHP
  5. Обычный текстовый пароль в PHP солен и хэширован, а затем сравнивается с хешем в базе данных.
  6. Возможный аналогичный процесс для функций регистрации / изменения пароля.

Я думаю, что что-то вроде RSA будет делать трюк. Но я охотился вокруг сети для работы библиотеки JavaScript, чтобы сделать это, но ни один из них не совместим с доступными библиотеками PHP. Во всяком случае ему нужно сгенерировать набор ключей, совместимых с JavaScript и PHP.

Кто-нибудь знает о фактическом рабочем решении для этого? Если нет, то как мы пишем один, тогда с открытым исходным кодом. К сожалению, код шифрования / дешифрования довольно сложный, поэтому я не знаю точно, что делают существующие библиотеки и как их модифицировать, чтобы заставить его работать. У меня уже есть защита для фиксации / захвата сессии, поэтому я не заинтересован в этом. Просто заинтересован в шифровании данных до того, как он попадет на веб-сервер.

NB: Пожалуйста, не отправляйте кучу ссылок на автономные библиотеки шифрования Javascript или PHP, я уже нашел их в Google. Это на самом деле не полезно. Мне нужен код для шифрования JavaScript и расшифровка PHP, которая на самом деле гармонично работает вместе для получения намеченного выше результата.

Кроме того, если вы можете воздержаться от публикации комментариев, таких как «просто использовать SSL». Мне действительно хотелось бы решить эту точную проблему, даже если это не лучшая практика, было бы интересно, тем не менее.

Большое спасибо!

http://www.jcryption.org/ – Это комбинация, которую вы ищете.

Только одна проблема: злоумышленнику не нужно знать фактический пароль. Все, что ему нужно, это значение, которое отправляется на сервер . Это значение позволяет пользователю войти в систему. Неважно, что это за значение; будь то открытый текст, зашифрованный текст или изображение кошки. Это всего лишь токен, который аутентифицирует пользователя. Если злоумышленник может увидеть этот токен и повторить один и тот же запрос, и тот же запрос позволяет ему войти в систему, вы ничего не получили.

RSA является излишним; то, что вам, вероятно, нужно, это простой протокол ответа на запрос. Например:

  • Создать случайное значение nonce; это помогает предотвратить повторные атаки.
  • Отправьте это значение nonce и соль для пароля в браузер вместе с остальной формой входа.
    • Вы храните пароли в соленой и хешированной форме?
  • Когда пользователь вводит пароль, вместо этого сценарий в форме вычисляет и отправляет обратно хэш (хэш (пароль, соль), nonce).
  • Когда сервер получает представление формы, попросите его вычислить хеш (storedSaltedPassword, nonce) и убедитесь, что он равен представленному значению.
    • Сохраните значение nonce на сервере; не доверяйте клиенту повторять его вам, или ваша защита воспроизведения не исчезла.

Слабостью этой схемы является то, что хэши паролей в базе данных в некотором смысле эквивалентны паролю; в то время как, вероятно, невозможно извлечь исходный пароль, используемый для создания этих хэшей, знание сохраненного хеша достаточно для олицетворения пользователя на вашем сайте.

Сертификаты SSL имеют совершенно иную цель: цель сертификата SSL – затруднить для стороннего сервера-изгоев заявить, что он является вашим сервером, поскольку у него нет сертификата, подписанного какой-либо сторонней доверенной третьей стороной, что он принадлежит вашему домену. С другой стороны, если вы не можете остановить изгоев сервера от выдачи себя за руки, вы не можете защитить своих пользователей от предоставления своего пароля этому серверу-изгоев, несмотря на криптографию.

Во-первых, я не думаю, что это хорошая идея. Я нашел несколько примеров с помощью Google, которые могут вам пригодиться (я их еще не тестировал):

Шифрование открытого ключа GPL JavaScript

Тест шифрования открытого ключа RSA в JavaScript

Шифрование PGP в JavaScript

Пример алгоритма RSA в JavaScript

Вы должны установить некоторый механизм соления, чтобы солить каждое зашифрованное значение, иначе ключ мог бы быть скомпрометирован.

Вам не нужно шифровать пароль. Вам нужно ввести пароль. Вы действительно не хотите, чтобы у вас был какой-либо доступ к паролю незашифрованного текста, иначе вы потеряете отказ от отказа, что имеет серьезные юридические последствия. Вам нужно тщательно изучить смысл этого вопроса до начала процесса.

Это код для ввода ввода, а затем шифрование содержимого с помощью java-скрипта. Весь код также доступен в github.you ребята могут искать его encrypt_js_decrypt_php. Проблема была запущена с давних времен. Я придумал решение. Просто импортируйте его в localhost.

 <html> <input type="text" id="code" name="code"/> <input type="submit" name="submit" value="submit" onclick="return encryptCode();"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script type="text/javascript"> function rc4(key, str) { var s = [], j = 0, x, res = ''; for (var i = 0; i < 256; i++) { s[i] = i; } for (i = 0; i < 256; i++) { j = (j + s[i] + key.charCodeAt(i % key.length)) % 256; x = s[i]; s[i] = s[j]; s[j] = x; } i = 0; j = 0; for (var y = 0; y < str.length; y++) { i = (i + 1) % 256; j = (j + s[i]) % 256; x = s[i]; s[i] = s[j]; s[j] = x; res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]); } return res; } function encryptCode() { var value = document.getElementById("code").value; var key = "secretKeyToProvide"; /*--Provide Your secret key here--*/ var codeValue = rc4(key, value); var arr = {code:codeValue, Age:25}; $.ajax({ url: "response.php", type: "POST", data: JSON.stringify(arr), dataType: 'json', async: false, contentType: 'application/json; charset=utf-8', success: function(data) { alert(data); } }); } </script> </html> 

Теперь давайте расшифруем код в php

 <?php function mb_chr($char) { return mb_convert_encoding('&#'.intval($char).';', 'UTF-8', 'HTML-ENTITIES'); } function mb_ord($char) { $result = unpack('N', mb_convert_encoding($char, 'UCS-4BE', 'UTF-8')); if (is_array($result) === true) { return $result[1]; } return ord($char); } function rc4($key, $str) { if (extension_loaded('mbstring') === true) { mb_language('Neutral'); mb_internal_encoding('UTF-8'); mb_detect_order(array('UTF-8', 'ISO-8859-15', 'ISO-8859-1', 'ASCII')); } $s = array(); for ($i = 0; $i < 256; $i++) { $s[$i] = $i; } $j = 0; for ($i = 0; $i < 256; $i++) { $j = ($j + $s[$i] + mb_ord(mb_substr($key, $i % mb_strlen($key), 1))) % 256; $x = $s[$i]; $s[$i] = $s[$j]; $s[$j] = $x; } $i = 0; $j = 0; $res = ''; for ($y = 0; $y < mb_strlen($str); $y++) { $i = ($i + 1) % 256; $j = ($j + $s[$i]) % 256; $x = $s[$i]; $s[$i] = $s[$j]; $s[$j] = $x; $res .= mb_chr(mb_ord(mb_substr($str, $y, 1)) ^ $s[($s[$i] + $s[$j]) % 256]); } return $res; } $request_body = file_get_contents('php://input'); $json = json_decode($request_body); $secretCode =$json->code ; $age =$json->Age ; $key = "secretKeyToProvide"; /*--Provide Your secret key here what you have given in javascript--*/ $decryptedSecretCode = rc4($key, $secretCode) ; echo $decryptedSecretCode; exit; ?>