使用PHP安全地存储数据

时间:2013-03-22 23:53:29

标签: php security encryption

我要求安全存储一些可由网站上的授权用户检索的数据。这不是信用卡,但同样也是你不希望有人亲自动手的数据。

唯一将检索数据的用户是发布数据的用户。

所以,我正在考虑将以下内容放在一起:

  • 一切都通过SSL运行
  • 要登录,用户将输入他们的用户名和密码,并且还必须上传“密钥”文件 - 建议用户仅在拇指驱动器或类似文件上保留一个密钥文件副本
  • 用户的密钥不会物理存储在服务器上。当用户提供登录密钥时,它将存储在内存中
  • 所有存储的数据都将使用MCRYPT_RIJNDAEL_256加密,用于加密的密钥将成为他们必须上传的密钥文件的一部分(即未存储在服务器上的密钥文件)
  • 当用户的密钥保存在内存中时,也会使用MCRYPT_RIJNDAEL_256使用每日更改的密钥对其进行加密
  • 我们将在检索数据时生成一个新的32字节IV,因此我们应该为两次单独的检索获得不同的结果
  • 用户可以在需要时重新生成密钥,此时所有存储的数据都会使用新密钥重新加密
  • 用户可以设置其密钥的内存存储超时 - 要求他们每30分钟重新提供一次(例如)。
  • 用户还可以在内存存储器中设置非活动超时,因此假设他们不执行操作(例如)5分钟,它也会使密钥到期
  • 盒子本身将被锁定为仅将端口80和端口22暴露给单个IP(我们的办公室IP)

我的问题是:

我在思考正确的方向吗?以上解决方案是安全的,还是我错过了一些攻击向量,这会使数据变得容易?

据我所知,攻击者需要物理访问机器(或者需要在我们的办公室网络上),即使是这种情况,他们也只能为登录该用户的用户检索数据时刻(因为它们是唯一存储的键)?我的假设是否正确?

有没有办法在登录时删除将用户密钥存储在内存中的要求(没有要求他们在每次请求时重新提供密钥)?我不认为有,但我希望这是我没想过的。

谢谢!

2 个答案:

答案 0 :(得分:3)

这在本地网络上听起来有点偏执,但这里还有一些需要考虑的事情。这些是我遇到的一些事情。

  1. 是否已锁定并监控盒子的盒子和物理访问(安全的房间,安全的机架,相机)? 如果匹配电缆可以将这个东西链接到互联网上 机架作为一个在线的交换机。"也有人可以带来 无线路由器并将其连接到网络(隐藏在网络下) 桌面)这样你就无法告诉它的广播。 USB路由器是 也可用于连接共享。检查Mac地址。

  2. 如果您要求输入密钥,则可能需要对密钥进行散列 第二个短语(用户提供的可能类似于两步密码) 还有一个隐藏的短语,只有你知道如果有人在运行循环仪 这件事他们无法到达任何地方。如果他们抓到一对夫妇 您不希望他们尝试解密转储的数据包。如果 当有人提供不同的密钥和哈希值时,您会进行哈希处理 失败然后你知道他们不是你认为的那个人。

  3. 如果你抓住初始握手,可以破解SSL 密钥交换(银行的高端路由器这样做,所以他们 可以加速转移)所以任何通过连接传输 可以使用像Wireshark这样的东西。如果有访问权限 硬件层?

  4. 如果有访问权限,可以在计算机上收集任何捕获的内容 到USB端口(所以端口需要锁定在物理上 机)。如果你有他们提供拇指驱动器,那么这需要 也要检查(根工具包,键盘记录器等)。也许是 运行的thumbdrive上的应用程序的校验和。还有 机器需要物理检查其他usb拇指驱动器 (可能在机器的背面)有人可能会安装一个 键盘记录并等待。

  5. 如果他们可以访问机器上的CD-ROM,他们可以重新启动 机器和用户像knoppix?没有数字化 纸质小道。

  6. 在浏览器中,您可能希望不保留历史记录。

  7. 所有网页都需要立即过期。

  8. 每次有人连接时,您都可以安装一个干净的VM 机器。

  9. 使用其他默认网络端口。

  10. 由于它位于数据中心,您希望确保该框本身可以查找特定的连接以便正常工作(有点像保持活动的身份验证)。这样,如果盒子有一个中间人尝试,那么有人必须进行身体干预才能使盒子重新上线。

  11. 如果服务器场(在同一机架中)有自己的防火墙或本地网络,请确保该框不会盲目信任本地网络。我过去的一些客户托管在" secure"在核准备好的笼子里"找出其他人已经修补了企业级防火墙后面的千兆交换机和安全服务器所在子网的设施。他们使用我的客户端连接进行广播,而不是试图进入我的客户端盒子,尽管他们设法用红色代码感染了我的一个客户端邮件服务器(Microsoft)。我的客户端的防病毒/反垃圾邮件防火墙(Fortinet)阻止了所有出站病毒,蠕虫和未经请求的邮件(我被防火墙分析了关于寻找IP的新mac地址)。幸运的是,我们没有使用DHCP,本地网络中没有任何服务器来回通信,所以当另一个盒子启动端口扫描时,由于出站流量,它找到了交换盒。

  12. 为了获得最佳安全性,您需要确保机架本身位于自己的机箱中或物理锁定(独立)。它有点贵,但如果数据是关键任务,那么如果存在违规行为则可能会很糟糕。大多数服务器群信任经过身份验证的人都可以访问网箱,因此他们通常不会将摄像头放入包含30-40个机架的网箱中,如果您碰巧在主要服务器场的人口。此外,大多数服务器场都有几个警卫和#34;或监视摄像机和登录的人以及一些技术人员,具体取决于在那里托管的内容。

  13. 使盒子上的防火墙本身只接受来自几个你自己的特定静态IP的连接,以及盒子上的任何应用程序也应该进行验证。如果您使用防火墙,则只允许受信任的VPN连接访问除所需资源(Web应用程序,数据库等)以外的任何内容。

  14. 希望这有帮助。

答案 1 :(得分:2)

如果只有用户上传需要能够阅读内容,公钥加密可能有用吗?

这样你就不必真正关心内存中的密钥或害怕嗅探数据的人。客户端将使用他的公钥从世界上任何地方加密文件。只有当有人可以访问他的私钥(加密时不需要)时,您才能解密该数据。

GPG对于像这样的东西来说是一个很棒的工具,它有很多图形用户界面。

如果服务器是某种备份,请确保将私钥的副本存储在安全的地方。这可能是在没有任何互联网接入的外部媒体上。