国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP中的加密功能(1)

2024-05-04 23:02:15
字體:
來源:轉載
供稿:網友

 

 

數據加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網絡上發生的大量交易和傳輸的大量數據。如果對于采用安全措施有興趣的話,也一定會有興趣了解php提供的一系列安全功能。在本篇文章中,我們將介紹這些功能,提供一些基本的用法,以便你能夠為自己的應用軟件中增加安全功能。

預備知識
   
在詳細介紹php的安全功能之前,我們需要花點時間來向沒有接觸過這方面內容的讀者介紹一些有關密碼學的基本知識,如果對密碼學的基本概念已經非常熟悉,就可以跳過去這一部分。

   
密碼學可以通俗地被描述為對加/解密的研究和實驗,加密是將易懂的資料轉換為不易懂資料的過程,解密則是將不易懂的資料轉換為原來易懂資料的過程。不易懂的資料被稱作密碼,易懂的資料被稱作明碼。

   
數據的加/解密都需要一定的算法,這些算法可以非常地簡單,如著名的凱撒碼,但當前的加密算法要相對復雜得多,其中一些利用現有的方法甚至是無法破譯的。

php
的加密功能
   
只要有一點使用非windows平臺經驗的人可能對crypt()也相當熟悉,這一函數完成被稱作單向加密的功能,它可以加密一些明碼,但不能夠將密碼轉換為原來的明碼。盡管從表面上來看這似乎是一個沒有什么用處的功能,但它的確被廣泛用來保證系統密碼的完整性。因為,單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒有什么大用處。在驗證用戶輸入的口令時,用戶的輸入采用的也是單向算法,如果輸入與存儲的經加密后的口令相匹配,則輸入的口信一定是正確的。

   php
同樣提供了使用其crypt()函數完成單向加密功能的可能性。我將在這里簡要地介紹該函數:

   string crypt (string input_string [, string salt])
   
其中的input_string參數是需要加密的字符串,第二個可選的salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預計算攻擊的可能性。缺省情況下,php使用一個2個字符的des干擾串,如果你的系統使用的是md5(我將在以后介紹md5算法),它會使用一個12個字符的干擾串。順便說一下,可以通過執行下面的命令發現系統將要使用的干擾串的長度:

   print "my system salt size is: ". crypt_salt_length;
   
系統也可能支持其他的加密算法。crypt()支持四種算法,下面是它支持的算法和相應的salt參數的長度:

算法 salt長度
crypt_std_des 2-character (default)
crypt_ext_des 9-character
crypt_md5 12-character beginning with $1$
crypt_blowfish 16-character beginning with $2$

crypt()實現用戶身份驗證
   
作為crypt()函數的一個例子,考慮這樣一種情況,你希望創建一段php腳本程序限制對一個目錄的訪問,只允許能夠提供正確的用戶名和口令的用戶訪問這一目錄。我將把資料存儲在我喜歡的數據庫mysql的一個表中。下面我們以創建這個被稱作members的表開始我們的例子:

mysql>create table members (
   ->username char(14) not null,
   ->password char(32) not null,
   ->primary key(username)
   ->);

   
然后,我們假定下面的數據已經存儲在該表中:

用戶名 密碼
clark kelod1c377lke
bruce ba1t7vnz9awgk
peter paluvrwsrlz4u

   
這些加密的口令對應的明碼分別是kentbannerparker。注意一下每個口令的前二個字母,這是因為我使用了下面的代碼,根據口令的前二個字母創建干擾串的:

$enteredpassword.
$salt = substr($enteredpassword, 0, 2);
$userpswd = crypt($enteredpassword, $salt);
// $userpswd
然后就和用戶名一起存儲在mysql

   
我將使用apache的口令-應答認證配置提示用戶輸入用戶名和口令,一個鮮為人知的有關php的信息是,它可以把apache的口令-應答系統輸入的用戶名和口令識別為$php_auth_user$php_auth_pw,我將在身份驗證腳本中用到這二個變量。花一些時間仔細閱讀下面的腳本,多注意一下其中的解釋,以便更好地理解下面的代碼:

crypt()
apache的口令-應答驗證系統的應用
<?php

$host = "localhost";
$user = "zorro";
$pswd = "hellodolly";
$db = "users";

// set authorization to false

$authorization = 0;

// verify that user has entered username and password

if (isset($php_auth_user) && isset($php_auth_pw)) :

mysql_pconnect($host, $user, $pswd) or die("can't connect to mysql
server!");

mysql_select_db($db) or die("can't select database!");

// perform the encryption
$salt = substr($php_auth_pw, 0, 2);
$encrypted_pswd = crypt($php_auth_pw, $salt);

// build the query

$query = "select username from members where
username = '$php_auth_user' and
password = '$encrypted_pswd'";

// execute the query

if (mysql_numrows(mysql_query($query)) == 1) :
$authorization = 1;
endif;

endif;

// confirm authorization

if (! $authorization) :

header('www-authenticate: basic realm="private"');
header('http/1.0 401 unauthorized');
print "you are unauthorized to enter this area.";
exit;

else :

print "this is the secret data!";

endif;

?>

   
上面就是一個核實用戶訪問權限的簡單身份驗證系統。在使用crypt()保護重要的機密資料時,記住在缺省狀態下使用的crypt()并不是最安全的,只能用在對安全性要求較低的系統中,如果需要較高的安全性能,就需要我在本篇文章的后面介紹的算法。

   
下面我將介紹另一個php支持的函數━━md5(),這一函數使用md5散列算法,它有幾種很有趣的用法值得一提:

混編
   
一個混編函數可以將一個可變長度的信息變換為具有固定長度被混編過的輸出,也被稱作信息文摘。這是十分有用的,因為一個固定長度的字符串可以用來檢查文件的完整性和驗證數字簽名以及用戶身份驗證。由于它適合于phpphp內置的md5()混編函數將把一個可變長度的信息轉換為128位(32個字符)的信息文摘。混編的一個有趣的特點是不能通過分析混編后的信息得到原來的明碼,因為混編后的結果與原來的明碼內容沒有依賴關系。 即便只改變一個字符串中的一個字符,也將使得md5混編算法計算出二個截然不同的結果。我們首先來看下表的內容及其相應的結果:

 
使用md5()混編字符串
<?php
$msg = "this is some message that i just wrote";
$enc_msg = md5($msg);
print "hash: $enc_msg ";
?>

   
結果:

hash: 81ea092649ca32b5ba375e81d8f4972c
   
注意,結果的長度為32個字符。再來看一下下面的表,其中的$msg的值有了一點微小的變化:

使用md5()對一個稍微變化的字符串進行混編
<?php
//
注意,message中少了一個s
$msg = "this is some mesage that i just wrote";
$enc_msg = md5($msg);
print "hash2: $enc_msg <br /><br />";
?>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋江市| 富裕县| 安陆市| 荥经县| 阳城县| 朝阳县| 泰宁县| 股票| 常州市| 吉首市| 板桥市| 厦门市| 顺昌县| 贞丰县| 丹棱县| 桃园县| 思南县| 永福县| 大港区| 北海市| 定襄县| 张家港市| 洞头县| 东安县| 北宁市| 凤山市| 广安市| 高碑店市| 灌阳县| 花莲县| 张家口市| 重庆市| 玉山县| 县级市| 荥阳市| 吐鲁番市| 崇文区| 厦门市| 乳山市| 房产| 蕉岭县|