Java org.jasypt.exceptions.EncryptionOperationNotPossibleException在Tomcat中

Java org.jasypt.exceptions.EncryptionOperationNotPossibleException在Tomcat中,java,tomcat,jasypt,Java,Tomcat,Jasypt,我正在使用Jasypt加密库对一些文本进行加密/解密。此代码嵌入到WAR文件中并部署到服务器 在本地和单元测试中运行时,加密/解密循环可以完美地工作。我使用Jetty开发应用程序。该代码在该服务器中运行良好。出于某种原因,部署到Tomcat会破坏它,但出现以下异常: 仅供参考,我在本地和服务器环境中都安装了强大的加密库,我使用的是最新的1.6版本(补丁级别25) org.jasypt.exceptions.EncryptionOperationNotPossibleException 异常没有消

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

在本地和单元测试中运行时,加密/解密循环可以完美地工作。我使用Jetty开发应用程序。该代码在该服务器中运行良好。出于某种原因,部署到Tomcat会破坏它,但出现以下异常:

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

org.jasypt.exceptions.EncryptionOperationNotPossibleException

异常没有消息

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

我发现其中一个用户有一个非常类似的问题。除了Tomcat内部,代码在任何地方都能工作。没有给出解决方案

任何见解都将不胜感激

**更新:**在我的本地系统上的Tomcat中运行,它似乎可以工作。所以我的服务器有些问题。在服务器上,我在WindowsServer2008上使用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);
    }
}
public void initializeService(){
binaryEncryptor=新的BasicBinaryEncryptor();
binaryEncryptor.setPassword(keyBase64);
}
@凌驾
公共字符串simpleEncrypt(T objectToEncrypt)抛出EncryptionException{
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
试一试{
ObjectOutputStream oos=新的ObjectOutputStream(bos);
oos.writeObject(objectToEncrypt);
byte[]bytes=binaryEncryptor.encrypt(bos.toByteArray());
返回新字符串(Base64.encodeBase64(字节));
}捕获(IOE异常){
LOGGER.error(“未能加密字符串:+e.getMessage());
抛出新的EncryptionException(e.getMessage(),e);
}捕获(例外e){
LOGGER.error(“未能加密字符串:+e.getMessage());
抛出新的EncryptionException(e.getMessage(),e);
}
};
@抑制警告(“未选中”)
@凌驾
公共T SimpledCrypt(String objectToDecrypt)抛出EncryptionException{
试一试{
byte[]bytes=Base64.decodeBase64(objectToDecrypt);
byte[]decryptedBytes=binaryEncryptor.decrypt(字节);
ObjectInputStream ois=新的ObjectInputStream(新的ByteArrayInputStream(decryptedBytes));
T object=(T)ois.readObject();
返回对象;
}捕获(IOE异常){
LOGGER.error(“未能解密字符串:'”+objectToDecrypt+”,mesage=“+e.getMessage());
抛出新的EncryptionException(e.getMessage(),e);
}捕获(例外e){
LOGGER.error(“未能解密字符串:'”+objectToDecrypt+”,mesage=“+e.getMessage());
抛出新的EncryptionException(e.getMessage(),e);
}
}

以下是指向文档的链接:

  • 加密和解密配置相同吗
  • 检查以确保表列足够大
  • Base64编码和urlencoding可能会冲突,因此必须正确执行
    • 我也面临类似的问题。 对我来说,这是因为它试图解密一个无法用解密机制解密的密码

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

      我希望它能帮助别人。

      @biniam\u埃塞俄比亚
      我本想对你的答案发表评论,但我没有足够的声誉,所以我写下我自己的答案:

      我有一个非常类似的问题,但在我的例子中,这是因为更改了加密算法(pbewithmd5和tripledes),而数据库中的条目在保存之前使用了不同的算法(pbewithmd5和des)。 所以我也得到了一个EncryptionOperationNotPossibleeException,由于@Nathan Feger在上面的评论,它没有任何信息


      我希望有一天这也能帮助别人;)

      我想确认一下,是解密操作失败了吗?如果是这样,你已经签出了吗?这是来自jayst文档的一条很棒的评论:它旨在提供很少的错误原因信息(如果有的话),这样就不会通过错误消息泄露加密内部。好的,我解决了这个问题。我在Base64encoding之后将加密字符串放在URL上,然后URL对字符串进行编码。在我的环境中,这很好。在我的服务器上,我使用Apache开发了前端Tomcat,但这不起作用。我在Jasypt常见问题中找到了答案。我从Base64编码改为十六进制编码。这把它修好了。我猜Apache可能在传递给Tomcat之前更改了原始查询字符串。