2016-05-19 26 views
0

我正在考虑新的Sybase项目的加密选项。我认为Sybase加密是一种错误的策略,因为a)dba可以进入,b)如果当我们迁移到SQL Server或Oracle时,我不想处理不同的加密策略。什么是隐藏长命密钥的最佳地点

因此,我想在我的Java代码中加密敏感数据(对称加密),然后将其存储在数据库中。

现在,除非在一个非常受控制的环境中,加密的字段最好不要更改它们的加密密钥,对我而言,这对我而言意味着永远不会。所以这将是一个永久密码。

问题是,我应该在哪里保存该密码,以便可以从程序访问该密码但其他人无法访问该密码。如果它在一个属性文件中,任何有权访问我们的Git仓库的开发人员都可以看到它。

我们可以在源代码中对其进行硬编码,但是良好的规范性,这是一种不好的做法。

我们可以在源代码中生成它,如第10个Fibonacci或3!+8!这将很难找到,但它仍然相当暴露。

我们可以让sa在环境中保持它,但是他们在哪里提交它以供将来参考?

这么多糟糕的选择。有没有好的?

+0

[把它放在一个属性文件中,但在'.gitignore'中列出这个文件](https:// git-scm。com/docs/gitignore) –

+0

我投票结束这个问题作为题外话,因为它不是一个直接的编程问题。这更多的是一个安全设计问题,我相信它在[信息安全](// security.stackexchange.com)Stack Exchange站点上更合适。 –

+0

@TobySpeight它确实是一个编程问题。我会对其进行重新说明,但我的主要问题是“你在哪里安全地存储这些密码,以便程序可以访问它们,但是没有人可以” –

回答

3

简单地使用一些密码来即时创建密钥既是一种不安全的方法,也会产生一个糟糕的密钥。 DB保持需要是一个随机字节数组。请记住,关键需要在内存中使用,这将是大部分时间的数据库。

WRT使用数据库加密,仔细检查算法是否完全指定并与其他数据库兼容。还有可能需要将整个数据库流失并添加到新的数据库中,在这种情况下,使用内部数据库加密将是透明的。

您真的需要考虑在将来需要能够更改加密密钥,如果它受到威胁,您会做什么?有这种困境的解决方案。在数据库之外执行加密可能会有很大的性能损失,每个新的加密操作都有相当长的设置时间。此外,由于并非所有列都将被加密(很好的猜测),该信息不会被数据库和外部加密代码共享,所以这种耦合不利于设计和维护。

请勿将数据库服务器连接到Internet,使其与独立连接(如直接以太网)相连接。这也限制了包含加密密钥的唯一系统的管理员用户数量。

解决方案的另一个重要部分是限制管理员访问服务器。这包括要求双因素身份验证以及严重限制管理员的数量。您需要将第二因素控制到组织拥有的物理序列号设备,以便在人员更改时积极检索并不复制它们。我个人喜欢RSA SecureID(或类似的)硬件设备,有积极的控制。

最后在回答这个问题时,将密钥保存在上述受保护的数据库服务器上的一个文件中,即没有Internet访问权限和有限的管理员访问权限。

+0

一些笔记和问题。这是一个内部应用程序,DB位于我们的Intranet后面。并非所有列都需要加密。实际上,所有敏感内容都位于单个表的一列中,除了生产服务外,没有人可以访问生产数据库。但是公司要求敏感数据必须加密,所以如果密钥保存在数据库中,它将可用于DBA,因此它基本上不加密 –

+0

如果您试图隐藏系统管理员的加密密钥是一点希望。如果数据相对较小,则可以选择购买包含密钥的外部设备(HSM或类似设备),并执行加密/解密,因此密钥永远不可用,并且只有该设备必须安全管理。也有可能具有双重保管权限,以便任何人都不能访问设备。起价500美元左右,价格高达10万美元的价格,很大程度上取决于所需的吞吐量:入场大小*入场/分钟。 – zaph

相关问题