【发布时间】:2013-04-10 19:14:35
【问题描述】:
我们的安全部门希望我们使用 256 位加密来加密 SSN、用户名等,因此我们决定使用 JASYPT 并使用以下示例代码:
encryptor = new StandardPBEStringEncryptor();
encryptor.setProvider(new BouncyCastleProvider());
encryptor.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");
encryptor.setPassword(OUR_KEY)
encryptor.encrypt("TEXT TO ECNCRYPT")
我们注意到的问题是,当我们的应用程序从本地计算机创建加密记录时,app-dev 服务器上的应用程序无法解密它,反之亦然,即使密钥相同。似乎 JASYPT 在 salt 中添加了一些特定于机器的信息(Mac 地址等)。
即使使用FixedStringSaltGenerator 或ZeroSaltGenerator 也无济于事。这给我们带来了一个问题,因为如果我们曾经将生产服务器迁移到另一台机器上,或者使用生产数据刷新生产前数据,我们可能需要几百万年才能恢复信息。
安全部门希望我们使用众所周知的库,而不是自行制定解决方案。有人可以就这个问题说明一下我们如何生成可以使用 jasypt 256 位加密在不同机器上解密的加密字符串,或者当我们用产品数据刷新 pre-prod 数据库时,我们如何能够恢复名称等通过不同的服务器加密?
任何有用的见解将不胜感激。
【问题讨论】:
-
你的机器有不同的字节序吗?验证 machine1 上的加密字节数组是否与 machine2 上的加密字节数组相同;您可能需要使用 ByteBuffer 之类的东西来让它们匹配。
-
"我们可能需要几百万年的时间才能恢复信息" > 经典...我笑了 :-)
-
感谢 O'Pootertoot。问题解决了一半。我们的本地环境是小端的windows,服务器是大端的solaris。我们确认我们可以跨多台 Windows 机器或我们的开发和测试服务器加密/解密数据,但是当数据在 Windows 上加密并在服务器上解密时它不起作用。我想知道 Jasypt 是否提供了解决此问题的方法。
-
密码OUR_KEY从何而来?两种环境是否使用相同的代码页运行? OUR_KEY.getBytes() 在机器人环境中是否给出相同的值?
-
@EbbeM.Pedersen 出于测试目的,我在代码中硬编码了密钥。我检查了 key.getBytes()。 Windows 和 Solaris 上的值不同,除非您将其设置为 key.getBytes("UTF-8");但是,在 StandardPBEStringEncryptor 类中似乎没有设置它的方法。同样在它的 [API 页面](jasypt.org/api/jasypt/1.8/org/jasypt/encryption/pbe/…,它说“这个类避免了与不同平台具有不同默认字符集的事实相关的字节转换问题。”
标签: java encryption salt jasypt