postgresql - 公共(public)和私有(private)gpg key 存储在哪里?

标签 postgresql gnupg pgp

我有一个web应用程序,使用GWT+Tomcat+Jersey+Postgres。所有重要数据在Postgres上用gpg公钥加密,用gpg私钥解密。
我的问题是:把那些钥匙放在哪里?这听起来很不安全,我把它存储在本地磁盘上,但我不知道在哪里。
有人能帮忙吗?提前谢谢。

最佳答案

所有的安全都是一种权衡。
(我不是密码/安全专家。这些是我对所读和所学内容的理解,但如果你做了什么重要的事情,从一个真正做了很多事情的人那里得到专业的建议)。
在这种情况下,您有许多选择,主要取决于它们如何权衡正常运行时间/便利性和密钥盗窃/滥用风险。我假设您使用的是GnuPG/OpenPGP库,而不是命令行工具,但如果不是,则可以将“应用程序”视为GnuPG代理。
将未加密的密钥存储在磁盘上。应用程序可以随时使用该密钥。如果应用程序重新启动,它可以立即访问密钥。闯入系统或窃取(未加密)备份的攻击者可以轻松使用密钥。正确的备份加密至关重要。
与此方法相比,一个微不足道的改进是存储加密的密钥,并将密钥的(模糊)密码短语存储在系统中的其他位置/应用程序二进制文件中;这使攻击者的工作更为困难,意味着他们至少必须花更多的时间在密钥上,但在大多数情况下,他们仍然能够很容易地恢复密钥。正确的备份加密至关重要。
将加密的密钥存储在磁盘上,并在应用程序启动时将解密的密钥存储在内存中。当应用程序启动时出现提示时,用户可以解密密钥;之后,应用程序可以随时使用密钥。从磁盘/备份中窃取密钥对攻击者没有什么好处,他们必须付出额外的努力从应用程序的内存中恢复密钥,或者在崩溃/重新启动后修改/包装应用程序以捕获管理员输入的密码短语。钥匙必须锁在无法换出的存储器中。
将加密的密钥存储在磁盘上,并仅通过特定的管理员交互对其进行解密。没有管理员干预,应用程序无法使用密钥。这把钥匙在磁盘上非常安全,而且应用程序内存的被盗风险受到它在内存中的短暂时间的限制。但是,闯入系统的攻击者仍然可以修改应用程序以在解密时记录密钥,或捕获密码短语。钥匙必须锁在无法换出的存储器中。
将密钥存储在可移动存储器上。在应用程序启动时将其物理插入以解密密钥并将其存储在应用程序内存中,如(3),或者当应用程序实际需要使用密钥时,如(4)。这使得攻击者更难窃取加密的密钥,也使得窃取密码变得不那么有用,但修改应用程序以窃取解密的密钥并不困难。他们也可以等到看到插入的存储并复制加密的密钥,如果他们用包装器/密钥记录器等窃取了密码短语。在我看来,对磁盘上的加密密钥使用强密码短语并没有多大好处-这可能会使攻击者的工作更困难,但对管理员来说却困难得多。
将密钥存储在智能卡、加密加速器或USB加密设备上,这些设备的设计绝不允许密钥公开,只允许使用密钥执行加密操作。PKCS#11标准得到了广泛支持,并在这方面发挥了作用。密钥(理论上)在没有物理窃取硬件的情况下是无法被窃取的——对许多硬件都有密钥提取攻击,但大多数需要大量时间,并且通常需要物理访问。服务器可以随意使用密钥(如果加速器没有超时/解锁),或者仅在管理员干预下使用密钥(如果加速器在每次使用后被锁定,并且必须由管理员解锁)。攻击者仍然可以通过伪装成应用程序使用加速器解密数据,但他们必须做更多的工作,并且需要对目标系统进行持续访问。当然,这个要贵一些。
对于此选项,灾难恢复更具挑战性;您依赖物理硬件来解密数据。如果数据中心烧了,你就完了。因此,您需要复制和/或非常安全地存储密钥的副本。当然,每一次重复都会增加风险,尤其是插入到我们没有真正使用的“以防万一”备份服务器上的备份服务器,而且不让安全修补程序保持最新。。。
如果您使用内置密钥的硬件,而不是可以存储但不读取密钥的硬件,那么您将面临一个额外的挑战,即有一天硬件将过时。有没有尝试过让业务关键型软件需要在现代服务器上运行ISA卡?这很有趣——总有一天,PCI/X和USB也会这样。当然,到那时,你正在使用的加密系统可能已经损坏,所以你需要解密你的所有数据,并将其迁移到另一个安装程序。不过,我还是会使用硬件,在那里我可以生成密钥,将其编程到硬件中,并将原始密钥以几种不同的形式存储在银行保险箱中。
现在你已经读过了,记住:我只是一个有兴趣甚至不是爱好者。去问问专业人士。当他们告诉你我完全错了,过来解释一下:-)
不管你做什么,不要发明你自己的密码系统。

关于postgresql - 公共(public)和私有(private)gpg key 存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23187101/

相关文章:

python - psycopg2 + pgbouncer。带有 gevent 错误的异步模式

尝试更改列时出现 SQL 错误

gnupg - 无法登录 git-crypt,因为 .gnupg/pubring.kbx 文件困惑

c# - 从 Bouncy CaSTLe PGP key 读取电子邮件地址

docker - 下载带有 `gpg --recv-key` 的 key 并同时在脚本中检查指纹

c# - 我们使用 BouncyCaSTLe API 为客户端加密文件。他在尝试解密时从 PGP 收到一条 "For your eyes only"消息。为什么?

postgresql - 根据多个参数搜索 postgres 表但不需要所有参数

ruby-on-rails - Rails Autocomplete 在本地工作但在 Heroku 上不工作,可能是 MySQL/Postgre 问题

linux - gpg 解密在 LINUX "can' t 批处理模式下查询密码时出错”

mongodb - "gpgkeys: key 7F0CEB10 not found on keyserver"尝试在 Ubuntu 上安装 mongodb 时响应