问题复现

历史项目升级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中可以找到。

  1. 修改代码,单例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,迁移环境不容易出问题。

  1. 添加JVM参数 -Djava.security=unlimited

优点:JDK与程序代码均不需要调整。

缺点:可能不够安全。

  1. 使用OpenJDK,未验证JCE。

优点:不需要改动程序

缺点:得替换JDK,可能需要解决与OracleJDK差异的问题,如字体等。

  1. 修改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的更多相关文章

  1. linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

    用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...

  2. JCE cannot authenticate the provider BC

    报错原因: 在使用oracle的JDK时,JAR包必须签署特殊的证书才能使用.(具体是什么协议没查出来,惭愧) 方案一: 使用openJDK或者非oracle的JDK,这样就可以绕开证书的限制.该方案 ...

  3. 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法

    在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...

  4. 执行打的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 ...

  5. 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元夺宝开发工程师,最近 ...

  6. 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 ...

  7. paip.自动import的实现跟java.lang.SecurityException Prohibited package name java

    paip.自动import的实现跟java.lang.SecurityException Prohibited package name java #-----自动import 因为java.lang ...

  8. 使用sqljdbc连接mssql数据库,maven生成jar运行后报"Exception in thread "main" java.lang.SecurityException"错误

    错误信息如下: Exception in thread "main" java.lang.SecurityException: Invalid signature file dig ...

  9. 解决dwr报错【 Error: java.lang.SecurityException: No class by name: service】

    打开包含dwr的网页时后台报错: 警告: Names of known classes are: __System DwrQueryService 十二月 11, 2015 10:24:44 上午 o ...

  10. AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface

    我建立了两个project.一个是activity 的 ,一个是service 的. 在进行两个project通信时,应该有以下几点注意: 1.在activity project中引入service ...

随机推荐

  1. MFC对话框程序:实现程序启动画面

    MFC对话框程序:实现程序启动画面 对于比较大的程序,在启动的时候都会显示一个画面,以告诉用户程序正在加载,或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop等.那么对 ...

  2. Java抽象类 小白版

    什么是抽象 抽象就是从多个事物中将共性的,本质的内容抽象出来. 什么是抽象类 Java语言中,用abstract关键字修饰的类叫作抽象类.类本身是不存在的,所以抽象类无法创建对象无法实例化. 在面向对 ...

  3. 微服务全链路跟踪:grpc集成jaeger

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  4. WCF实例管理

    实例管理是对WCF使用的一系列技术的总称,通过它可以将客户端的请求绑定到服务实例上,并根据客户端请求的类型以确定服务实例的管理方式.由于应用程序在可扩展,性能,吞吐量,事物与对垒调用等方面存在巨大的差 ...

  5. 使用.NET源生成器(SG)生成项目的版本号信息

    之前写过一篇 源生成器生成自动注入的代码 主要是通过SyntaxProvider查找标注特性实现 其实除了SyntaxProvider之外还有几个很重要的Provider,比如:MetadataRef ...

  6. 【YashanDB数据库】YAS-02032 column type is incompatible with referenced column type

    [标题]错误码处理 [问题分类]外键约束创建报错 [关键字]YAS-02032 [问题描述]设置外键约束报错,数据元数据不正确. [问题原因分析]外键字段类型不支持,比如varchar2(64) ,指 ...

  7. C++ std::shared_ptr自定义allocator引入内存池

    当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低.当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分 ...

  8. k8s 中的 Service 简介【k8s 系列之二】

    〇.前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址,那么是不是有 IP 了,访问起来就简单了呢,其实不然. 因为在 k8s 中 Pod 不是持久性的,摧毁重建将获得新的 IP,客户端通过 ...

  9. Azure Computer Vision 之 Smart Crop 智能裁剪图片

    前言 一个网站通常有许多地方会用到同一张图,但是比例又不一样. 一般的做法就是用 CSS 的 cover 和 contain 来处理. 由于 cover 只会保留中间信息, 所以很多时候需要人工裁剪. ...

  10. C++ STL queue容器——队列

    queue容器 基本概念 queue是一种**先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素. queue容器没有迭代器,所有元素进出都必须符合"先进先 ...