1

我们的安全部门希望我们使用 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 正在盐中添加一些特定于机器的信息(Mac 地址等)。

即使使用FixedStringSaltGeneratorZeroSaltGenerator没有帮助。这给我们带来了一个问题,因为如果我们曾经将生产服务器迁移到另一台机器,或者使用产品数据刷新生产前数据,我们可能需要几百万年才能恢复信息。

安全部门希望我们使用众所周知的库,而不是自己制定解决方案。有人可以就这个问题说明一下我们如何生成可以使用 jasypt 256 位加密在不同机器上解密的加密字符串,或者当我们用产品数据刷新 pre-prod 数据库时,我们如何能够恢复名称等通过不同的服务器加密?

任何有用的见解将不胜感激。

4

3 回答 3

1

您的密钥可能包含一些特殊字符,这些字符可以用其他东西代替。执行 echo "yourkey" > file 并检查该文件的内容。然后使用这个内容作为密钥来解密;它应该能够解密加密的字符串。

于 2018-03-28T01:39:05.780 回答
0

我知道这是一个很老的问题,但我最近遇到了这个问题,我的解决方案与机器操作系统字节序的差异无关。

它与密码本身中的一个字符有关,即美元符号字符 ($),它在某种程度上被认为是 Linux 中的特殊字符,而不是 Windows 中的特殊字符。因此,在 Windows 中加密值一切正常,但是当我切换到 Linux 并尝试使用 jasypt 命令行 decrypt.sh 脚本使用相同的密码解密值时,我收到错误消息“无法操作(输入错误或参数)”,并注意到 jasypt 解密输出参数列表中的密码与我输入的密码不同(脚本显然从特殊字符中删除了密码部分,直到密码字符串的结尾)。

无论如何,我的解决方案是将密码更改为不使用特殊字符,然后它就起作用了。希望这对将来碰巧遇到同样问题的一些可怜的灵魂有所帮助,因为我在这上面浪费了 2 天时间。

于 2017-09-07T17:48:18.237 回答
0

使用单引号而不是双引号来包装您的输入字符串。当我在使用 $ 加密和解密字符串时遇到问题时,此解决方案有效。

于 2017-09-15T10:39:05.870 回答