我们的安全部门希望我们使用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地址等)。
即使使用FixedStringSaltGenerator
或ZeroSaltGenerator
也无济于事。这给我们带来了问题,因为如果我们将生产服务器迁移到另一台机器,或者使用prod数据刷新预生产数据,我们可能需要几百万年才能恢复信息。
安全部门希望我们使用一个知名的图书馆,而不是酿造内部解决方案。关于我们如何生成可以使用jasypt 256位加密在不同机器上解密的加密字符串,或者当我们使用prod数据刷新pre-prod数据库,我们如何能够恢复名称等时,有人可以解释一下这个问题吗?通过不同的服务器加密?
非常感谢任何有用的见解。
答案 0 :(得分:0)
我知道这是一个非常古老的问题,但我最近遇到过这个问题,而我的解决方案与机器操作系统字节序的差异无关。
它与密码本身中的一个字符有关,美元符号字符($),在某种程度上被认为是Linux中的特殊字符,而不是在Windows中被认为是特殊字符。所以一切都很好地加密了Windows中的值,但是当我交换到Linux并尝试使用jasypt命令行decrypt.sh脚本使用相同的密码解密值时,我收到错误消息“操作不可能(输入错误或参数)“并注意到jasypt decrypt输出参数列表中的密码与我输入的密码不同(脚本显然将密码的一部分从特殊字符中删除,直到密码字符串结束)。
无论如何,我的解决方案是将密码更改为不使用特殊字符,然后才能正常工作。希望这有助于一些将来碰巧遇到同样问题的可怜人,因为我浪费了2天时间。
答案 1 :(得分:0)
使用单引号而不是双引号来包装输入字符串。当我遇到使用$。
加密和解密字符串的问题时,此解决方案有效答案 2 :(得分:0)
您的密钥可能包含一些特殊字符,其中shell替换为其他内容。 做一个回声"你的钥匙" >文件 并检查此文件的内容。 然后使用此内容作为解密密钥;它应该能够解密加密的字符串。