首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 安全程式設計:加密與雜湊功能深度解析

     編輯:PHP 綜合知識

前言:資料加密的重要性

隨著網路交易與資料傳輸量暴增,資料加密已成為現代應用程式的基礎防線。PHP 內建多種加密函數,並支援強大的擴展庫(Mcrypt、Mhash),為開發者提供完整的密碼學工具箱。

基礎密碼學概念

  • 加密:將明文轉換為密文
  • 解密:將密文還原為明文
  • 單向加密(雜湊):只能加密,無法解密,常用於密碼驗證
  • Salt(干擾字串):增加加密隨機性,防止預計算攻擊(如 Rainbow Table)

PHP 內建加密函數

crypt() - 單向加密

string crypt(string $input_string [, string $salt])

支援四種演算法(由 CRYPT_SALT_LENGTH 決定):

演算法Salt 長度
CRYPT_STD_DES2 字元(預設)
CRYPT_EXT_DES9 字元
CRYPT_MD512 字元,以 $1$ 開頭
CRYPT_BLOWFISH16 字元,以 $2$ 開頭

實作:Apache Basic Auth + MySQL 密碼驗證

<?php
$host = "localhost"; $user = "zorro"; $pswd = "hellodolly"; $db = "users";
$authorization = 0;

if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) {
    mysql_pconnect($host, $user, $pswd) or die("無法連線 MySQL");
    mysql_select_db($db) or die("無法選擇資料庫");

    // 以密碼前兩字元為 salt 進行 crypt 加密
    $salt = substr($PHP_AUTH_PW, 0, 2);
    $encrypted_pswd = crypt($PHP_AUTH_PW, $salt);

    $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="Private"');
    header('HTTP/1.0 401 Unauthorized');
    print "您無權進入此區域。";
    exit;
} else {
    print "這是機密資料!";
}
?>

注意:預設 DES 強度較低,高安全性需求請改用 MD5 或 Blowfish,或改用下述擴展庫。

md5() - 訊息摘要雜湊

<?php
$msg = "This is some message that I just wrote";
$enc_msg = md5($msg);
print "hash: $enc_msg"; 
// 輸出:81ea092649ca32b5ba375e81d8f4972c (32 字元十六進位)
?>

特性:

  • 固定輸出 128-bit (32 字元)
  • 雪崩效應:輸入微小變化導致輸出劇烈不同
  • 適用於檔案完整性驗證、數位簽章、密碼儲存

進階擴展庫:Mcrypt(雙向加密)

Mcrypt 提供 22 種演算法(Blowfish、RC2、Rijndael/AES、Twofish 等)與 35 個函數,支援加密與解密。

安裝

# 下載編譯
wget ftp://argeas.cs-net.gr/pub/unix/mcrypt/mcrypt-2.5.7.tar.gz
tar -xzf mcrypt-2.5.7.tar.gz
cd mcrypt-2.5.7
./configure --disable-posix-threads
make && make install

# PHP 重新編譯
cd /path/to/php
./configure --with-mcrypt=[mcrypt安裝目錄] [其他選項]
make && make install

加解密範例

<?php
$string = "Applied Cryptography, by Bruce Schneier...";
$key = "Four score and twenty years ago";
$cipher_alg = MCRYPT_RIJNDAEL_128; // AES-128

// 建立初始化向量 (IV)
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND);

// 加密 (CBC 模式)
$encrypted_string = mcrypt_encrypt($cipher_alg, $key, $string, MCRYPT_MODE_CBC, $iv);
print "Encrypted: " . bin2hex($encrypted_string) . "<p>";

// 解密
$decrypted_string = mcrypt_decrypt($cipher_alg, $key, $encrypted_string, MCRYPT_MODE_CBC, $iv);
print "Decrypted: $decrypted_string";
?>

關鍵函數:mcrypt_encrypt()、mcrypt_decrypt()、mcrypt_create_iv()(建立 IV 確保同樣明文加密結果不同)。

Mhash 擴展庫(多種雜湊演算法)

支援 12 種演算法:MD5、SHA1、HAVAL、RIPEMD160、TIGER、GOST、CRC32 等。

安裝

wget https://sourceforge.net/projects/mhash/mhash-0.8.3.tar.gz
tar -xzf mhash-0.8.3.tar.gz
cd mhash-0.8.3
./configure && make && make install

cd /path/to/php
./configure --with-mhash=[mhash安裝目錄] [其他選項]
make && make install

Windows 可至 php4win.de 下載含 Mhash 的套件。

使用範例

<?php
$hash_alg = MHASH_TIGER;
$message = "These are the directions to the secret fort...";
$hashed_message = mhash($hash_alg, $message);
print "The hashed message is " . bin2hex($hashed_message);
// 輸出:07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461
?>

取得演算法名稱:mhash_get_hash_name($hash_alg)。

關鍵提醒:傳輸層安全

PHP 是伺服器端技術,**無法保護客戶端與伺服器間的傳輸安全**。完整安全架構必須搭配 Apache-SSL (mod_ssl) 或其他 TLS/SSL 方案,確保傳輸通道加密。

結論

PHP 提供完整加密生態系:

  • 內建 crypt()(單向)、md5()(雜湊)
  • Mcrypt 擴展提供工業級雙向加密(AES、Blowfish 等)
  • Mhash 提供多樣化雜湊演算法

記住:應用層加密需搭配傳輸層加密(HTTPS),才能構建真正安全的系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved