SSL/SSH 保護從客戶端傳輸到伺服器的資料:SSL/SSH 不保護儲存在資料庫中的持續性資料。SSL 是一種線上協定。
一旦攻擊者直接存取您的資料庫(繞過網路伺服器),儲存的敏感資料可能會被暴露或濫用,除非資訊受到資料庫本身的保護。加密資料是降低這種威脅的好方法,但很少有資料庫提供這種資料加密。
解決此問題最簡單的方法是先建立自己的加密套件,然後在您的 PHP 腳本中使用它。PHP 可以透過幾個擴充功能來協助您完成這項工作,例如 OpenSSL 和 Sodium,涵蓋了各種加密演算法。腳本在將資料插入資料庫之前先對其進行加密,並在擷取時進行解密。有關加密如何運作的更多範例,請參閱參考資料。
對於真正隱藏的資料,如果不需要它的原始表示形式(亦即不會顯示),則應考慮使用雜湊函數。雜湊函數一個眾所周知的例子是在資料庫中儲存密碼的加密雜湊值,而不是密碼本身。
「密碼」函數提供了一種便捷的方法來對敏感資料進行雜湊處理,並使用這些雜湊值。
password_hash() 用於使用目前最強大的演算法對給定字串進行雜湊處理,而 password_verify() 則檢查給定的密碼是否與儲存在資料庫中的雜湊值相符。
範例 #1 對密碼欄位進行雜湊處理
<?php
// 儲存密碼雜湊值
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username),
password_hash($password, PASSWORD_DEFAULT));
$result = pg_query($connection, $query);
// 查詢使用者是否提交了正確的密碼
$query = sprintf("SELECT pwd FROM users WHERE name='%s';",
pg_escape_string($username));
$row = pg_fetch_assoc(pg_query($connection, $query));
if ($row && password_verify($password, $row['pwd'])) {
echo '歡迎,' . htmlspecialchars($username) . '!';
} else {
echo ' ' . htmlspecialchars($username) . ' 的驗證失敗。';
}
?>