我有一个WebApplication,使用GWT + Tomcat + Jersey + Postgres。所有重要数据都使用gpg公钥在Postgres上加密,并使用gpg私钥解密。
我的问题是:在哪里存储这些密钥?我把它存放在本地磁盘上听起来很不安全,但我不知道在哪里。
有人可以帮忙吗?提前谢谢。
答案 0 :(得分:5)
所有安全都是一种权衡。
(我不是加密/安全专家。这些是我对我所阅读和研究的理解,但是如果你做了重要的事情,那就得到一些人的专业建议。 ; s为真实做了很多事。)
在这种情况下,您有许多选择,主要区别在于他们如何通过关键的盗窃/滥用风险来平衡正常运行时间/便利性。我假设您使用的是GnuPG / OpenPGP库,而不是命令行工具,但如果不是"应用程序"可以被认为是GnuPG代理。
将密钥未加密存储在磁盘上。应用程序可以随时使用密钥。如果重新启动应用程序,它可以立即访问该密钥。闯入系统或窃取(未加密)备份的攻击者可以轻松使用该密钥。适当的备份加密至关重要。
这种方法的一个微小改进是存储加密的密钥并将密钥的(混淆的)密码存储在系统/ app二进制文件的其他地方;它让攻击者的生活变得更加困难,并且意味着他们至少要花更多的时间在它上面,但在大多数情况下,他们仍然能够很容易地恢复它。适当的备份加密至关重要。
将密钥加密存储在磁盘上并在应用启动时将其解密存储在内存中。在应用启动期间提示时,人可以解密密钥;之后,应用程序可以随时使用密钥。从磁盘/备份中窃取密钥对攻击者来说没有什么好处,他们必须付出额外的努力从应用程序的内存中恢复密钥,或修改/包装应用程序以在管理员输入密码时捕获密码崩溃/重启后。必须将密钥锁定在无法换出的内存中。
将密钥加密存储在磁盘上,并仅使用特定的管理员交互对其进行解密。没有管理员干预,应用程序无法使用密钥。磁盘上非常安全的密钥和应用程序内存的盗窃风险受到内存短暂时间的限制。但是,进入系统的攻击者仍然可以修改应用程序,以便在解密或记录密码时记录密钥。必须将密钥锁定在无法换出的内存中。
将密钥存储在可移动存储上。在app启动时将其物理插入以解密密钥并将其存储在应用程序内存中,如(3),或者当应用程序实际需要使用密钥时(4)。这使攻击者更难以窃取加密密钥并使密码盗窃变得不那么有用,但没有更难修改应用程序来窃取解密密钥。他们也可以等到他们看到存储插入并复制加密密钥,如果他们用包装/键盘记录器等窃取了密码。 IMO对于磁盘上加密密钥的强密码来说并没有太大的好处 - 它可能会让攻击者的生活变得更加困难,但对管理员来说却要困难得多。
将密钥存储在智能卡,加密加速器或USB加密设备上,该设备永远不会允许密钥暴露,只能使用它执行加密操作。 PKCS#11标准得到广泛支持并且对此非常有用。密钥(理论上)不能在没有物理窃取硬件的情况下被窃取 - 在许多硬件上存在密钥提取攻击,但大多数需要大量时间,并且通常需要物理访问。服务器可以随意使用密钥(如果加速器没有超时/解锁)或仅使用管理员干预(如果加速器在每次使用后被锁定并且必须由管理员解锁)。攻击者仍然可以通过伪装成应用程序来使用加速器解密数据,但是他们必须做更多的工作,并且需要持续访问目标系统。当然,这个花费更多。
此选项的灾难恢复更具挑战性;您依靠物理硬件来解密数据。如果数据中心烧毁,您就完成了。因此,您需要重复和/或非常安全地存储密钥的副本。当然,每一个重复都会增加风险,特别是插入的那个"以防万一"备份服务器我们真的没有使用,也没有及时更新安全补丁......
如果您使用内置密钥而不是可以存储但未读取密钥的硬件,那么您将面临额外的挑战,即有一天硬件将被淘汰。曾经试图获得需要在现代服务器上运行ISA卡的关键业务软件吗?这很有趣 - 有一天,PCI / X和USB也会像这样。当然,到那时,您使用的加密系统可能会被破坏,因此您需要解密所有数据并将其迁移到另一个设置。不过,我仍在使用硬件,我可以生成密钥,将其编程到硬件中,并将原始密钥以几种不同的形式存储在银行保管箱中。
现在你已经读过了,请记住:我只是一个有兴趣甚至不爱的人。去问专业人士。当他们告诉你我有多么不对劲时,请来这里解释: - )
无论你做什么,都不要发明自己的加密系统。