电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

PHP安全-加密

瀏覽:106日期:2022-09-11 17:36:02
加密

作為一本相關(guān)安全方面的書,通常加密是需要提及的話題。我之所以在本書的主體部分忽略了加密問題,是因?yàn)樗挠猛臼仟M窄的,而開發(fā)者應(yīng)從大處著眼來考慮安全問題。過分依賴于加密常常會混淆問題的根源。盡管加密本身是有效的,但是進(jìn)行加密并不會神奇地提高一個應(yīng)用的安全性。

一個PHP開發(fā)人員應(yīng)主要熟悉以下的加密方式:

l對稱加密

l非對稱加密(公鑰)

lHash函數(shù)(信息摘要)

l信息驗(yàn)證碼

本附錄主要關(guān)注于使用mcrypt擴(kuò)展的對稱加密算法。你需要參考的資料如下:

實(shí)用加密技術(shù)(Applied Cryptography), by Bruce Schneier (Wiley)

http://www.schneier.com/blog/

http://wikipedia.org/wiki/Cryptography

http://phpsec.org/articles/2005/password-hashing.html

http://pear.php.net/package/Crypt_HMAC

http://pear.php.net/package/Crypt_RSA

C.1. 密碼的存儲

當(dāng)你在數(shù)據(jù)庫內(nèi)存儲的密碼時,永遠(yuǎn)不要以明碼方式存入,而是應(yīng)該存儲密碼的hash值并同時使用附加字串:

<?php

/* $password contains the password. */

$salt = ’SHIFLETT’;

$password_hash = md5($salt . md5($password . $salt));

/* Store password hash. */

?>

當(dāng)你需要確認(rèn)一個密碼是否正確時,以同樣的方式計算出hash值并比較異同:

<?php

$salt = ’SHIFLETT’;

$password_hash = md5($salt . md5($_POST[’password’] . $salt));

/* Compare password hashes. */

?>

如果hash值完全相同,你就有理由認(rèn)為密碼也是相同的。

如果使用了這個技巧,是不可能告訴用戶他們的密碼是什么的。當(dāng)用戶忘記密碼時,你只能讓他錄入一個新密碼并重新計算hash值存入數(shù)據(jù)庫。當(dāng)然,你需要非常小心地對用戶進(jìn)行身份確認(rèn)——密碼提醒機(jī)制是易受頻繁攻擊的目標(biāo),同時也是經(jīng)常出現(xiàn)安全漏洞的源頭。

C.2. 使用mcrypt

PHP的標(biāo)準(zhǔn)加密擴(kuò)展是mcrypt,它支持很多不同的加密算法。你可以通過mcrypt_list_algorithms( )函數(shù)來查看你的平臺上支持的算法列表:

<?php

echo ’<pre>’ . print_r(mcrypt_list_algorithms(), TRUE) . ’</pre>’;

?>

加密和解密分別由mcrypt_encrypt( ) 及 mcrypt_decrypt( )函數(shù)來實(shí)現(xiàn)。這兩個函數(shù)都有5個參數(shù),第一個參數(shù)是用于指定使用的算法:

<?php

mcrypt_encrypt($algorithm,

$key,

$cleartext,

$mode,

$iv);

mcrypt_decrypt($algorithm,

$key,

$ciphertext,

$mode,

$iv);

?>

其中的加密鍵(第二個參數(shù))是非常敏感的數(shù)據(jù),因此你要確保把它存放在安全的地方。可以用第八章中保護(hù)數(shù)據(jù)庫權(quán)限的方法來保護(hù)加密鍵。如果經(jīng)濟(jì)條件允許的話,硬件加密鍵是最好的選擇,它提供了超級強(qiáng)大的安全性。

函數(shù)有多種模式可供選擇,你可以使用mcrypt_list_modes( )來列出所有支持的模式:

<?php

echo ’<pre>’ . print_r(mcrypt_list_modes(), TRUE) . ’</pre>’;

?>

第五個參數(shù)($iv)為初始化向量,可以使用mcrypt_create_iv( )函數(shù)建立。

下面的示例類提供了基本的加密解密方法:

class crypt

{

private $algorithm;

private $mode;

private $random_source;

public $cleartext;

public $ciphertext;

public $iv;

public function __construct($algorithm = MCRYPT_BLOWFISH,

$mode = MCRYPT_MODE_CBC,

$random_source = MCRYPT_DEV_URANDOM)

{

$this->algorithm = $algorithm;

$this->mode = $mode;

$this->random_source = $random_source;

}

public function generate_iv()

{

$this->iv = mcrypt_create_iv(mcrypt_get_iv_size($this->algorithm,

$this->mode), $this->random_source);

}

public function encrypt()

{

$this->ciphertext = mcrypt_encrypt($this->algorithm,

$_SERVER[’CRYPT_KEY’], $this->cleartext, $this->mode, $this->iv);

}

public function decrypt()

{

$this->cleartext = mcrypt_decrypt($this->algorithm,

$_SERVER[’CRYPT_KEY’], $this->ciphertext, $this->mode, $this->iv);

}

}

?>

上面的類會在其它示例中使用,下面是它的使用方法示例:

<?php

$crypt = new crypt();

$crypt->cleartext = ’This is a string’;

$crypt->generate_iv();

$crypt->encrypt();

$ciphertext = base64_encode($crypt->ciphertext);

$iv = base64_encode($crypt->iv);

unset($crypt);

/* Store $ciphertext and $iv (initialization vector). */

$ciphertext = base64_decode($ciphertext);

$iv = base64_decode($iv);

$crypt = new crypt();

$crypt->iv = $iv;

$crypt->ciphertext = $ciphertext;

$crypt->decrypt();

$cleartext = $crypt->cleartext;

?>

小提示

本擴(kuò)展要求你在編譯PHP時使用-mcrypt標(biāo)識。安裝指南及要求詳見http://php.net/mcrypt。

C.3. 信用卡號的保存

我常常被問到如何安全地保存信用卡號。我的總是會首先詢問他們是否確實(shí)有必要保存信用卡號。畢竟不管具體是如何操作的,引入不必要的風(fēng)險是不明智的。同時國家法律還有關(guān)于信用卡信息處理方面的規(guī)定,我還時刻小心地提醒我并不是一個法律專家。

本書中我并不會專門討論信用卡處理的方法,而是會說明如何保存加密信息到數(shù)據(jù)庫及在讀取時解密。該流程會導(dǎo)致系統(tǒng)性能的下降,但是確實(shí)提供了一層保護(hù)措施。其主要優(yōu)點(diǎn)是如果數(shù)據(jù)庫內(nèi)容泄密暴露出的只是加密信息,但是前提是加密鍵是安全的。因此,加密鍵與加密的實(shí)現(xiàn)方法本身同樣重要。

保存加密數(shù)據(jù)到數(shù)據(jù)的過程是,首先加密數(shù)據(jù),然后通過初始向量與明文建立密文來保存到數(shù)據(jù)庫。由于密文是二進(jìn)制字符串,還需要通過base64_encode( )轉(zhuǎn)換成普通文本字符串以保證二進(jìn)制編碼的安全存儲。

<?php

$crypt = new crypt();

$crypt->cleartext = ’1234567890123456’;

$crypt->generate_iv();

$crypt->encrypt();

$ciphertext = $crypt->ciphertext;

$iv = $crypt->iv;

$string = base64_encode($iv . $ciphertext);

?>

保存該字串至數(shù)據(jù)庫。在讀取時,則是上面流程的逆處理:

<?php

$string = base64_decode($string);

$iv_size = mcrypt_get_iv_size($algorithm, $mode);

$ciphertext = substr($string, $iv_size);

$iv = substr($string, 0, $iv_size);

$crypt = new crypt();

$crypt->iv = $iv;

$crypt->ciphertext = $ciphertext;

$crypt->decrypt();

$cleartext = $crypt->cleartext;

?>

本實(shí)現(xiàn)方法假定加密算法與模式不變。如果它們是不定的話,你還要保存它們以用于解密數(shù)據(jù)。加密鍵是唯一需要保密的數(shù)據(jù)。

C.4. 加密會話數(shù)據(jù)

如果你的數(shù)據(jù)庫存在安全問題,或者部分保存在會話中的數(shù)據(jù)是敏感的,你可能希望加密會話數(shù)據(jù)。除非很有必要,一般我不推薦這樣做,但是如果你覺得在你的情形下需要這樣做的話,本節(jié)提供了一個實(shí)現(xiàn)方法的示例。

這個方案十分簡單。實(shí)際上,在第八章中,已經(jīng)說明了如何通過調(diào)用session_set_save_handler( )來執(zhí)行你自己的會話機(jī)制。通過對保存和讀取數(shù)據(jù)的函數(shù)的少量調(diào)整,你就能加密存入數(shù)據(jù)庫的數(shù)據(jù)及在讀取時解密數(shù)據(jù):

<?php

function _read($id)

{

global $_sess_db;

$algorithm = MCRYPT_BLOWFISH;

$mode = MCRYPT_MODE_CBC;

$id = mysql_real_escape_string($id);

$sql = 'SELECT data

FROM sessions

WHERE id = ’$id’';

if ($result = mysql_query($sql, $_sess_db))

{

$record = mysql_fetch_assoc($result);

$data = base64_decode($record[’data’]);

$iv_size = mcrypt_get_iv_size($algorithm, $mode);

$ciphertext = substr($data, $iv_size);

$iv = substr($data, 0, $iv_size);

$crypt = new crypt();

$crypt->iv = $iv;

$crypt->ciphertext = $ciphertext;

$crypt->decrypt();

return $crypt->cleartext;

}

return ’’;

}

function _write($id, $data)

{

global $_sess_db;

$access = time();

$crypt = new crypt();

$crypt->cleartext = $data;

$crypt->generate_iv();

$crypt->encrypt();

$ciphertext = $crypt->ciphertext;

$iv = $crypt->iv;

$data = base64_encode($iv . $ciphertext);

$id = mysql_real_escape_string($id);

$access = mysql_real_escape_string($access);

$data = mysql_real_escape_string($data);

$sql = 'REPLACE

INTO sessions

VALUES (’$id’, ’$access’, ’$data’)';

return mysql_query($sql, $_sess_db);

}

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 便携式XPDM露点仪-在线式防爆露点仪-增强型烟气分析仪-约克仪器 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 浩方智通 - 防关联浏览器 - 跨境电商浏览器 - 云雀浏览器 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 减速机_上海宜嘉减速机| PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 公交驾校-北京公交驾校欢迎您!| 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 超声骨密度仪-骨密度检测仪-经颅多普勒-tcd仪_南京科进实业有限公司 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 云南成人高考网| 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 路面机械厂家| 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 |