加密存儲模型

SSL/SSH 能保護用戶端和伺服器端交換的資料,但 SSL/SSH 並不能保護資料庫中已有的資料。SSL 只是一個加密網路資料流的協定。

若果攻擊者取得了直接訪問資料庫的許可(繞過 web 伺服器),敏感資料就可能暴露或是被濫用,除非資料庫自己保護了這些訊息。對資料庫內的資料加密是減少這類風險的有效途徑,但是只有很少的資料庫提供這些加密功能。

對於這個問題,有一個簡單的解決辦法,就是建立自己的加密機制,然後把它用在 PHP 程式內。PHP 有幾個增加庫可以完成這個工作,比如說 McryptMhash 等,它們包括多種加密運算法則。腳本在插入資料庫之前先把資料加密,以後提取出來時再解密。有關加密如何工作的例子請參考關聯手冊。

對某些真正隱蔽的資料,若果不需要以明文的形式存在(即不用顯示),可以考慮用散列算法。使用散列算法最常見的例子就是把密碼經由 MD5 加密後的散列存進資料庫來代替原來的明文密碼。參見 crypt()md5()

例子 27-1. 對密碼欄位進行散列加密

<?php

// 存儲密碼散列
$query  sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            
addslashes($username), md5($password));
$result pg_query($connection$query);

// 傳送請求來驗證會員密碼
$query sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
            
addslashes($username), md5($password));
$result pg_query($connection$query);

if (
pg_num_rows($result) > 0) {
    echo 
'Welcome, $username!';
} else {
    echo 
'Authentication failed for $username.';
}

?>