2024年PHP日本大会

加密存储模型

SSL/SSH 保护从客户端到服务器的数据传输:SSL/SSH 并不保护存储在数据库中的持久性数据。SSL 是线上传输协议。

一旦攻击者直接访问您的数据库(绕过Web服务器),存储的敏感数据可能会被泄露或滥用,除非信息本身受到数据库的保护。加密数据是减轻此威胁的一种好方法,但很少有数据库提供这种类型的数据加密。

解决此问题的最简单方法是首先创建您自己的加密包,然后在您的PHP脚本中使用它。PHP 可以通过几个扩展来帮助您完成此操作,例如OpenSSLSodium,涵盖各种加密算法。脚本在将数据插入数据库之前对其进行加密,并在检索时对其进行解密。请参阅参考资料以了解加密工作原理的更多示例。

哈希

对于真正隐藏的数据,如果不需要其原始表示(即不会显示),则应考虑使用哈希。哈希的知名示例是在数据库中存储密码的加密哈希,而不是密码本身。

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) . ' 身份验证失败.';
}

?>
添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top