我正在构建一个安全系统,它将消息存储在 Postgresql 数据库中的服务器上。消息使用 PHP 的openssl_encrypt()函数和该AES-256-CBC
方法加密存储。
目前,用于此功能的密钥(我们称之为 ApplicationKey)作为文件存储在服务器上,只有 www-data 用户 (0400) 的读取权限。
但是该文件存在于服务器上......我实际上不想要的东西。因此,我构建了另一层安全性,通过 UserHash 在本地获取密钥。
新层的定义:
我没有将密钥以纯文本形式存储在服务器的文件系统上,而是为每个用户创建了一个加密版本的 ApplicationKey 并将它们存储在数据库中:
UserCipherKey = 加密(ApplicationKey和UserHash)
storeInDb(UserId,UserCipherKey)
然后,该表包含来自每个用户的 ApplicationKey 的加密密码。这个用于加密的UserHash是通过以下方式构造的:
UserHash = sha256(用户密码+用户名+Blowfish)
其中UserPassword和UserName都由客户端填写,Blowfish来自服务器。此 UserHash 是用于解锁加密消息的 ApplicationKey 的密钥。
因为我不希望用户每次请求页面时都输入他/她的密码,所以我想将 UserHash 存储在某个位置,最好有时间限制,例如 30 分钟的非活动使用时间。
使用 PHP 会话听起来是正确的,因为它绑定到客户端,客户端关闭窗口-> 会话被破坏;在不活动后会话被破坏等等......但是这个会话中的数据也存储在服务器文件系统上;所以我们回到第一方......因为如果文件系统受到破坏,带有 sess_* 文件的目录将被暴露,哈希值也会......你明白我的担忧吗?
我的问题/顾虑
1 - 如果我想在本地存储UserHash,还有其他东西可以使用,那么 php-session. 使用 HTML5 的本地存储是否比 php-sessions 更好/更安全?
2 - 如果有人丢失了他/她的密码,我们需要重新设置它;做这个的最好方式是什么?
3 - 还是我做错了什么?