Attualmente sto gestendo il mio sito web in hosting condiviso, e non sono in grado di registrare TLS / SSL per il mio sito web. Tuttavia, ho implementato jsencrypt
[Una libreria Javascript per eseguire OpenSSL RSA Encryption, Decryption e Key Generation] per crittografare tutti i dati dei moduli tramite AJAX o POST / GET normale.
Attualmente, ho riscontrato un problema con il link per la reimpostazione della password o altri link importanti che ho inviato all'utente per importanti azioni relative all'account utente. Ad esempio:
example.com/password?resetcode=%CODE%
Ma dopo aver pensato a TLS / SSL, questo url può essere visto facilmente utilizzando qualsiasi strumento di monitoraggio del traffico, quindi un utente malintenzionato può ottenere il collegamento prima dell'utente e reimpostare la password.
Un modo per evitare ciò è utilizzare fragment identifier
( #
) dopo url come:
example.com/password#code=%CODE%
Quindi usando:
<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>
E poi sul lato server:
<?php
$code = decrypt($hash);
if($_SESSION['securykey'] == $securykey_from_user){
//its valid
}
?>
La tecnica sopra la dose è strong? e dovremmo usare l'identificatore di frammento anche per TLS / SSL?
UPDATE:
- Non ho usato la mia crittografia. Ci scusiamo per aver menzionato AES che non era AES ma openSSL che utilizza JavaScript.
- Google ha anche implementato l'identificatore di frammento HTML! esempio: link
- jsencrypt: è la libreria che ho usato nel lato client. link e poi ho usato PHP openssl per decrittografarlo sul lato server.
Demo codice sorgente:
- javaScript: link
-
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); ?>