Как сохранить зашифрованные данные в cookie (используя php)? - PullRequest
1 голос
/ 06 октября 2008

Я хотел бы сохранить данные в файлах cookie (имя пользователя, адрес электронной почты и т. Д.), Но я не хочу, чтобы пользователь мог легко их прочитать или изменить. Мне нужно иметь возможность прочитать данные обратно. Как я могу сделать это с php 5.2 +?

Он будет использоваться для функции типа "добро пожаловать, Боб". Это не замена для постоянного хранения или хранения сеанса.

Ответы [ 5 ]

9 голосов
/ 06 октября 2008

Мы используем mcrypt в наших проектах для достижения шифрования. Ниже приведен пример кода на основе содержимого, найденного в Интернете:

<?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);

    }
}
7 голосов
/ 06 октября 2008

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

6 голосов
/ 06 октября 2008

Если вы не хотите, чтобы ваши пользователи читали его, не помещайте его в файл cookie; Вместо этого используйте Session's с cookie, который сохраняется дольше. Таким образом, данные остаются на сервере, а не на компьютере пользователя.

См. Эту статью о постоянных сеансах

3 голосов
/ 06 октября 2008

Пример шифрования см. В разделе «Симметричное шифрование» в http://www.osix.net/modules/article/?id=606.

Чтобы предотвратить несанкционированное изменение, используйте HMAC: http://php.net/hash-hmac, и в целом о hmac: http://en.wikipedia.org/wiki/HMAC, http://en.wikipedia.org/wiki/Message_authentication_code

И если вам не нужно, не храните конфиденциальные данные в cookie, даже в зашифрованном виде. Возможно, вы захотите узнать больше о «косвенности данных».

1 голос
/ 06 октября 2008

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

http://php.net/mcrypt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...