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?
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é
1 . Modifier jre\lib\security\Java.security
add security.provider.10 = org.bouncycastle.jce.provider.BouncyCastleProvider
2 . Copie bc * .jar dans jre\lib\ext
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
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.jar
de -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
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.