Actualmente estoy ejecutando mi sitio web en alojamiento compartido, y no puedo registrar TLS / SSL para mi sitio web. Sin embargo, implementé jsencrypt
[una biblioteca de Javascript para realizar el cifrado, descifrado y generación de claves RSA de OpenSSL] para cifrar todos los datos de formularios mediante AJAX o POST / GET normal.
Actualmente, tuve un problema con el enlace de restablecimiento de contraseña o algunos otros enlaces importantes que envié al usuario para acciones importantes relacionadas con la cuenta del usuario. Por ejemplo:
example.com/password?resetcode=%CODE%
Pero después de pensar en TLS / SSL, esta URL se puede ver fácilmente usando cualquier herramienta de monitoreo de tráfico, luego, un atacante puede obtener el enlace antes del usuario y restablecer la contraseña.
Una forma de evitar esto es usar fragment identifier
( #
) después de la url como:
example.com/password#code=%CODE%
Luego usa:
<script>
var securykey = "<?php echo $_SESSION['securykey']; ?>";//random secure key
var hash = encrypt(window.location.hash.substring(1)+"|count="+securykey );
window.location = "example.com/password?code=hash"; //hash encryped
</script>
Y luego en el lado del servidor:
<?php
$code = decrypt($hash);
if($_SESSION['securykey'] == $securykey_from_user){
//its valid
}
?>
¿La dosis por encima de la técnica es fuerte? y ¿usaremos el identificador de fragmento incluso para TLS / SSL?
ACTUALIZAR :
- No utilicé mi cifrado. Lo siento por mencionar AES, no fue AES sino openSSL utilizando JavaScript.
- Google también implementó el identificador de fragmento HTML! ejemplo: enlace
- jsencrypt: es la biblioteca que utilicé en el lado del cliente. enlace y luego usé PHP openssl para descifrarlo en el lado del servidor.
Demostración del código fuente:
- javaScript: enlace
-
PHP:
<?php $config = array( "digest_alg" => "sha512", "private_key_bits" => 4096, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); $res = openssl_pkey_new($config); //$privKey = key saved in google cloud and accessed with https using curl openssl_pkey_export($res, $privKey); // Extract the public key from $res to $pubKey $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; $data = 'plaintext data goes here';//$_POST['data'] // Encrypt the data to $encrypted using the public key openssl_public_encrypt($data, $encrypted, $pubKey); // Decrypt the data using the private key and store the results in $decrypted openssl_private_decrypt($encrypted, $decrypted, $privKey); ?>