我需要安全地存储一些可由授权用户在网站上检索的数据。这不是信用卡,但同样是您不希望有人接触到的数据。
唯一会检索数据的用户是发布数据的用户。
所以,我正在考虑把一些东西放在一起,如下所示:
- 一切都通过 SSL 运行
- 要登录,用户将输入他们的用户名和密码,并且还必须上传“密钥”文件 - 建议用户只在拇指驱动器或类似设备上保留一份密钥文件的副本
- 用户的密钥不会物理存储在服务器上。当用户提供他们的登录密钥时,它将存储在内存中
- 所有存储的数据都将使用 MCRYPT_RIJNDAEL_256 加密,用于加密的密钥将是他们必须上传的密钥文件的一部分(即未存储在服务器上的文件)
- 当用户的密钥保存在内存中时,这也将使用 MCRYPT_RIJNDAEL_256 使用每天更改的密钥进行加密
- 我们将在检索数据时生成一个新的 32 字节 IV,因此对于两次单独的检索我们应该得到不同的结果
- 用户可以在需要时重新生成他们的密钥,此时所有存储的数据都用他们的新密钥重新加密
- 用户可以在他们的密钥的内存存储中设置超时 - 要求他们(例如)每 30 分钟重新提供一次。
- 用户还可以在内存存储上设置非活动超时,因此假设他们在(例如)5 分钟内不执行操作,它也会使密钥过期
- 盒子本身将被锁定,仅将端口 80 和端口 22 暴露给单个 IP(我们的办公室 IP)
我的问题是:
我的想法是否正确?上述解决方案是安全的,还是我错过了一些可以轻松获取数据的攻击向量?
据我所知,攻击者需要对机器进行物理访问(或者需要在我们的办公室网络上),即使是这种情况,他们也只能检索当时登录的用户的数据(因为它们是唯一可以存储的密钥)?我的假设正确吗?
有什么方法可以消除在用户登录时将用户密钥存储在内存中的要求(没有要求他们在每次请求时重新提供密钥)?我不认为有,但我希望这是我没有想到的。
谢谢!