JCE无法在java swing应用程序中validation提供程序BC

我在JAVA中创建了一个基于swing的应用程序,它使用了一些加密技术。 但是javax.crypto.KeyGenerator.getInstance(“AES”,“BC”)给出了exception:

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

那么问题是什么?

要扩展GregS的注释,所有JCE提供程序JAR必须在Java运行时信任之前进行签名。

BouncyCastle尽职尽责地提供签名的JAR,它们可以毫无问题地运行。 但是,如果从此JAR中提取类文件或重新编译源,它将删除签名并导致Java拒绝代码。

请参阅此相关的SO问题: 如何签署自定义JCE安全提供程序

1.编辑jre \ lib \ security \ java.security

添加security.provider.10 = org.bouncycastle.jce.provider.BouncyCastleProvider

2.将bc * .jar复制到jre \ lib \ ext

对于那些发现此问题但实际上使用SpongyCastle ,知道在Android上没有这样的签名测试可能会很有趣,对于您的测试,您可以通过openJDK-8使用SpongyCastle,因为它既不关心签名也不关心。

作为参考,使用SpongyCastle时错误如下:

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

本期更多信息

对我来说,问题是bcprov-ext-jdk16.jarsbt 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' .. 

所以我最终使用-classpath ,如下所示,

 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 

什么也有效将bouncycastle.jar放到$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 

仅供参考:不是修改java.security并将jar复制到\ jre \ lib \ ext,下面的步骤也解决了我的问题。

  1. 在你的类中添加Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())。
  2. 在pom.xml中为bcprov。*。jar依赖添加提供的范围。
  3. 把bcprov。*。jar放到你的特定文件夹(例如:\ lib),然后在运行项目时引用它。