PHP中的MD5加密
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 19:04:55 作者:佚名
我要評(píng)論

綜述:密碼學(xué)是研究編制密碼(我們簡(jiǎn)稱為加密:encode)和破譯密碼(我們稱之為解密:decode)的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報(bào)的,稱為破譯學(xué),總稱密碼學(xué)。通常情況下,人們將可懂的文本
綜述:密碼學(xué)是研究編制密碼(我們簡(jiǎn)稱為加密:encode)和破譯密碼(我們稱之為解密:decode)的技術(shù)科學(xué)。研究密碼變化的客觀規(guī)律,應(yīng)用于編制密碼以保守通信秘密的,稱為編碼學(xué);應(yīng)用于破譯密碼以獲取通信情報(bào)的,稱為破譯學(xué),總稱密碼學(xué)。通常情況下,人們將可懂的文本稱為明文;將明文變換成的不可懂的文本稱為密文。把明文變換成密文的過(guò)程叫加密;其逆過(guò)程,即把密文變換成明文的過(guò)程叫解密。
??PHP中提供了哪些數(shù)據(jù)加密功能?
??PHP提供了crypt()函數(shù)完成加密功能:
????string crypt (string input_string [, string salt])
??這一函數(shù)完成被稱作單向加密的功能,也就是說(shuō),它可以加密一些明碼,但不能夠?qū)⒚艽a轉(zhuǎn)換為原來(lái)的明碼。單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒(méi)有什么大用處。在驗(yàn)證用戶輸入的口令時(shí),用戶的輸入采用的也是單向算法,如果輸入與存儲(chǔ)的經(jīng)加密后的口令相匹配,則輸入的口令一定是正確的。
??這個(gè)函數(shù)的input_string參數(shù)是需要加密的字符串,第二個(gè)參數(shù)salt是一個(gè)位字串,它能夠影響加密的暗碼,進(jìn)一步地排除被稱作預(yù)計(jì)算攻擊的可能性。缺省情況下,PHP使用一個(gè)2個(gè)字符的DES干擾串,如果你的系統(tǒng)使用的是MD5 ,它會(huì)使用一個(gè)12個(gè)字符的干擾串。我們可以通過(guò)執(zhí)行下面的命令發(fā)現(xiàn)系統(tǒng)將要使用的干擾串的長(zhǎng)度:
????print "系統(tǒng)使用的干擾串的長(zhǎng)度是:". CRYPT_SALT_LENGTH;
??crypt()支持四種算法,下面是它支持的算法和相應(yīng)的salt參數(shù)的長(zhǎng)度:
[注:以下用表格]
算法 Salt長(zhǎng)度
CRYPT_STD_DES 2-character (默認(rèn))
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$
??怎樣將PHP的數(shù)據(jù)加密功能應(yīng)用于用戶驗(yàn)證?
??我們用crypt()實(shí)現(xiàn)用戶身份驗(yàn)證。比如我們用一段PHP程序限制對(duì)一個(gè)目錄的訪問(wèn),只允許注冊(cè)用戶訪問(wèn)這一目錄。我們把資料存儲(chǔ)MySQL數(shù)據(jù)庫(kù)的一個(gè)表(這個(gè)數(shù)據(jù)表名為members)中:
????mysql>CREATE TABLE members (
????->username CHAR(14) NOT NULL,
????->password CHAR(32) NOT NULL,
????->PRIMARY KEY(username)
????->);
??然后,我們可以輸入用戶的數(shù)據(jù)到該表中:
用戶名 密碼
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U
??這些加密的口令對(duì)應(yīng)的明碼分別是Tom、John和Bill。我們將根據(jù)口令的前二個(gè)字母創(chuàng)建干擾串:
????$enteredPassword.
????$salt = substr($enteredPassword, 0, 2);
????$userPswd = crypt($enteredPassword, $salt);
????// $userPswd然后就和用戶名一起存儲(chǔ)在MySQL 中
??crypt()和Apache的口令-應(yīng)答驗(yàn)證系統(tǒng)的應(yīng)用
????<?php
????$host = "localhost"; //主機(jī)
????$username = "Tom"; //用戶名
????$passwd = "Hello world"; //密碼
????$db = "users"; //數(shù)據(jù)庫(kù)名
????// 設(shè)置是否通過(guò)驗(yàn)證標(biāo)志,默認(rèn)為否
????$authorization = 0;
????// 提示用戶輸入帳號(hào)和密碼
????if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
??????mysql_pconnect($host, $username, $passwd) or die("不能連接到MySQL服務(wù)器!");
??????mysql_select_db($db) or die("不能選擇數(shù)據(jù)庫(kù)!");
??????// 進(jìn)行加密
??????$salt = substr($PHP_AUTH_PW, 0, 2);
??????$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
??????//SQL查詢語(yǔ)句
??????$query = "SELECT username FROM members WHERE username = \'$PHP_AUTH_USER\' AND password = \'$encrypted_pswd\'";
??????// 執(zhí)行查詢
??????if (mysql_numrows(mysql_query($query)) == 1) {
????????$authorization = 1;
??????}
????}
????if (! $authorization){
??????header(\'WWW-Authenticate: Basic realm="用戶驗(yàn)證"\');
??????header(\'HTTP/1.0 401 Unauthorized\');
??????print "無(wú)法通過(guò)驗(yàn)證";
??????exit;
????}else {
??????print "已經(jīng)加密";
????}
?????>
??在缺省狀態(tài)下使用的 crypt()并不是最安全的,所以如果需要較高的安全性能,就需要其他更好的算法,比如md5(),這一函數(shù)使用MD5散列算法。
??如何通過(guò)MD5方式進(jìn)行加密?
??PHP中通過(guò)MD5方式加密的函數(shù)有md5(),它的一個(gè)作用是混編。
??一個(gè)混編函數(shù)可以將一個(gè)可變長(zhǎng)度的信息變換為具有固定長(zhǎng)度被混編過(guò)的輸出,也被稱作"信息文摘",這是十分有用的,因?yàn)?一個(gè)固定長(zhǎng)度的字符串可以用來(lái)檢查文件的完整性和驗(yàn)證數(shù)字簽名與用戶身份。PHP內(nèi)置的md5()混編函數(shù)將把一個(gè)可變長(zhǎng)度的信息轉(zhuǎn)換為128位(32個(gè)字符)的信息文摘。混編的一個(gè)有趣的特點(diǎn)是:不能通過(guò)分析混編后的信息得到原來(lái)的明碼,因?yàn)榛炀幒蟮慕Y(jié)果 與原來(lái)的明碼內(nèi)容沒(méi)有依賴關(guān)系。即便只改變一個(gè)字符串中的一個(gè)字符,也將使得MD5混編算法計(jì)算出二個(gè)截然不同的結(jié)果。我們首先來(lái)看下表的內(nèi)容及其相應(yīng)的結(jié)果:
??使用md5()混編字符串
????<php
????$input = "Hello,PHP world!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????輸出: 7996b5e0804042fd531907a4900f190e
??注意,結(jié)果的長(zhǎng)度為32個(gè)字符。我們把$input的值稍微改變一下:
??使用md5()對(duì)一個(gè)稍微變化的字符串進(jìn)行混編
????<?php
????$input = "Hello,PHP World!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????hash2: f0456d48ed06a5c35b1e42561fa7a016
??可以發(fā)現(xiàn),盡管二個(gè)結(jié)果的長(zhǎng)度都是32個(gè)字符,但明文中一點(diǎn)微小的變化使得結(jié)果發(fā)生了很大的變化,我們可以利用這個(gè)特點(diǎn)來(lái)檢查數(shù)據(jù)中微小變化。
??PHP中提供了哪些數(shù)據(jù)加密功能?
??PHP提供了crypt()函數(shù)完成加密功能:
????string crypt (string input_string [, string salt])
??這一函數(shù)完成被稱作單向加密的功能,也就是說(shuō),它可以加密一些明碼,但不能夠?qū)⒚艽a轉(zhuǎn)換為原來(lái)的明碼。單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒(méi)有什么大用處。在驗(yàn)證用戶輸入的口令時(shí),用戶的輸入采用的也是單向算法,如果輸入與存儲(chǔ)的經(jīng)加密后的口令相匹配,則輸入的口令一定是正確的。
??這個(gè)函數(shù)的input_string參數(shù)是需要加密的字符串,第二個(gè)參數(shù)salt是一個(gè)位字串,它能夠影響加密的暗碼,進(jìn)一步地排除被稱作預(yù)計(jì)算攻擊的可能性。缺省情況下,PHP使用一個(gè)2個(gè)字符的DES干擾串,如果你的系統(tǒng)使用的是MD5 ,它會(huì)使用一個(gè)12個(gè)字符的干擾串。我們可以通過(guò)執(zhí)行下面的命令發(fā)現(xiàn)系統(tǒng)將要使用的干擾串的長(zhǎng)度:
????print "系統(tǒng)使用的干擾串的長(zhǎng)度是:". CRYPT_SALT_LENGTH;
??crypt()支持四種算法,下面是它支持的算法和相應(yīng)的salt參數(shù)的長(zhǎng)度:
[注:以下用表格]
算法 Salt長(zhǎng)度
CRYPT_STD_DES 2-character (默認(rèn))
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$
??怎樣將PHP的數(shù)據(jù)加密功能應(yīng)用于用戶驗(yàn)證?
??我們用crypt()實(shí)現(xiàn)用戶身份驗(yàn)證。比如我們用一段PHP程序限制對(duì)一個(gè)目錄的訪問(wèn),只允許注冊(cè)用戶訪問(wèn)這一目錄。我們把資料存儲(chǔ)MySQL數(shù)據(jù)庫(kù)的一個(gè)表(這個(gè)數(shù)據(jù)表名為members)中:
????mysql>CREATE TABLE members (
????->username CHAR(14) NOT NULL,
????->password CHAR(32) NOT NULL,
????->PRIMARY KEY(username)
????->);
??然后,我們可以輸入用戶的數(shù)據(jù)到該表中:
用戶名 密碼
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U
??這些加密的口令對(duì)應(yīng)的明碼分別是Tom、John和Bill。我們將根據(jù)口令的前二個(gè)字母創(chuàng)建干擾串:
????$enteredPassword.
????$salt = substr($enteredPassword, 0, 2);
????$userPswd = crypt($enteredPassword, $salt);
????// $userPswd然后就和用戶名一起存儲(chǔ)在MySQL 中
??crypt()和Apache的口令-應(yīng)答驗(yàn)證系統(tǒng)的應(yīng)用
????<?php
????$host = "localhost"; //主機(jī)
????$username = "Tom"; //用戶名
????$passwd = "Hello world"; //密碼
????$db = "users"; //數(shù)據(jù)庫(kù)名
????// 設(shè)置是否通過(guò)驗(yàn)證標(biāo)志,默認(rèn)為否
????$authorization = 0;
????// 提示用戶輸入帳號(hào)和密碼
????if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
??????mysql_pconnect($host, $username, $passwd) or die("不能連接到MySQL服務(wù)器!");
??????mysql_select_db($db) or die("不能選擇數(shù)據(jù)庫(kù)!");
??????// 進(jìn)行加密
??????$salt = substr($PHP_AUTH_PW, 0, 2);
??????$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
??????//SQL查詢語(yǔ)句
??????$query = "SELECT username FROM members WHERE username = \'$PHP_AUTH_USER\' AND password = \'$encrypted_pswd\'";
??????// 執(zhí)行查詢
??????if (mysql_numrows(mysql_query($query)) == 1) {
????????$authorization = 1;
??????}
????}
????if (! $authorization){
??????header(\'WWW-Authenticate: Basic realm="用戶驗(yàn)證"\');
??????header(\'HTTP/1.0 401 Unauthorized\');
??????print "無(wú)法通過(guò)驗(yàn)證";
??????exit;
????}else {
??????print "已經(jīng)加密";
????}
?????>
??在缺省狀態(tài)下使用的 crypt()并不是最安全的,所以如果需要較高的安全性能,就需要其他更好的算法,比如md5(),這一函數(shù)使用MD5散列算法。
??如何通過(guò)MD5方式進(jìn)行加密?
??PHP中通過(guò)MD5方式加密的函數(shù)有md5(),它的一個(gè)作用是混編。
??一個(gè)混編函數(shù)可以將一個(gè)可變長(zhǎng)度的信息變換為具有固定長(zhǎng)度被混編過(guò)的輸出,也被稱作"信息文摘",這是十分有用的,因?yàn)?一個(gè)固定長(zhǎng)度的字符串可以用來(lái)檢查文件的完整性和驗(yàn)證數(shù)字簽名與用戶身份。PHP內(nèi)置的md5()混編函數(shù)將把一個(gè)可變長(zhǎng)度的信息轉(zhuǎn)換為128位(32個(gè)字符)的信息文摘。混編的一個(gè)有趣的特點(diǎn)是:不能通過(guò)分析混編后的信息得到原來(lái)的明碼,因?yàn)榛炀幒蟮慕Y(jié)果 與原來(lái)的明碼內(nèi)容沒(méi)有依賴關(guān)系。即便只改變一個(gè)字符串中的一個(gè)字符,也將使得MD5混編算法計(jì)算出二個(gè)截然不同的結(jié)果。我們首先來(lái)看下表的內(nèi)容及其相應(yīng)的結(jié)果:
??使用md5()混編字符串
????<php
????$input = "Hello,PHP world!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????輸出: 7996b5e0804042fd531907a4900f190e
??注意,結(jié)果的長(zhǎng)度為32個(gè)字符。我們把$input的值稍微改變一下:
??使用md5()對(duì)一個(gè)稍微變化的字符串進(jìn)行混編
????<?php
????$input = "Hello,PHP World!";
????$output = md5($input);
????print "輸出: $output ";
?????>
??結(jié)果:
????hash2: f0456d48ed06a5c35b1e42561fa7a016
??可以發(fā)現(xiàn),盡管二個(gè)結(jié)果的長(zhǎng)度都是32個(gè)字符,但明文中一點(diǎn)微小的變化使得結(jié)果發(fā)生了很大的變化,我們可以利用這個(gè)特點(diǎn)來(lái)檢查數(shù)據(jù)中微小變化。
相關(guān)文章
- 自從無(wú)線網(wǎng)絡(luò)誕生之日起,“安全”這個(gè)詞就始終如影隨形的伴隨在“無(wú)線”的身邊。攻與防如同親兄弟一樣,無(wú)論你加密手段多么的先進(jìn),不久之后就會(huì)有各種各樣的破解方式出現(xiàn)2008-10-08
- 本文總結(jié)幾個(gè)破解路由器密碼的方法以及如何實(shí)現(xiàn)內(nèi)網(wǎng)中反彈木馬的上線: 一.掃描路由器端口為了路由器的安全,網(wǎng)管通常都會(huì)將路由器的默認(rèn)端口(80)給更改掉,所以我2008-10-08
- 今天我們社團(tuán)學(xué)弟拿了一個(gè)高強(qiáng)度文件夾加密大師給社長(zhǎng)試試,說(shuō)是一個(gè)這加密文件夾很好的東西,可以把私藏的物品放在文件夾然后加密文件夾。我處于好奇也跟了上去看看。他又2008-10-08
輕松破解無(wú)線網(wǎng)絡(luò)WEP密碼上篇
近些年無(wú)線技術(shù)發(fā)展迅速,越來(lái)越多的用戶使用無(wú)線設(shè)備在自己家建立起無(wú)線網(wǎng)絡(luò),通過(guò)搭建無(wú)線網(wǎng)絡(luò)可以在家里的每個(gè)角落使用筆記本和無(wú)線網(wǎng)卡訪問(wèn)internet。有很多文章都向大2008-10-08- RAR是一款常見(jiàn)的壓縮格式,主要運(yùn)用于文件的存儲(chǔ)與傳遞。互聯(lián)網(wǎng)上提供下載的資源中,RAR格式占很大比重。出于安全的需求以及隱私的保護(hù),有相當(dāng)一部分的RAR文件被加上了密2008-10-08
輕松破解無(wú)線網(wǎng)絡(luò)WEP密碼下篇
上期為各位介紹了將自己的網(wǎng)卡重新安裝驅(qū)動(dòng),以便使用無(wú)線網(wǎng)絡(luò)檢測(cè)及WEP解密工具。當(dāng)我們把網(wǎng)卡驅(qū)動(dòng)更新完畢后,我們?cè)賮?lái)看看如何找出已經(jīng)禁用了SSID號(hào)廣播的無(wú)線網(wǎng)絡(luò)以及2008-10-08- 網(wǎng)上流傳的幾種破解mysql root密碼的幾種方法: 方法一 使用phpmyadmin,這是最簡(jiǎn)單的了,修改mysql庫(kù)的user表,不過(guò)別忘了使用PASSWORD函數(shù)。 方法二 使2008-10-08
如何強(qiáng)行破解臺(tái)式電腦的開(kāi)機(jī)密碼?破解方法介紹
你還在為忘記密碼無(wú)法開(kāi)機(jī)而發(fā)愁嗎?你還在為沒(méi)有密碼無(wú)法打開(kāi)電腦而著急嗎?本章將大家一個(gè)巧妙的小招數(shù),讓你輕松解開(kāi)任何一個(gè)電腦的開(kāi)機(jī)密碼,非常實(shí)用2013-07-22量子計(jì)算機(jī)輕松破解加密算法 如何破解加密算法?
最近有電腦用戶反應(yīng)量子計(jì)算機(jī)可以破解下載的所有的加密算法嗎?其實(shí)也不是不可以,下面虛擬就為大家講解買臺(tái)量子計(jì)算機(jī),如何分分鐘破解加密算法2016-09-26