【问题标题】:PBEWITHSHA256AND128BITAES-CBC-BC creating java.security.NoSuchAlgorithmException on RedHat 6.4PBEWITHSHA256AND128BITAES-CBC-BC 在 RedHat 6.4 上创建 java.security.NoSuchAlgorithmException
【发布时间】:2018-09-28 06:29:45
【问题描述】:

我们有一个应用程序使用Bouncy Castle 使用PBEWITHSHA256AND128BITAES-CBC-BC 算法加密数据。它在运行OpenJDK 1.7Ubuntu 上运行良好。但是当我们将它移动到RedHat 6.4 也运行OpenJDK 1.7 时,我们会得到以下异常:

java.security.NoSuchAlgorithmException

关于可能导致此问题的任何想法。我们如何将PBEWITHSHA256AND128BITAES-CBC-BC算法添加到RedHat 6.4

p.s.应用程序正在JBoss 中运行。

private String cryptoAlgorithm = "PBEWITHSHA256AND128BITAES-CBC-BC";

Security.addProvider(new BouncyCastleProvider());

// load passPhrase from configured external file to char array.
char[] passPhrase = null;
try {
    passPhrase = loadPassPhrase(passPhraseFile);
} catch (FileNotFoundException e) {
    throw BeanHelper.logException(LOG, methodName, new EJBException("The file not found: " + passPhraseFile, e));
} catch (IOException e) {
    throw BeanHelper.logException(LOG, methodName, new EJBException("Error in reading file: " + passPhraseFile, e));
}

PBEKeySpec pbeKeySpec = new PBEKeySpec(passPhrase);

try {
    SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(cryptoAlgorithm);
    SecretKey newSecretKey = secretKeyFactory.generateSecret(pbeKeySpec);
    return newSecretKey;
} catch (NoSuchAlgorithmException e) {
    throw BeanHelper.logException(LOG, methodName, new EJBException("The algorithm is not found: " + cryptoAlgorithm, e));
} catch (InvalidKeySpecException e) {
    throw BeanHelper.logException(LOG, methodName, new EJBException("The key spec is invalid", e));
}

相对湿度 6.4

#java -version
java version "1.7.0_19"
OpenJDK Runtime Environment (rhel-2.3.9.1.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

在 Ubuntu 12.04 上

#java version "1.7.0_15"
OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.04)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

【问题讨论】:

  • 您的 RedHat 代码可以找到其他 Bouncy Castle 代码吗?
  • 是的,我可以在 redhat 上使用“PBEWithMD5AndDES”和充气城堡。
  • 是字母大小写的问题吗?你能找到PBEWithSHA256And128BITAES-CBC-BC。 BC 手册是怎么说的?
  • 您能否比较两个$jre-home\lib\security 目录,如果它们看起来相同,*_policy jar 的内容?
  • 能否请您提供完整的堆栈跟踪信息?

标签: java cryptography aes bouncycastle


【解决方案1】:

您的类路径中是否有 BouncyCastle 提供程序 JAR(例如 bcprov-jdk15on-149.jar)?

我使用最小的 CentOS 6.4(64 位)安装、OpenJDK 1.7 和 BouncyCastle 1.49 测试了您的场景,并没有发现任何问题。

我将 JAR 放在了 JRE lib/ext 目录中:

/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/ext

【讨论】:

  • 它在编译ear文件的机器上。 jboss服务器上也必须存在吗?
  • 如果 BouncyCastle JAR 不在 EAR 中,那么您需要将 JAR 复制到 JBoss 机器上。事实上,我建议不要将 JAR 放在 EAR 中,而是将其放在适当的 jre/lib/ext 文件夹中(参见上面的示例路径)。
  • 尝试从 EAR 中删除 JAR 并将其放入适当的 JBoss 配置文件的 lib 目录(例如 server/default/lib)或上述 JRE lib/ext 目录中。还要确保 JBoss 尚未打包(可能是不同版本的)BouncyCastle。
【解决方案2】:

我尝试确认您的问题,并且看起来您的环境中存在问题。这是我在干净的 OpenJDK 1.7、1.6、Oracle JDK 1.7 和 1.6 上成功运行的代码示例

$ java -version
java version "1.7.0_19"
OpenJDK Runtime Environment (rhel-2.3.9.1.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode):

命令行:java -cp bcprov-jdk15on-149.jar:. Test

输出:OK

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;

public class Test {
    public static void main(String[] args) throws Exception{
        String cryptoAlgorithm = "PBEWITHSHA256AND128BITAES-CBC-BC";
        Security.addProvider(new BouncyCastleProvider());

        char[] passPhrase = null;
        passPhrase = "12321".toCharArray();
        PBEKeySpec pbeKeySpec = new PBEKeySpec(passPhrase);
        try {
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(cryptoAlgorithm, "BC");
            SecretKey newSecretKey = secretKeyFactory.generateSecret(pbeKeySpec);
            assert newSecretKey != null;
            System.out.println("OK");
        } catch (NoSuchAlgorithmException e) {
            System.out.println("The algorithm is not found: " + cryptoAlgorithm);
        } catch (InvalidKeySpecException e) {
            System.out.println("The key spec is invalid");
        }
    }
}

尝试在您的环境中运行该程序。 BouncyCastle jar 你可以从这里下载http://downloads.bouncycastle.org/java/bcprov-jdk15on-149.jar

【讨论】:

    【解决方案3】:



    我猜这两种环境中安全提供者的顺序是不同的。

    for (Provider provider : Security.getProviders())
    {
        System.out.println("Name: " + provider.getName() + " Version: " + provider.getVersion());
    }
    

    您可以尝试在供应商链中的特定位置插入充气城堡供应商。例如在第一个位置,如果没有使用其他安全提供程序,这不会导致问题。

    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    

    不建议为算法使用特定的提供者

    SecretKeyFactory.getInstance(cryptoAlgorithm, provider)
    

    见:Java ™ Cryptography Architecture(JCA) Reference Guide

    【讨论】:

    • 这不可能,因为提供者将被询问已实现的算法字符串。除非给出特定的提供者,否则将测试所有提供者。
    • 肯定不应该。但它不起作用。正如我所说的“我猜”。因此,至少值得首先检查注册提供者的顺序,然后检查在第一个位置手动插入 BC 是否会修复它。如不跟进调查。但是要找到问题,您需要从某个时候开始。 ;-) 上面的检查很快就完成了,如果它们不是解决方案,至少你可以将它们从可能性列表中删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2016-06-12
    • 1970-01-01
    • 2011-11-20
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多