Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 453|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 789 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722638
    发表于 2021-5-5 10:35:59 | 显示全部楼层 |阅读模式

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

    1 <dependency>
    2         <groupId>org.bouncycastle</groupId>
    3         <artifactId>bcprov-jdk15on</artifactId>
    4         <version>1.56</version>
    5 </dependency>

    加密解密用的工具类,附上代码:

     1 package com.js.utils;
     2 
     3 import org.bouncycastle.jce.provider.BouncyCastleProvider;
     4 
     5 import javax.crypto.Cipher;
     6 import javax.crypto.spec.IvParameterSpec;
     7 import javax.crypto.spec.SecretKeySpec;
     8 import java.security.Key;
     9 import java.security.Security;
    10 import java.util.Arrays;
    11 
    12 public class AESCBCUtil {
    13     // 算法名称
    14     final String KEY_ALGORITHM = "AES";
    15     // 加解密算法/模式/填充方式
    16     final String algorithmStr = "AES/CBC/PKCS7Padding";
    17     //
    18     private Key key;
    19     private Cipher cipher;
    20     boolean isInited = false;
    21 
    22     byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    23     public void init(byte[] keyBytes) {
    24 
    25         // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
    26         int base = 16;
    27         if (keyBytes.length % base != 0) {
    28             int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
    29             byte[] temp = new byte[groups * base];
    30             Arrays.fill(temp, (byte) 0);
    31             System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
    32             keyBytes = temp;
    33         }
    34         // 初始化
    35         Security.addProvider(new BouncyCastleProvider());
    36         // 转化成JAVA的密钥格式
    37         key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
    38         try {
    39             // 初始化cipher
    40             cipher = Cipher.getInstance(algorithmStr, "BC");
    41         }catch (Exception e){
    42             e.printStackTrace();
    43         }
    44     }
    45     /**
    46      * 加密方法
    47      * @param content 要加密的字符串
    48      * @param keyBytes 加密密钥
    49      * @return
    50      */
    51     public byte[] encrypt(byte[] content, byte[] keyBytes) {
    52         byte[] encryptedText = null;
    53         init(keyBytes);
    54         try {
    55             cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
    56             encryptedText = cipher.doFinal(content);
    57         } catch (Exception e) {
    58             e.printStackTrace();
    59         }
    60         return encryptedText;
    61     }
    62     /**
    63      * 解密方法
    64      * @param encryptedData 要解密的字符串
    65      * @param keyBytes 解密密钥
    66      * @return
    67      */
    68     public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {
    69         byte[] encryptedText = null;
    70         init(keyBytes);
    71         try {
    72             cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
    73             encryptedText = cipher.doFinal(encryptedData);
    74         } catch (Exception e) {
    75             e.printStackTrace();
    76         }
    77         return encryptedText;
    78     }
    79 }

    windows开发mapreduce程序的时候,测试没问题,但是上linux集群就会报错:

    这里写图片描述
    愁死人了,从来没有遇到过这种问题,没办法,看博客! 
    其实,这是由于linux版本java与windows有一些区别导致的,解决方法如下: 
    1、在mvn仓库中找到下载的包bcprov-jdk15on-1.56.jar,或者如果你不用maven,只要能下载到这个包,放到linux的$JAVA_HOME/jre\lib\ext下面; 
    2、配置我的安全属性文件:vim /usr/java/jdk1.8.0_112/jre/lib/security/java.security 

     1 security.provider.1=sun.security.provider.Sun 
     2 security.provider.2=sun.security.rsa.SunRsaSign 
     3 security.provider.3=sun.security.ec.SunEC 
     4 security.provider.4=com.sun.net.ssl.internal.ssl.Provider 
     5 security.provider.5=com.sun.crypto.provider.SunJCE 
     6 security.provider.6=sun.security.jgss.SunProvider 
     7 security.provider.7=com.sun.security.sasl.Provider 
     8 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI 
     9 security.provider.9=sun.security.smartcardio.SunPCSC 
    10 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider 

    第10行是我添加的,是由自己文件内容编号来确定的;

    由于是分布式集群,每个节点都要环境一样哦!

    完成这些配置后,重新执行这个任务,成功!

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-9 04:53 , Processed in 1.078689 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表