我正在开发一款游戏,而我正在使用Slick2D库。我也使用bouncycastle进行加密。然后我使用jarsplice将所有内容打包在一个漂亮的可执行文件中。它运行正常,直到它需要加密某些东西。它给了我java.lang.SecurityException: JCE cannot authenticate the provider BC
我正在使用已签名的jar文件(http://www.bouncycastle.org/download/bcprov-jdk15on-150.jar)
这是堆栈跟踪
java.lang.SecurityException: JCE cannot authenticate the provider BC
at javax.crypto.Cipher.getInstance(Cipher.java:642)
at javax.crypto.Cipher.getInstance(Cipher.java:580)
at net.matrixstudios.zenerith.networking.ZenerithLogin.encryptLogin(ZenerithLogin.java:159)
at net.matrixstudios.zenerith.networking.ZenerithLogin.<init>(ZenerithLogin.java:112)
at net.matrixstudios.zenerith.MultiplayerMenu$1.performAction(MultiplayerMenu.java:90)
at net.matrixstudios.zenerith.gui.menu.MenuGameState.clickButton(MenuGameState.java:83)
at net.matrixstudios.zenerith.gui.menu.MenuGameState.checkForButtonClicks(MenuGameState.java:75)
at net.matrixstudios.zenerith.gui.menu.MenuGameState.update(MenuGameState.java:51)
at net.matrixstudios.zenerith.gui.menu.AbstractGameState.update(AbstractGameState.java:47)
at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:266)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:663)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
at net.matrixstudios.zenerith.gui.Window.<init>(Window.java:28)
at net.matrixstudios.Main.main(Main.java:28)
Caused by: java.util.jar.JarException: file:/C:/Users/M4trixSh4d0w/Desktop/Zenerith_Alpha.0.2.1.5.jar has unsigned entries - org/bouncycastle/LICENSE.class
at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:462)
at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:322)
at javax.crypto.JarVerifier.verify(JarVerifier.java:250)
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:161)
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:187)
at javax.crypto.Cipher.getInstance(Cipher.java:638)
... 14 more
那么如何验证要运行的jar文件? 这是一个独立的可执行jar文件。
答案 0 :(得分:0)
您可能希望在运行时注册加密服务提供程序,以确保配置适用于所有人。您可以使用Security.addProvider()或Security.insertProviderAt()方法。请参阅下面“管理提供商”下面链接的文档。
只要使用addProvider(),除非提供商的顺序对您来说有点重要。我看到一位撰稿人评论说你可能会在条目#9中插入它,但我没有看到证据证明这适合你的配置,所以可能只是他/她的配置文件中的一个无关的细节。显然,如果我错过了一些关于你的配置的东西,你确实需要它,那就去insertProviderAt()。