PBEWITHSHA256AND128BITAES-CBC-BC création de java.sécurité.NoSuchAlgorithmException sur RedHat 6.4


Nous avons une application qui utilise Bouncy Castle pour crypter des données en utilisant l'algorithme PBEWITHSHA256AND128BITAES-CBC-BC. Cela fonctionne bien sur Ubuntu en cours d'exécution OpenJDK 1.7. Mais lorsque nous le déplaçons vers {[7] } exécutant également OpenJDK 1.7 , nous obtenons l'exception suivante:

Java.sécurité.NoSuchAlgorithmException

Toute réflexion sur ce qui pourrait causer cela. Comment pouvons-nous ajouter PBEWITHSHA256AND128BITAES-CBC-BC algorithme de RedHat 6.4?

P. s., l'application est en cours d'exécution dans 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));
}

(Sur la SR 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)

(Sur 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)
Author: Jason Aller, 2013-05-31

3 answers

Avez-vous le POT du fournisseur BouncyCastle (par exemple bcprov-jdk15on-149.jar) dans votre classpath?

J'ai testé votre scénario avec une installation minimale CentOS 6.4 (64 bits), OpenJDK 1.7 et BouncyCastle 1.49, et je n'ai trouvé aucun problème avec cela.

J'ai placé le JAR dans le répertoire JRE lib/ext:

/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/ext
 4
Author: Jukka, 2013-06-09 04:00:59

J'essaie de confirmer votre question et ressemble problème dans votre environnement. Voici un exemple de code que j'ai exécuté avec succès sur clean OpenJDK 1.7, 1.6, Oracle JDK 1.7 et 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):

Ligne de Commande: java -cp bcprov-jdk15on-149.jar:. Test

Sortie: 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");
        }
    }
}

Essayez d'exécuter ce programme sur votre environnement. BouncyCastle jar vous pouvez télécharger ici http://downloads.bouncycastle.org/java/bcprov-jdk15on-149.jar

 2
Author: user1516873, 2013-06-07 12:43:27



Je suppose que l'ordre des fournisseurs de sécurité est différent dans les deux environnements.

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

, Vous pouvez essayer d'insérer le château gonflable fournisseur à une position spécifique dans la chaîne de fournisseurs. Ici, par exemple, à la première position, si aucun autre fournisseur de sécurité n'est utilisé, cela ne devrait pas entraîner de problèmes.

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

L'utilisation d'un fournisseur spécifique pour un algorithme n'est pas recommandée

SecretKeyFactory.getInstance(cryptoAlgorithm, provider)

Voir: Java ™ Cryptography Architecture(JCA) Référence Guide de

 0
Author: SubOptimal, 2013-06-04 11:05:56