廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 1851 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
t0306894 手機
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎
頭銜:
版主
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[PHP][教學] PHP的數據加密
PHP提供了crypt()函數完成加密功能:
string crypt (string input_string [, string salt])


這一函數完成被稱作單向加密的功能,也就是說,它可以加密一些明碼,但不能夠將密碼轉換為原來的明碼。單向加密的口令一旦落入第三方人的手裏,由於不能被還原為明文,因此也沒有什麼大用處。在驗證用戶輸入的口令時,用戶的輸入採用的也是單向演算法,如果輸入與存儲的經加密後的口令相匹配,則輸入的口令一定是正確的。

這個函數的input_string參數是需要加密的字串,第二個參數salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預計算攻擊的可能性。缺省情況下,PHP使用一個2個字元的DES干擾串,如果你的系統使用的是MD5 ,它會使用一個12個字元的干擾串。我們可以通過執行下面的命令發現系統將要使用的干擾串的長度:

print "系統使用的干擾串的長度是:". CRYPT_SALT_LENGTH;

crypt()支援四種演算法,下面是它支援的演算法和相應的salt參數的長度:
[注:以下用表格]
演算法 Salt長度
CRYPT_STD_DES
2-character (默認)
CRYPT_EXT_DES
9-character
CRYPT_MD5
12-character beginning with $1$
CRYPT_BLOWFISH
16-character beginning with $2$

怎樣將PHP的資料加密功能應用於用戶驗證?

我們用crypt()實現用戶身份驗證。比如我們用一段PHP程式限制對一個目錄的訪問,只允許註冊用戶訪問這一目錄。我們把資料存儲MySQL資料庫的一個表(這個資料表名為members)中:
mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY(username)
->);

然後,我們可以輸入用戶的資料到該表中:
用戶名 密碼

Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U

這些加密的口令對應的明碼分別是Tom、John和Bill。我們將根據口令的前二個字母創建干擾串:
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);

// $userPswd然後就和用戶名一起存儲在MySQL 中

crypt()和Apache的口令-應答驗證系統的應用
<?php
$host = "localhost"; //主機
$username = "Tom"; //用戶名
$passwd = "Hello world"; //密碼
$db = "users"; //資料庫名

// 設置是否通過驗證標誌,默認為否
$authorization = 0;

// 提示用戶輸入帳號和密碼

if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
mysql_pconnect($host, $username, $passwd) or die("不能連接到MySQL服務器!";
mysql_select_db($db) or die("不能選擇資料庫!";

// 進行加密
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);

//SQL查詢語句
$query = "SELECT username FROM members WHERE username = '$PHP_AUTH_USER' AND password = '$encrypted_pswd'";

// 執行查詢
if (mysql_numrows(mysql_query($query)) == 1) {
$authorization = 1;
}
}

if (! $authorization){
header(WWW-Authenticate: Basic realm="用戶驗證"');
header('HTTP/1.0 401 Unauthorized');
print "無法通過驗證";
exit;
}else {
print "已經加密";
}
?>

在缺省狀態下使用的 crypt()並不是最安全的,所以如果需要較高的安全性能,就需要其他更好的演算法,比如md5(),這一函數使用MD5散列演算法。

如何通過MD5方式進行加密?

PHP中通過MD5方式加密的函數有md5(),它的一個作用是混編。

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

使用md5()混編字串
<php
$input = "Hello,PHP world!";
$output = md5($input);
print "輸出: $output ";
?>

結果:

輸出: 7996b5e0804042fd531907a4900f190e

注意,結果的長度為32個字元。我們把$input的值稍微改變一下:

使用md5()對一個稍微變化的字串進行混編
<?php
$input = "Hello,PHP World!";
$output = md5($input);
print "輸出: $output ";
?>

結果:

hash2: f0456d48ed06a5c35b1e42561fa7a016
可以發現,儘管二個結果的長度都是32個字元,但明文中一點微小的變化使得結果發生了很大的變化,我們可以利用這個特點來檢查資料中微小變化。



介紹大家一個透過facebook來玩的網頁遊戲 : 海盜王
獻花 x0 回到頂端 [樓 主] From:台灣中華電信 | Posted:2005-02-12 20:06 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.059416 second(s),query:15 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言