在客戶端臨時儲存使用者的資訊,又擔心不安全,所以我們經常使用加密技術來處理資訊,一般為了安全性更高,我們在加密的時候隨機加上“佐料”,這就是我們所說的salt加密。
首先我們看看salt是什麼,下面一段話引自CSDN的一位作者blade2001的《淺談MD5加密演算法中的加鹽值(SALT)》:
“我們知道,如果直接對密碼進行雜湊,那麼黑客可以對通過獲得這個密碼雜湊值,然後通過查雜湊值字典(例如MD5密碼破解網站),得到某使用者的密碼。
加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是加點“佐料”。其基本想法是這樣的:當用戶首次提供密碼時(通常是註冊時),由系統自動往這個密碼裡撒一些“佐料”,然後再雜湊。而當用戶登入時,系統為使用者提供的程式碼撒上同樣的“佐料”,然後雜湊,再比較雜湊值,已確定密碼是否正確。
這裡的“佐料”被稱作“Salt值”,這個值是由系統隨機生成的,並且只有系統知道。這樣,即便兩個使用者使用了同一個密碼,由於系統為它們生成的salt值不同,他們的雜湊值也是不同的。即便黑客可以通過自己的密碼和自己生成的雜湊值來找具有特定密碼的使用者,但這個機率太小了(密碼和salt值都得和黑客使用的一樣才行)。”
下面就是一個實用例項:假如該檔案儲存在一個cookie.php中。
//cookie.php
defined('APPROOT') or die('No direct script access.');
classCookie {
public static $salt = 'E#344JU()k9k+ I! LoveLAN';
public static $expiration = 0;
public static $path = '/';
public static $domain = NULL;
public static $secure = FALSE;
public static $httponly = FALSE;
/**
* @param string $key cookie name
* @param mixed $default default value to return
* @return string
*/
public static function get($key, $default = NULL)
{
if ( ! isset($_COOKIE[$key]))
{
return $default;
}
$cookie = $_COOKIE[$key];
$split = strlen(Cookie::salt($key, NULL));
if (isset($cookie[$split]) AND $cookie[$split] === '~')
{
list ($hash, $value) = explode('~', $cookie, 2);
if (Cookie::salt($key, $value) === $hash)
{
return $value;
}
Cookie::delete($key);
}
return $default;
}
/**
* // Set the "theme" cookie
* Cookie::set('theme', 'red');
*
* @param string $name name of cookie
* @param string $value value of cookie
* @param integer $expiration lifetime in seconds
* @return boolean
* @uses Cookie::salt
*/
public static function set($name, $value, $expiration = NULL)
{
if ($expiration === NULL)
{
$expiration = Cookie::$expiration;
}
if ($expiration !== 0)
{
$expiration += time();
}
$value = Cookie::salt($name, $value).'~'.$value;
return setcookie($name, $value, $expiration, Cookie::$path, Cookie::$domain, Cookie::$secure, Cookie::$httponly);
}
/**
* Cookie::delete('theme');
*
* @param string $name cookie name
* @return boolean
*/
public static function delete($name)
{
unset($_COOKIE[$name]);
return setcookie($name, NULL, -86400, Cookie::$path, Cookie::$domain, Cookie::$secure, Cookie::$httponly);
}
/**
* $salt = Cookie::salt('theme', 'red');
*
* @param string $name name of cookie
* @param string $value value of cookie
* @return string
*/
public static function salt($name, $value)
{
if ( ! Cookie::$salt)
{
throw new Exception('A valid cookie salt is required.');
}
$agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : 'unknown';
return sha1($agent.$name.$value.Cookie::$salt);
}
}
使用上面的cookie:
//index.php
in
include 'cookie.php';
function setUidToSession ($uid)
{
if (empty($uid)) {
return;
}
// 30天不過期
$cookies_life_time = 24 * 3600 * 30;
#Cookie::$domain = 'd.fenfenriji.com';
Cookie::set('uid', $uid, $cookies_life_time);
}
function getUidFromSession ()
{
$uid = Cookie::get('uid');
if (empty($uid) or $uid == '10000') {
die(json_encode(new APIError('10000', '會話過期')));
}
return $uid;
}
要注意,這裡進行了封裝。以後使用直接使用這兩個函式即可設定cookie和刪除cookie。
推薦文章:
《MD5+salt安全淺析》http://www.server110.com/sec_news/201309/995.html
《淺談MD5加密演算法中的加鹽值(SALT)》