11

我正在使用 Jasypt 加密库来加密/解密一些文本。此代码嵌入在 WAR 文件中并部署到服务器。

在本地运行和单元测试时,加密/解密周期完美运行。我使用 Jetty 来开发应用程序。该代码在该服务器中完美运行。出于某种原因,部署到 Tomcat 会破坏它,但有以下例外:

仅供参考,我在本地和服务器环境中都安装了强加密库,并且我使用的是最新的 1.6 版本(补丁级别 25)。

org.jasypt.exceptions.EncryptionOperationNotPossibleException

异常没有消息。

代码是完全对称的。我把它贴在这里供检查。以下是相关位:

我发现了一篇旧的 Nabble 帖子,其中一位用户遇到了非常相似的问题。代码在任何地方都可以工作,除了 Tomcat 内部。没有给出解决方案。

任何见解将不胜感激。

**更新:** 在我的本地系统上的 Tomcat 中运行,它似乎可以工作。所以我的服务器有些东西。在服务器上,我在 Windows Server 2008 上使用 64 位 JVM。我在本地使用 32 位 JVM(由于我的系统有点旧)。我想知道这是否与这个问题有关。

public void initializeService() {
    binaryEncryptor = new BasicBinaryEncryptor();
    binaryEncryptor.setPassword(keyBase64);
}

@Override
public <T extends Serializable> String simpleEncrypt(T objectToEncrypt) throws EncryptionException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(objectToEncrypt);

        byte[] bytes = binaryEncryptor.encrypt(bos.toByteArray());
        return new String(Base64.encodeBase64(bytes));
    } catch (IOException e) {
        LOGGER.error("failed to encrypt String: " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    } catch (Exception e) {
        LOGGER.error("failed to encrypt String: " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    }
};

@SuppressWarnings("unchecked")
@Override
public <T> T simpleDecrypt(String objectToDecrypt) throws EncryptionException {
    try {
        byte[] bytes = Base64.decodeBase64(objectToDecrypt);
        byte[] decryptedBytes = binaryEncryptor.decrypt(bytes);

        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(decryptedBytes));
        T object = (T)ois.readObject();
        return object;
    } catch (IOException e) {
        LOGGER.error("failed to decrypt String: '" + objectToDecrypt + "', mesage = " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    } catch (Exception e) {
        LOGGER.error("failed to decrypt String: '" + objectToDecrypt + "', mesage = " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    }
}
4

3 回答 3

5

这是文档的链接: http ://www.jasypt.org/faq.html#i-keep-on-receiving-encryption-operation-not-possible

  • 加密和解密配置是否相同
  • 检查以确保表列足够大
  • Base64 编码和 urlencoding 可能会发生冲突,所以必须做得恰到好处。
于 2011-05-25T12:46:09.647 回答
4

@biniam_Ethiopia
我会评论你的答案,但我没有足够的声誉,所以我写了自己的答案:

我有一个非常相似的问题,但在我的情况下,这是因为更改了加密算法(PBEWithMD5AndTripleDES),而数据库中的条目之前是用不同的(PBEWithMD5AndDES)保存的。所以我也得到了一个 EncryptionOperationNotPossibleException ,由于上面@Nathan Feger 的评论,它没有信息。

我希望有一天这也能对某人有所帮助;)

于 2014-12-21T01:43:15.143 回答
1

我遇到了类似的问题。对我来说,这是因为它试图解密一个无法使用解密机制解密的密码。

因此,我在解密方法尝试解密之前加密了密码并将其存储在数据库中。

我希望它可以帮助某人。

于 2014-06-27T13:07:13.357 回答