PBEWITHSA256和128BitAES-CBC-BC在RedHat 6.4上创建java.security.NoSuchAlgorithmException

PBEWITHSA256和128BitAES-CBC-BC在RedHat 6.4上创建java.security.NoSuchAlgorithmException,java,cryptography,aes,bouncycastle,Java,Cryptography,Aes,Bouncycastle,我们有一个应用程序,它使用Bouncy Castle使用pbewithsha256和128位aes-CBC-BC算法加密数据。它在运行OpenJDK1.7的Ubuntu上运行良好。但当我们将其移动到同样运行OpenJDK 1.7的RedHat 6.4时,我们会得到以下异常: java.security.NoSuchAlgorithmException 有没有想过是什么导致了这一切。如何将pbewithsha256和128位aes-CBC-BC算法添加到redhat6.4 p.s.应用程序正在JB

我们有一个应用程序,它使用
Bouncy Castle
使用
pbewithsha256和128位aes-CBC-BC
算法加密数据。它在运行OpenJDK1.7的Ubuntu上运行良好。但当我们将其移动到同样运行OpenJDK 1.7的
RedHat 6.4
时,我们会得到以下异常:

java.security.NoSuchAlgorithmException

有没有想过是什么导致了这一切。如何将
pbewithsha256和128位aes-CBC-BC
算法添加到
redhat6.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

在Ubuntu 12.04上)



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

for (Provider provider : Security.getProviders())
{
    System.out.println("Name: " + provider.getName() + " Version: " + provider.getVersion());
}
您可以尝试在提供者链中的特定位置插入bouncy castle提供者。例如,在第一个位置,如果没有使用其他安全提供程序,则不会导致问题

Security.insertProviderAt(new BouncyCastleProvider(), 1);
不建议对算法使用特定的提供程序

SecretKeyFactory.getInstance(cryptoAlgorithm, provider)

请参阅:

我试图确认您的问题,看起来您的环境中存在问题。下面是我在干净的OpenJDK1.7、1.6、OracleJDK1.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:。测试

输出:
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

您的类路径中是否有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

你的RedHat代码能找到其他Bouncy Castle代码吗?是的,我可以在RedHat上使用“PBEWithMD5AndDES”和Bouncy Castle。字母大小写是问题吗?您能找到
pbewithsha256和128位aes CBC BC
。BC手册怎么说?你能比较两个
$jre home\lib\security
目录吗?如果它们看起来相同,*\u策略JAR的内容吗?你能给我们提供完整的stacktrace吗?这不可能,因为提供者将被询问实现的算法字符串。除非给出了一个特定的提供者,否则所有的提供者都将被测试。当然,它不应该被测试。但它不起作用。就像我说的“我猜”。因此,至少值得先检查注册提供者的顺序,然后检查在第一个位置手动插入BC是否可以修复它。如果没有跟进调查。但是要找到问题,你需要从某个点开始上述检查很快就能完成,如果它们不是解决方案,至少可以从可能性列表中删除它们。是否也必须存在于jboss服务器上?如果BouncyCastle JAR不在EAR中,那么您需要将JAR复制到jboss机器上。事实上,我建议不要将JAR放在EAR中,而是将其放在适当的jre/lib/ext文件夹中(参见上面的示例路径)。尝试从EAR中删除JAR,并将其放在适当的JBoss概要文件的lib目录(例如server/default/lib)或所述的jre lib/ext目录中。还要确保JBoss没有打包(可能是不同版本的)BouncyCastle。
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");
        }
    }
}
/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/ext