Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JCE无法在java swing应用程序中验证提供程序BC_Java_Encryption - Fatal编程技术网

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

JCE无法在java swing应用程序中验证提供程序BC,java,encryption,Java,Encryption,我正在用Java创建一个基于swing的应用程序,它使用一些加密技术。但是 getInstance(“AES”、“BC”)给出了异常: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC at javax.crypto.SunJCE_b.a(DashoA13*..) at javax.crypto.KeyGenerator.getInstance(DashoA

我正在用Java创建一个基于swing的应用程序,它使用一些加密技术。但是 getInstance(“AES”、“BC”)给出了异常:

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中提取类文件,或者重新编译源代码,它将删除签名并导致Java拒绝代码

见本相关问题:

  • 编辑
    jre\lib\security\java.security
  • 添加
    security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
  • bc*.jar
    复制到
    jre\lib\ext

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

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

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

    更多信息请参见对于我来说,问题是
    bcprov-ext-jdk16。jar
    sbt程序集
    丢弃

    [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'
    ..
    
    所以我最终使用了
    bouncycastle.jar
    ,如下所示

    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\u 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,而是解决了我的问题

  • 在类中添加Security.addProvider(新的org.bouncycastle.jce.provider.BouncyCastleProvider())
  • 将提供的范围添加到pom.xml中的bcprov.*.jar依赖项
  • 将bcprov.*.jar放入您的特定文件夹(例如:\lib),然后在运行项目时引用它

  • 几个星期以来,我们一直在为同一问题苦恼,并尝试了许多建议的步骤,但都无济于事。在下面提供我们的解决方案,这样其他人就不必像我们那样受苦了

    我们试图使用bcprov-ext-jdk15on-162.jar,它被添加到类路径中,包含在JBoss lib目录中,与WAR捆绑在一起,标记为提供并添加到JBoss/lib目录中,但没有成功

    最后,我们尝试了不同版本的bouncycastle,发现了一个较新的版本,该版本的签名可以通过特定Java版本的jarsigner(1.5X)进行验证

    尽管jar的签名可以通过我们的Java版本进行验证,但当.jar被打包到WAR中时,JBoss以某种方式使签名无效

    最后,我们的解决办法是:

    1. Add bouncycastle jar to JBoss classpath
    2. Add 'org.bouncycastle.jce.provider.BouncyCastleProvider' to 'java.security' providers
    3. Mark bouncycastle in your WAR as a 'provided' dependency
    
    一旦我们在类路径上有了一个.jar版本,并且确信我们的战争并没有将其打包,我们就成了黄金

    这个问题似乎与您正在使用的Java/JBoss版本紧密相关。因此,如果此解决方案不适用于您,我建议您使用测试不同版本的bouncycastle

    jarsigner -verify <bouncycastle.jar>
    
    jarsigner-验证
    
    这个问题有很多解决方案,但不幸的是,没有人谈论导致问题的原因

    如果您正在生成一个包含BC.jar的可执行jar(以任何依赖项的形式),那么如果以下条件匹配,则会出现此问题:

  • 通过eclipse的导出选项生成jar,即导出->可运行jar文件->库处理{将所需库提取到生成的jar}->完成
  • Boom,现在您遇到了麻烦,您将面临一个错误,即JCE无法对提供商BC进行身份验证

    出现上述问题的原因是,当您使用选项1创建一个jar时,实际上再次解包BouncyCastle jar,这违反了与BC相关的安全性。所以,每当您再次运行它时,java都会对其进行验证,并在您的关联jar中找到当前的BC.jar,这是一个错误

    所以,伙计们要确保你所做的是合理的,因为通过改变JDK的安全数据,可以使它工作,但不是每个人都可以

    如何使其工作?{这将只在本地/个人计算机上工作,而不是在每台计算机上工作}

  • 编辑jre\lib\security\java.security文件
  • 添加security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
  • 将bc*.jar复制到jre\lib\ext

  • 就是这样。

    这通常意味着类/jar和/或类路径的打包有问题。你不能从他们的jar中提取BC类并将它们放在另一个jar中。检查你的类路径,也许你有几个不同版本的BouncyCastle jar,就像我遇到的一样。这对我来说非常有用!我使用的是jython,尽管我直接指定了jar文件(没有单独提取类文件),但我得到了异常声明。可能是jython提取的。很好的解决方案。谢谢它对我不起作用?我做了这两个步骤;然而,我不断地得到这个错误。有关更多信息,请提供任何帮助:
    bc*.jar
    表示可以从web下载的BouncyCastle的jar文件。对我来说,这是
    bcprov-jdk15-140.jar
    还需要做什么?例如重启Java应用程序或重启操作系统?我没有提取或重新编译jar文件,我只是从中下载bcprov-jdk14和bcpkix-jdk14;但是,它对我不起作用!使用OpenJDK。它不需要对JCE提供程序进行签名。我尝试了这种方法,但没有成功。我认为原因是若你们在其他项目中使用jar。BC prov错误与相同问题一起出现。