有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

加密技术PBewithSHA256和128位AESCBC创建java。安全RedHat 6.4上的NoSuchAlgorithmException

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

java.security.NoSuchAlgorithmException

有没有想过是什么导致了这一切。我们如何将PBEWITHSHA256AND128BITAES-CBC-BC算法添加到RedHat 6.4

p.s.应用程序正在^{中运行

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)

共 (3) 个答案

  1. # 1 楼答案



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

    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)
    

    见:Java ™ Cryptography Architecture(JCA) Reference Guide

  2. # 2 楼答案

    我试图确认您的问题,看起来您的环境中存在问题。下面是我在干净的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:. 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. # 3 楼答案

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