SSL/SSH 保护从客户端到服务器的数据传输:SSL/SSH 并不保护存储在数据库中的持久性数据。SSL 是线上传输协议。
一旦攻击者直接访问您的数据库(绕过Web服务器),存储的敏感数据可能会被泄露或滥用,除非信息本身受到数据库的保护。加密数据是减轻此威胁的一种好方法,但很少有数据库提供这种类型的数据加密。
解决此问题的最简单方法是首先创建您自己的加密包,然后在您的PHP脚本中使用它。PHP 可以通过几个扩展来帮助您完成此操作,例如OpenSSL 和 Sodium,涵盖各种加密算法。脚本在将数据插入数据库之前对其进行加密,并在检索时对其进行解密。请参阅参考资料以了解加密工作原理的更多示例。
对于真正隐藏的数据,如果不需要其原始表示(即不会显示),则应考虑使用哈希。哈希的知名示例是在数据库中存储密码的加密哈希,而不是密码本身。
password 函数提供了一种方便的方法来哈希敏感数据并使用这些哈希值。
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) . ' 身份验证失败.';
}
?>