web-dev-qa-db-fra.com

JCE ne peut pas authentifier le fournisseur BC dans une application swing Java

Je crée une application basée sur le swing en Java qui utilise une technique de cryptage. Mais Javax.crypto.KeyGenerator.getInstance ("AES", "BC") donne une exception:

Java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
        at javax.crypto.SunJCE_b.a(DashoA13*..)
        at javax.crypto.KeyGenerator.getInstance(DashoA13*..)

Alors quel est le problème?

26
user1041858

Pour développer le commentaire de GregS, tous les JAR de fournisseur JCE doivent être signés avant que votre environnement d'exécution Java ne les approuve.

BouncyCastle fournit consciencieusement des JAR signés qui fonctionneront sans problème. Toutefois, si vous extrayez des fichiers de classe à partir de ce fichier JAR ou si vous recompilez le code source, la signature sera supprimée et Java sera rejeté.

Voir la question SO correspondante: Comment signer un fournisseur de sécurité JCE personnalisé

26
Duncan Jones

1 . Modifier jre\lib\security\Java.security

add security.provider.10 = org.bouncycastle.jce.provider.BouncyCastleProvider

2 . Copie bc * .jar dans jre\lib\ext

32
jiangzx

Pour ceux qui découvrent ce problème mais qui utilisent réellement SpongyCastle, il peut être intéressant de savoir qu’Android n’existe pas de tel test de signature et que, pour vos tests, vous pouvez utiliser SpongyCastle via openJDK-8 car cela ne tient pas compte des signatures.

Pour référence, avec SpongyCastle, l'erreur est la suivante:

Java.lang.SecurityException: JCE cannot authenticate the provider SC

Plus d'informations dans ce numéro

4
Giszmo

Pour moi, le problème était bcprov-ext-jdk16.jar était rejeté par sbt Assembly.

[warn] Merging 'META-INF/license/LICENSE.bouncycastle.txt' with strategy 'discard'
..
[warn] Merging 'META-INF/maven/org.jasypt/jasypt/pom.properties' with strategy 'discard'
[warn] Merging 'META-INF/maven/org.jasypt/jasypt/pom.xml' with strategy 'discard'
..

J'ai donc fini par utiliser le bouncycastle.jarde -classpath comme ci-dessous 

Java -Denvironment=dev -cp chat-server.jar:/Users/prayagupd/.ivy2/cache/org.bouncycastle/bcprov-ext-jdk16/jars/bcprov-ext-jdk16-1.46.jar com.chat.server.ChatServer

Ce qui fonctionne aussi met le bouncycastle.jar dans $Java_HOME/jre/lib/ext,

cp /Users/prayagupd/.ivy2/cache/org.bouncycastle/bcprov-ext-jdk16/jars/bcprov-ext-jdk16-1.46.jar $Java_HOME/jre/lib/ext/

$ ls -l $Java_HOME/jre/lib/ext/
total 55208
-rw-r--r--  1 root  wheel   1887089 May  7 21:22 bcprov-ext-jdk16-1.46.jar
-rw-rw-r--  1 root  wheel   3860502 Sep  5  2017 cldrdata.jar
-rw-rw-r--  1 root  wheel      8286 Sep  5  2017 dnsns.jar
-rw-rw-r--  1 root  wheel     44516 Sep  5  2017 jaccess.jar
-rwxrwxr-x  1 root  wheel  18610276 Sep  5  2017 jfxrt.jar
-rw-rw-r--  1 root  wheel   1179093 Sep  5  2017 localedata.jar
-rw-rw-r--  1 root  wheel      1269 Sep  5  2017 meta-index
-rw-rw-r--  1 root  wheel   2022735 Sep  5  2017 nashorn.jar
-rw-rw-r--  1 root  wheel     41672 Sep  5  2017 sunec.jar
-rw-rw-r--  1 root  wheel    274148 Sep  5  2017 sunjce_provider.jar
-rw-rw-r--  1 root  wheel    248726 Sep  5  2017 sunpkcs11.jar
-rw-rw-r--  1 root  wheel     68924 Sep  5  2017 zipfs.jar
0
prayagupd

FYI: au lieu de modifier Java.security et de copier jar dans\jre\lib\ext, les étapes ci-dessous ont également résolu mon problème. 

  1. ajoutez Security.addProvider (nouveau org.bouncycastle.jce.provider.BouncyCastleProvider ()) dans votre classe.
  2. ajoutez la portée fournie à la dépendance de bcprov. *. jar dans pom.xml.
  3. placez bcprov. *. jar dans votre dossier spécifique (par exemple:\lib), puis faites référence à celui-ci lors de l’exécution du projet.
0
imsimm