1、简述

BouncyCastle(轻量级密码术包)是一种用于 Java 平台的开放源码的轻量级密码术包;Bouncycstle 包含了大量的密码算法,其支持椭圆曲线密码算法,并提供JCE 1.2.1的实现。

2、为什么要使用BouncyCastle?

我们知道,Java标准库提供了一系列常用的哈希算法。但如果我们要用的某种算法,Java标准库没有提供怎么办?

方法一:自己写一个,难度很大;

方法二:找一个现成的第三方库,直接使用。

BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。

3、如何使用BouncyCastle?

因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。接下来,我们来看一下如何使用BouncyCastle这个第三方提供的算法。

3.1 maven工程下引入依赖包方式

  • pom.xml文件中引入bouncycastle的jar包依赖,把BouncyCastle提供的jar包放到classpath中。这个jar包就是bcprov-jdk15on-xxx.jar,可以从官方网站下载。
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.59</version>
</dependency>
  • Java标准库的java.security包提供了一种标准机制,允许第三方提供商无缝接入。我们要使用BouncyCastle提供的RipeMD160算法,需要先把BouncyCastle注册一下:
@Test
public void case1(){// 注册BouncyCastle:Security.addProvider(new BouncyCastleProvider());// 按名称正常调用:try {md = MessageDigest.getInstance("RipeMD160");md.update("HelloWorld".getBytes("UTF-8"));} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {e.printStackTrace();}byte[] result = md.digest();System.out.println(new BigInteger(1, result).toString(16));
}
  • 注意:注册BouncyCastle是通过下面的语句实现的。注册只需要在启动时进行一次,后续就可以使用BouncyCastle提供的所有哈希算法和加密算法。
Security.addProvider(new BouncyCastleProvider());
  • 计算结果:ecabeaa2eb986c85e6a6ea2c22b248ab6916de35 

3.2 官方站点下载jar,配置java.security的方式

  • 去官方站点下载Bouncy Castle的JCE Provider包  bcprov-ext-jdk15-145.jar
  • 把jar文件复制到 $JAVA_HOME$\jre\lib\ext 目录下面
  • 修改配置文件\jre\lib\security\java.security
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider#前面是java环境已经提供的,尾部加上这一行即可
security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
  • 举个栗子查看本地java系统中安装的所有的JCE提供者,和一些相应算法。
@Test
public void case2(){System.out.println("-------列出加密服务提供者-----");Provider[] pro=Security.getProviders();for(Provider p:pro){System.out.println("Provider:"+p.getName()+" - version:"+p.getVersion());System.out.println(p.getInfo());}System.out.println("");System.out.println("-------列出系统支持的消息摘要算法:");for(String s:Security.getAlgorithms("MessageDigest")){System.out.println(s);}System.out.println("-------列出系统支持的生成公钥和私钥对的算法:");for(String s:Security.getAlgorithms("KeyPairGenerator")){System.out.println(s);}
}
  • 由测试用例结果,我们可以看到列出系统已经安装的所有的JCE提供者,并且著名的一些的消息摘要算法:MD5,生成公钥和私钥对的算法RSA等都在其中。
-------列出加密服务提供者-----
Provider:SUN - version:1.8
SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS & DKS keystores; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
Provider:SunRsaSign - version:1.8
Sun RSA signature provider
Provider:SunEC - version:1.8
Sun Elliptic Curve provider (EC, ECDSA, ECDH)
Provider:SunJSSE - version:1.8
Sun JSSE provider(PKCS12, SunX509/PKIX key/trust factories, SSLv3/TLSv1/TLSv1.1/TLSv1.2)
Provider:SunJCE - version:1.8
SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
Provider:SunJGSS - version:1.8
Sun (Kerberos v5, SPNEGO)
Provider:SunSASL - version:1.8
Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
Provider:XMLDSig - version:1.8
XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory; C14N 1.0, C14N 1.1, Exclusive C14N, Base64, Enveloped, XPath, XPath2, XSLT TransformServices)
Provider:SunPCSC - version:1.8
Sun PC/SC provider
Provider:SunMSCAPI - version:1.8
Sun's Microsoft Crypto API provider-------列出系统支持的消息摘要算法:
SHA-384
SHA-224
SHA-256
MD2
SHA
SHA-512
MD5
-------列出系统支持的生成公钥和私钥对的算法:
RSA
DSA
DIFFIEHELLMAN
EC

4、Java 进口管制限制解除

由于国外的进出口限制,对Java密码算法体系进行了一些限制,为了解除限制,需要覆盖策略文件。

4.1 下载策略文件

  • jdk6→http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
  • jdk7→http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
  • jdk8→http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

下载的策略文件中需要两个文件:local_policy.jarUS_export_policy.jar

4.2 覆盖 sdk 和 jre 中的这两个策略文件

  • sdk 中策略文件位置→C:\Program Files\Java\jdk1.8.0_144\jre\lib\security
  • jre 中策略文件位置→C:\Program Files\Java\jre1.8.0_144\lib\security

是否生效,可以使用下面的程序检验。AES 算法没有解除限制之前,密钥长度只支持128位,其限制解除后,可支持128、192、256位等长度。

@Test
public void case3(){try {KeyGenerator kg =  KeyGenerator.getInstance("AES");kg.init(256);SecretKey secretKey=kg.generateKey();System.out.println(secretKey.getFormat());} catch (NoSuchAlgorithmException e) {e.printStackTrace();}
}
  • 测试结果,已解除限制。若出现 java.security.InvalidKeyException: Illegal key 错误,表示限制没有解除。

小结

BouncyCastle是一个开源的第三方算法提供商;

BouncyCastle提供了很多Java标准库没有提供的哈希算法和加密算法;

使用第三方算法前需要通过Security.addProvider()注册。

参考:

  • https://blog.csdn.net/qq_29583513/article/details/78866461?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control
  • https://www.liaoxuefeng.com/wiki/1252599548343744/1305362418368545

Bouncy Castle 密码包的配置及使用详解相关推荐

  1. Bouncy Castle 密码包实现加解密

    Bouncy Castle 介绍 Bouncy Castle API目前包括以下内容: 适用于Java和C#的轻量级加密API. Java加密扩展(JCE)和Java加密体系结构(JCA)的提供程序. ...

  2. 微服务 分布式配置中心Apollo详解

    微服务 分布式配置中心Apollo详解 1. 配置中心概述 1.1 配置中心简介 1.2 配置中心特点 1.3 配置中心对比 2. Apollo概述 2.1 Apollo简介 2.2 Apollo特点 ...

  3. 发布个人项目jar包到maven中央仓库详解

    发布个人项目jar包到maven中央仓库详解 1.在sonatype提交发布工单(Issue) sonatype是由社区支持的开源项目托管服务(Open Source Project Reposito ...

  4. CentOS7 安装配置FTP服务器详解

    CentOS7 安装配置FTP服务器详解 1.FTP简介 ftp(File Transfer Protocol文件传输协议)是基于TCP/IP 协议的应用层协议,用于文件的传输,包括ftp服务器(或服 ...

  5. CentOS7 安装配置SFTP服务器详解

    CentOS7 安装配置SFTP服务器详解 1.SFTP简介 SSH文件传输协议(英语:SSH File Transfer Protocol,也称Secret File Transfer Protoc ...

  6. JetBrains DataGrip工具配置数据库过程详解

    JetBrains DataGrip工具配置数据库过程详解 DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql.创建表.创建索引以及导出数据等. DataGrip 是 Je ...

  7. 大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解

    大型企业网络配置系列课程详解(五)             --Frame-Relay配置与相关概念的理解   实验原理: Frame-Relay(帧中继)简称FR,是国际电信联盟通信标准化组(ITU ...

  8. python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  9. python详细安装教程环境配置-python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  10. python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

最新文章

  1. xmpp关于后台挂起的消息接收,后台消息推送,本地发送通知
  2. Mysql 参数最佳实践_MySQL参数调优最佳实践
  3. .dat文件写入byte类型数组_《计算机导论》课程实验报告(文件)
  4. 大咖说中台 | 建设数据中台系列(五)——中台架构详解(下)
  5. python中random函数用法_random函数的用法
  6. 为什么开发人员要使用Linux
  7. cJSON解析和打包
  8. 多功能智慧(灯杆)路灯项目建设背景及现实的意义主要体现在哪几个方面?
  9. TFS2010 - 强制撤销签出
  10. linux yassl 漏洞修复,漏洞加固方案.docx
  11. 修改mysql的authen_MySQL数据库出现Authentication plugin怎么办
  12. Android OpenGL ES纹理总结、纹理坐标系说明、使用代码示例
  13. 艰难困苦,玉汝于成!
  14. 摘要-Amira用户指南
  15. 51cto python数据分析系列课程 55g_热图_ Python数据分析系列视频课程--玩转数据可视化_数据可视化视频-51CTO学院...
  16. linux软路由 iptv,软路由实现任意端口看IPTV电视的方法
  17. 如何计算俩日期相隔多少年,多少月,多少天或者两时间相差XX年XX月XX日
  18. 【ICDAR 2023 X 阿里安全】挑战赛正式启动!篡改文本分类和检测两大赛题!
  19. POI报表——模板打印 AND 海量数据导出
  20. BP神经网络工具箱使用

热门文章

  1. 使用opencv读取rtsp流的图片帧进行目标检测,并将处理好的图像推到rtsp服务器上
  2. 导向滤波-Guided Image Filtering
  3. Android自定义星星评分控件,高效
  4. Lake Shore低温温度传感器之Cernox
  5. 传统软件厂商生存模式推演
  6. 三个学生开发的学术钓鱼软件,成功忽悠了整个学术圈
  7. Unity浏览器插件Embedded browser
  8. 大数据与云计算、物联网三者的区别和关联
  9. html里怎么计算梯形周长公式是什么,梯形的周长怎么计算 梯形周长计算公式
  10. [SSL_CHX][2021-08-19]子矩阵求和