我们有一个用Java编写的web应用程序,并将数据存储到PostgreSQL数据库中。
我们想要加密数据库中的一些字段,以及一些上传的文档。然而,这些都需要双向加密(即我们需要能够解密它们),并且解密需要相当快。
然而,我们不能想出一种“安全”的方法来实际加密/解密数据。因为这是一个web应用程序,并且没有客户端,所以所有的加密密钥都将存储在web服务器(明文或我们的实际代码)或数据库服务器上。
有没有其他关于如何至少适度地实现这个的想法...安全吗?
发布于 2010-07-15 04:56:43
如果你的业务层必须访问原始(未加密的)数据,那么任何可以破解你的业务层的人(例如,窥探存储在应用程序代码中的某个关键字或应用程序可读的文件)也可以访问这些数据。另请参阅此related question。
使用应用程序可读的解码密钥实现某种加密只能为您提供一点保护,使其免受偶然的数据间谍和某些用户角色或情况的影响(例如:可以读取数据库但不能读取who应用程序的DBA;或者窃取数据库转储的人,等等)。但仅此而已。
发布于 2010-07-15 05:33:15
实际上,您可以让它更安全一些。
如果您使用具有PKCS11接口的智能令牌,在令牌上生成密钥对,然后在每次应用程序启动时使用手动提供的密码保护对密钥对的访问,那么您可以在将来的任何时候通过删除令牌来删除读取数据的能力。在需要容错的情况下,使用一对令牌进行双重加密。
这里的重要原则是私钥可由应用程序使用,但不可由应用程序读取。因此,查看应用程序源代码什么也得不到。
此解决方案不会阻止在应用程序运行时访问您的应用程序的用户读取您的数据。但你无论如何也无法阻止这种情况--他们可以在加密之前从内存中读取你的数据。
如果正确实现,这将安全地保护您免受各种形式的离线攻击。黑客不能物理地破解一个好的硬件令牌。在不知道密码的情况下无法提取密钥。密码无法猜测,因为令牌对暴力破解攻击有硬件限制。因此,恢复数据的唯一方法是窃取令牌和密码,或者暴力破解数据加密密钥(可以是2048位RSA证书)。
发布于 2010-07-15 05:25:49
AES是一种成熟的对称加密标准,JDK中内置了对它的支持,因此我建议您使用它。
现在,您说得很对,密钥需要以一种您的应用程序可以访问的方式存储。然而,不是将密钥存储在您的代码或文件中,您可以将秘密“拆分”到不同的物理位置,以使内部人员更难破解您的加密。例如:
要解密,需要从数据库中读取加密密钥C,从文件系统中读取加密密钥B。使用密钥A解密密钥B,使用密钥B解密密钥C。然后使用密钥C解密该值。
这一切给你带来了什么?这个想法是将秘密的一部分传播到几个不同的地方,理想情况下是由不同的人控制。任何想要破解加密值的人都需要访问所有三项:程序代码、文件和数据库。您可以更进一步,向链中添加更多的键,但是您得到了这个想法。
https://stackoverflow.com/questions/3250372
复制相似问题