【问题标题】:how to protect a site-wide secret key如何保护站点范围的密钥
【发布时间】:2015-10-08 00:40:10
【问题描述】:
  1. 想象一个非常标准的网站,用户使用电子邮件/密码对进行身份验证。对于密码,它已经使用随机盐进行了哈希处理,但其余数据保持未加密。

  2. 我们又向前迈了一步,使用 password 密钥加密敏感数据,显然,应用程序应该知道 key 才能为其操作描述数据。

  3. 我们不想在源代码中包含它,所以它保存在一个文件中,并在需要时由应用程序读取。

  4. 我们已保护文件,以便只有执行应用程序的用户才能读取它

  5. (这点在下面的讨论后出现)我们已经考虑购买硬件 HSM,发现不可能(例如我们在虚拟机上运行服务器)

通过这种方式,我们相对受到保护,不会完全窃取数据库,对吧?但是,如果有人获得对具有读取权限的操作系统用户的访问权限,则可能会知道密钥。

问题是:保证此类密钥安全的最佳做法是什么?

【问题讨论】:

  • 确保黑客无法访问您的服务器
  • 也许更适合Security.SE
  • @bish:嗯,是的......但安全措施的重点不就是保护自己免受您没有预见到的意外事情的影响吗?
  • 您可以通过添加尽可能多的安全层来实现这一点。对文件等的访问权限绝对是朝着正确方向迈出的一步。显然,您无法防御“意外事件”,您只能确保它们不太可能发生。请注意,您无法使用密码加密任何内容,您需要一个加密密钥。最好确保使用正确的术语来描述您的协议。
  • 是的,感谢您的指正。密钥文件必须确保应用程序可以读取。如果应用程序本身遭到入侵怎么办?我们能做些什么来应对这种风险吗?我在想将密钥保存在内存中的某个地方可能是合理的,这样只有特定的进程才知道它。我们可以将加密和解密例程移至单独的进程,并在其启动时提供密钥。即使有人在服务器上获得了 root 权限,他也无法读取另一个进程的内存。然而,对我来说,它看起来过于复杂。你怎么看?我有什么明显的遗漏吗?

标签: php security cryptography passwords


【解决方案1】:

购买硬件安全模块并将密钥保存在其中。密钥将无法被读取。

Yubi 生产价格合理的 hsm。如果我没记错的话,500 美元。

虽然我们在这里,但您的数据库服务器应该与您的网络服务器位于不同网络区域的不同机器上。

【讨论】:

  • 这是正确的解决方案。应用程序不需要知道密钥。它只需要能够使用密钥进行加密和解密。
  • 很酷,谢谢,实际上我前段时间遇到过它们 (yubi),但也想知道我们是否可以在没有硬件加密狗的情况下自己实现任何东西。我们将检查他们是否可以运送到我们的国家。至于@Borealid 的评论:将数据库服务器放在不同的区域到底有什么好处?如果应用程序被入侵,攻击者能够访问数据库(就像应用程序本身一样),无论它是放置在本地还是其他任何地方。对吗?
  • @user13122695 如果他们在您的 Web 服务器上获得了 root 权限,他们不会自动在您的数据库上获得 root 权限。您的 Web 服务器应该以最低权限连接到 db。您也可以考虑数据库身份验证,每个用户都有自己的数据库帐户,但性能会受到影响。使用差异账户满足差异需求,例如登录或读取或写入
  • @user1312695 不要忘记记录访问的好处。如果数据库与站点分离,它可以强加访问控制和日志记录,而破坏站点的人可能无法破坏。至少记录一下被入侵的内容,以及何时......
  • 好的,很酷。感谢您的建议和讨论。因此,硬件 HSM 是一种可行的方法。无论如何,如果有人没有多余的 500 美元,是否有任何纯软件模拟相同的东西?就像我提到的,让专门的过程为你做加密似乎是可行的,但它不是发明了一个循环吗?有没有可行的软件解决方案?
猜你喜欢
  • 2018-09-03
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2019-01-12
相关资源
最近更新 更多