2011-02-25 40 views
6

我需要在cookie中安全加密和解密关于用户的信息(user_idpassword)。加密和解密存储在cookies中的信息

这样做的最好方法是什么?我需要什么加密和解密功能?

我正在使用PHPMySQL并举例参加?

+2

不建议在cookie中存储密码 – 2011-02-25 08:46:38

+0

为什么*需要*将用户密码存储在cookie中? – 2011-02-25 08:47:31

+0

因为POST数据可以被嗅探,所以我认为使用加密发送登录凭据的cookie会更好wt你建议? – 2011-02-25 08:55:08

回答

8

不存储密码在一个cookie中。从不做这种事情。 如果您希望某种方式让用户无需输入其登录名和密码进行登录,则可以在登录时创建一些随机令牌(例如sha1(mt_rand())),并将该值存储在cookie和数据库中。

然后,当试图识别用户时,您只需检查在他的cookie中找到的值是否可以在您的数据库中找到。每次登录时都会生成一个新值(使用名称+密码或使用此cookie)。

10

例如

Set encrypted cookie: 
<?php 

$time = time()+60*60*24*30*12; //store cookie for one year 
setcookie('cookie_name', encryptCookie('cookie_value'),$time,'/'); 

?> 

Get encrypted cookie value: 

<?php 

$cookie_value = decryptCookie($_COOKIE['cookie_name']); 

?> 

这里是加密解密的cookie功能:

<?php 

function encryptCookie($value){ 
    if(!$value){return false;} 
    $key = 'The Line Secret Key'; 
    $text = $value; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv); 
    return trim(base64_encode($crypttext)); //encode for cookie 
} 

function decryptCookie($value){ 
    if(!$value){return false;} 
    $key = 'The Line Secret Key'; 
    $crypttext = base64_decode($value); //decode cookie 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv); 
    return trim($decrypttext); 
} 

?> 

你可以阅读更多关于mcrypt的功能在这里: php mcrypt function

+0

您能否定义函数'encryptCookie()'? – 2011-02-25 08:49:25

+3

@Michiel:如果他打算使用MD5,我会对decryptCookie()更感兴趣。 – 2011-02-25 08:53:00

+0

对不起,有一点快。我已经添加了加密/解密示例 – Mikelangelo 2011-02-25 08:58:08

1

没有好的方法来“安全地加密和解密有关用户的Cookie信息”,因为将信息存储在cookie中本质上是不安全的。

推荐的技术是生成一个随机的会话标识符,并将其用作存储在cookie中的信息片段,作为的唯一。然后在服务器端使用此会话ID在数据库或文件中查找用户的实际帐户信息(以及有关他们正在进行的操作的任何状态),以便只发送少量无用数据并返回随着用户提出的每个请求在网络中传播。如果这样的cookie被坏人拦截,它只会损害用户的会话(允许攻击者暂时模仿用户,直到会话结束);用户的密码将保持安全,因为它不在cookie中,并且(可能)不会显示在应用程序的任何页面上。