password - ¿Cómo guardar datos encriptados en una cookie(usando php)?
login con contraseña encriptada php (5)
Le sugiero que no solo cifre sino que también firme los datos. Si no firma los datos, no podrá decir de manera confiable si el usuario modificó los datos. Además, para evitar la reproducción, es posible que desee agregar algunos datos de marca de tiempo / período de validez en los datos.
Me gustaría guardar los datos en las cookies (nombre de usuario, dirección de correo electrónico, etc.) pero el usuario no puede leerlos fácilmente ni modificarlos. Necesito poder leer los datos nuevamente. ¿Cómo puedo hacer eso con php 5.2+?
Sería usado para el tipo de función "welcome back bob". No es un reemplazo para la persistencia o el almacenamiento de la sesión.
Si no quieres que tus usuarios lo lean, no lo pongas en una cookie; En lugar de eso, use Session''s con una cookie que permanezca por más tiempo. De esta forma, los datos permanecen en el servidor y no en la computadora del usuario.
Para ver el ejemplo de encriptación, consulte la sección "encriptación simétrica" en http://www.osix.net/modules/article/?id=606 .
Para evitar modificaciones no autorizadas, utilice HMAC: http://php.net/hash-hmac , y sobre hmac en general: http://en.wikipedia.org/wiki/HMAC , http://en.wikipedia.org/ wiki / Message_authentication_code
Y, si no es necesario, no almacene datos confidenciales en una cookie, ni siquiera encriptados. Es posible que desee leer más sobre "indirección de datos".
Si es absolutamente necesario hacer esto, puede utilizar la funcionalidad de encriptación simétrica en mcrypt
.
Usamos mcrypt en nuestros proyectos para lograr el cifrado. A continuación se muestra un ejemplo de código basado en el contenido encontrado en Internet:
<?php
class MyProjCrypt {
private $td;
private $iv;
private $ks;
private $salt;
private $encStr;
private $decStr;
/**
* The constructor initializes the cryptography library
* @param $salt string The encryption key
* @return void
*/
function __construct($salt) {
$this->td = mcrypt_module_open(''rijndael-256'', '''', ''ofb'', ''''); // algorithm
$this->ks = mcrypt_enc_get_key_size($this->td); // key size needed for the algorithm
$this->salt = substr(md5($salt), 0, $this->ks);
}
/**
* Generates a hex string of $src
* @param $src string String to be encrypted
* @return void
*/
function encrypt($src) {
srand(( double) microtime() * 1000000); //for sake of MCRYPT_RAND
$this->iv = mcrypt_create_iv($this->ks, MCRYPT_RAND);
mcrypt_generic_init($this->td, $this->salt, $this->iv);
$tmpStr = mcrypt_generic($this->td, $src);
mcrypt_generic_deinit($this->td);
mcrypt_module_close($this->td);
//convert the encrypted binary string to hex
//$this->iv is needed to decrypt the string later. It has a fixed length and can easily
//be seperated out from the encrypted String
$this->encStr = bin2hex($this->iv.$tmpStr);
}
/**
* Decrypts a hex string
* @param $src string String to be decrypted
* @return void
*/
function decrypt($src) {
//convert the hex string to binary
$corrected = preg_replace("[^0-9a-fA-F]", "", $src);
$binenc = pack("H".strlen($corrected), $corrected);
//retrieve the iv from the encrypted string
$this->iv = substr($binenc, 0, $this->ks);
//retrieve the encrypted string alone(minus iv)
$binstr = substr($binenc, $this->ks);
/* Initialize encryption module for decryption */
mcrypt_generic_init($this->td, $this->salt, $this->iv);
/* Decrypt encrypted string */
$decrypted = mdecrypt_generic($this->td, $binstr);
/* Terminate decryption handle and close module */
mcrypt_generic_deinit($this->td);
mcrypt_module_close($this->td);
$this->decStr = trim($decrypted);
}
}