2011-02-25 52 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中,並且(可能)不會顯示在應用程序的任何頁面上。