PHP8 加密存儲模型

2023-08-23 10:54 更新

SSL/SSH 能保護(hù)客戶端和服務(wù)器端交換的數(shù)據(jù),但 SSL/SSH 并不能保護(hù)數(shù)據(jù)庫中已有的數(shù)據(jù)。SSL 只是一個加密網(wǎng)絡(luò)數(shù)據(jù)流的協(xié)議。

如果攻擊者取得了直接訪問數(shù)據(jù)庫的許可(繞過 web 服務(wù)器),敏感數(shù)據(jù)就可能暴露或者被濫用,除非數(shù)據(jù)庫自己保護(hù)了這些信息。對數(shù)據(jù)庫內(nèi)的數(shù)據(jù)加密是減少這類風(fēng)險的有效途徑,但是只有很少的數(shù)據(jù)庫提供這些加密功能。

解決這個問題最簡單的方法是創(chuàng)建自己的加密包,然后在 PHP 腳本中使用它。PHP 可以通過一些擴(kuò)展來幫助你解決這個問題,比如 OpenSSL 和 Sodium,涵蓋了多種加密算法。腳本在將數(shù)據(jù)插入數(shù)據(jù)庫之前對其進(jìn)行加密,并在檢索時對其進(jìn)行解密。更多關(guān)于加密工作的例子請參見參考文獻(xiàn)。

散列

在真正隱藏數(shù)據(jù)的情況下,如果不需要其原始表示(即不會顯示),則應(yīng)考慮散列。眾所周知的哈希示例是將密碼的加密哈希存儲在數(shù)據(jù)庫中,而不是密碼本身。

密碼函數(shù)提供了一種對敏感數(shù)據(jù)進(jìn)行哈希處理并使用這些哈希值的便捷方法。

password_hash() 用于使用當(dāng)前可用的最強算法對給定字符串進(jìn)行哈希處理,password_verify() 檢查給定密碼是否與數(shù)據(jù)庫中存儲的哈希值匹配。

示例 #1 Hashing password field

<?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);

// 發(fā)送請求來驗證用戶密碼
$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 'Welcome, ' . htmlspecialchars($username) . '!';
} else {
echo 'Authentication failed for ' . htmlspecialchars($username) . '.';
}

?>


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號