【问题标题】:Jasypt encrypted String not being able to decrypt on another machineJasypt 加密字符串无法在另一台机器上解密
【发布时间】: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 地址等)。

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

安全部门希望我们使用众所周知的库,而不是自行制定解决方案。有人可以就这个问题说明一下我们如何生成可以使用 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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 单引号会带字符!在 enc/dec 时如何保留字符串?对于 Sting,您无法避免使用“”
    【解决方案3】:

    您的密钥可能包含一些特殊字符,这些字符会被 shell 替换为其他字符。 做一个回声“你的钥匙”>文件 并检查该文件的内容。 然后用这个内容作为密钥来解密;它应该能够解密加密的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2022-06-19
      • 1970-01-01
      相关资源
      最近更新 更多