綜述:密碼學(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);
新聞熱點(diǎn)
疑難解答