我正在考虑新Sybase项目的加密选项。我认为Sybase加密是错误的策略,因为a)dba可以进入,b)如果我们迁移到SQL Server或Oracle,我不想处理不同的加密策略。 / p>
因此,在将其存储到数据库中之前,我想在我的Java代码中加密敏感数据(对称加密)。
现在,加密字段最好不要更改加密密钥,除非在非常受控制的环境中,这对我来说实际上意味着永远不会。所以它将成为永久密码。
问题是,我应该在哪里保存此密码,使其可以从程序访问,但其他人无法访问。如果它在属性文件中,任何有权访问我们的Git仓库的开发人员都可以看到它。
我们可以在源代码中对其进行硬编码,但是很好的合法,这是一种不好的做法。
我们可以在源代码中生成它,比如10th Fibonacci或3!+8!这很难找到,但它仍然相当暴露。
我们可以让sa在环境中维护它,但是他们在哪里提交以供将来参考?
这么多糟糕的选择。有什么好的吗?
答案 0 :(得分:3)
简单地使用一些密码来动态创建密钥既是一种不安全的方法,也会产生一个糟糕的密钥。 DB keep需要是一个随机字节数组。请记住,使用时密钥需要在内存中,这对于DB来说是大部分时间。
使用数据库加密的WRT,仔细检查算法是否完全指定并与另一个数据库兼容。还有可能需要将整个数据库流失,然后添加到新数据库,在这种情况下,使用内部数据库加密将是透明的。
您确实需要考虑将来需要更改加密密钥,如果它受到损害,您会怎么做?这种困境有解决方案。在DB之外执行加密可能存在实质性的性能损失,每个新的加密操作都有大量的设置时间。此外,由于并非所有列都将被加密(一个很好的猜测),信息不会被数据库和外部加密代码共享,因此这种耦合不利于设计和维护。
请勿将数据库服务器连接到Internet,将其分开并与非网络连接(如直接以太网)连接。这也限制了包含加密密钥的唯一系统的管理员用户数。
解决方案的另一个重要部分是限制对服务器的管理员访问。这包括要求双因素身份验证以及严格限制管理员数量。您需要将第二个因素控制为组织拥有的物理序列号设备,以便可以在人员更改时正确检索它们而不进行复制。我个人赞成RSA SecureID(或类似的)硬件设备,有积极的控制。
最后,在回答问题时,请将密钥保存在如上所述的数据库服务器上的文件中,即无法访问Internet并限制管理员访问。