【问题解决】java.lang.SecurityException: JCE cannot authenticate the provider BC
问题复现
历史项目升级JDK(由1.7升级到8),进行加密/解密时出现报错java.lang.SecurityException: JCE cannot authenticate the provider BC。
问题原因
Wikipa上查到JCE的描述如下:
Java Cryptography Extension (JCE) is an officially released Standard Extension to the Java Platform and part of Java Cryptography Architecture (JCA).
JCE provides a framework and implementation for encryption, key generation and key agreement, and Message Authentication Code (MAC) algorithms.
即JCE是Java官方提供的加密扩展的标准实现,可用于加密、生成密钥、使用MAC算法。
BC全称BouncyCastleProvider,全类名org.bouncycastle.jce.provider.BouncyCastleProvider,是JCE的一个扩展插件。
要将BC这个插件注册到JVM中才能使用,否则会抛出JCE cannot authenticate the provider BC异常信息。
解决方法
以下方法均可以实现,请根据实际情况进行选择。
注:以下方法均需要确保org.bouncycastle.jce.provider.BouncyCastleProvider在classpath中可以找到。
- 修改代码,单例BouncyCastleProvider注册到JVM中。(注意:非单例并且每次操作都new BouncyCastleProvider()会导致内存泄漏)
//单例BouncyCastleProvider对象
private final static BouncyCastleProvider bouncyCastleProvider= new org.bouncycastle.jce.provider.BouncyCastleProvider();
//使用前添加单例BouncyCastleProvider对象到JVM
Security.addProvider(bouncyCastleProvider);
//加密操作,此处不列出。
优点:程序包中携带bcprov-jdk开头的jar包,不需要修改JDK,迁移环境不容易出问题。
- 添加JVM参数
-Djava.security=unlimited
优点:JDK与程序代码均不需要调整。
缺点:可能不够安全。
- 使用OpenJDK,未验证JCE。
优点:不需要改动程序
缺点:得替换JDK,可能需要解决与OracleJDK差异的问题,如字体等。
- 修改JDK下jre/lib/security/java.security,添加一行
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider,并将bcprov-jdk开头的jar包放到JDK下jre\lib\ext目录中。
优点:不需要改程序,不会引入安全风险。
缺点:每个部署环境JDK均需要修改一次,容易漏处理。
security.provider.10这个10是序号,如果已经有10,请按最大序号加1处理。
扩展阅读
bcprov-jdk开头的Maven坐标
bcprov-jdk开头的包有很多版本,基本上都是针对不同JDK版本进行使用的,以上简要扩展下这块内容。
在maven仓库中可使用group坐标org.bouncycastle来定位到该公司开发的所有工具包,其中:
- JDK1.4使用
org.bouncycastle:bcprov-jdk14 - JDK1.5使用
org.bouncycastle:bcprov-jdk15 - JDK1.5以上使用
org.bouncycastle:bcprov-jdk15on - JDK1.5~8使用
org.bouncycastle:bcprov-jdk15to18 - JDK8以上使用
org.bouncycastle:bcprov-jdk18on
如本文的场景中使用了不兼容的版本,可能会导致问题仍旧出现,请参考以上对应关系进行依赖。
我是Hellxz,下次见!
【问题解决】java.lang.SecurityException: JCE cannot authenticate the provider BC的更多相关文章
- linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法
用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...
- JCE cannot authenticate the provider BC
报错原因: 在使用oracle的JDK时,JAR包必须签署特殊的证书才能使用.(具体是什么协议没查出来,惭愧) 方案一: 使用openJDK或者非oracle的JDK,这样就可以绕开证书的限制.该方案 ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- 执行打的maven jar包时出现“Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for ...
- bug--service--Caused by java.lang.SecurityException: Unable to start service Intent { }:user 0 is restricted
http://bbs.coloros.com/thread-174655-1-1.html 急!!Service在OPPO系列手机下无法启动,寻求帮助 你好,我是网易邮件事业部1元夺宝开发工程师,最近 ...
- Android异常:唤醒锁未授权。(Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android.permission.WAKE_LOCK.)
Android异常:Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android ...
- paip.自动import的实现跟java.lang.SecurityException Prohibited package name java
paip.自动import的实现跟java.lang.SecurityException Prohibited package name java #-----自动import 因为java.lang ...
- 使用sqljdbc连接mssql数据库,maven生成jar运行后报"Exception in thread "main" java.lang.SecurityException"错误
错误信息如下: Exception in thread "main" java.lang.SecurityException: Invalid signature file dig ...
- 解决dwr报错【 Error: java.lang.SecurityException: No class by name: service】
打开包含dwr的网页时后台报错: 警告: Names of known classes are: __System DwrQueryService 十二月 11, 2015 10:24:44 上午 o ...
- AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface
我建立了两个project.一个是activity 的 ,一个是service 的. 在进行两个project通信时,应该有以下几点注意: 1.在activity project中引入service ...
随机推荐
- dubbo序列化问题(一)浮点数问题
转
dubbo是一个分布式服务框架,在国内比较常用,在开发过程中遇到一个浮点数反序列化问题. 问题描述,当参数是float类型的3.7,反序列化却得到了一个double类型的值:3.70000004768 ...
- SpringMVC:注解配置SpringMVC
目录 创建初始化类,代替web.xml 创建SpringConfig配置类,代替spring的配置文件 创建WebConfig配置类,代替SpringMVC的配置文件 测试功能 使用配置类和注解代替w ...
- sicp每日一题[1.45]
Exercise 1.45 We saw in Section 1.3.3 that attempting to compute square roots by naively finding a f ...
- Angular 18+ 高级教程 – 学以致用
前言 读这么多原理,到底为了什么?真实项目中真的会用得到吗? 你正在疑惑 "知识的力量" 吗? 本篇会给一个非常非常好的案例,让你感悟 -- 知识如何用于实战. 记住,我的目的是让 ...
- Qml 实现星级评分组件 已发布
[写在前面] 在现代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品.服务或内容进行评价. 想必大家在用各种带有评分的软件中看到过这个组件: 本文将指导你如何使用 Qml 创建一个简单而 ...
- Go runtime 调度器精讲(九):系统调用引起的抢占
原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 第八讲介绍了当 goroutine 运行时间过长会被抢占的情况.这一讲继续看 goroutine 执行系统调用时间过长的抢占. 1. 系统调用时 ...
- LLM应用实战: 文档问答系统Kotaemon-1. 简介及部署实践
1.背景 本qiang~这两周关注到一个很火的开源文档问答系统Kotaemon,从8月28日至今短短两周时间,github星标迅猛增长10K,因此计划深挖一下其中的原理及奥秘. 本篇主要是Kotaem ...
- Eclipse中Java项目的导入和导出
eclipse中项目的导出 当我们完成自己的java项目之后,我们可以将其打包发给别人,eclipse为我们提供了自动打包的功能. 之后单击finish即可.在你选择的导出位置便可以看到导出的压缩包: ...
- About CSP
好了,猜猜今年第一题会考什么 linux 终端指令 这样吧 CTH 装了 ubuntu 系统的电脑被人施加了 rm -rf /home/Desktop/ 指令,导致他打不开桌面了,以下哪一个是 CTH ...
- T2 的莫反式子
正在实现,不知道对不对,但是先放这,哪个大佬发现问题了和我说下 设 \[f(l)=\sum\cdots\sum[\gcd=1,\text{lcm}=l] \] \[g(l)=\sum\cdots\su ...