Bouncy Castle 密码包的配置及使用详解
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.jar
和US_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 密码包的配置及使用详解相关推荐
- Bouncy Castle 密码包实现加解密
Bouncy Castle 介绍 Bouncy Castle API目前包括以下内容: 适用于Java和C#的轻量级加密API. Java加密扩展(JCE)和Java加密体系结构(JCA)的提供程序. ...
- 微服务 分布式配置中心Apollo详解
微服务 分布式配置中心Apollo详解 1. 配置中心概述 1.1 配置中心简介 1.2 配置中心特点 1.3 配置中心对比 2. Apollo概述 2.1 Apollo简介 2.2 Apollo特点 ...
- 发布个人项目jar包到maven中央仓库详解
发布个人项目jar包到maven中央仓库详解 1.在sonatype提交发布工单(Issue) sonatype是由社区支持的开源项目托管服务(Open Source Project Reposito ...
- CentOS7 安装配置FTP服务器详解
CentOS7 安装配置FTP服务器详解 1.FTP简介 ftp(File Transfer Protocol文件传输协议)是基于TCP/IP 协议的应用层协议,用于文件的传输,包括ftp服务器(或服 ...
- CentOS7 安装配置SFTP服务器详解
CentOS7 安装配置SFTP服务器详解 1.SFTP简介 SSH文件传输协议(英语:SSH File Transfer Protocol,也称Secret File Transfer Protoc ...
- JetBrains DataGrip工具配置数据库过程详解
JetBrains DataGrip工具配置数据库过程详解 DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql.创建表.创建索引以及导出数据等. DataGrip 是 Je ...
- 大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解
大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解 实验原理: Frame-Relay(帧中继)简称FR,是国际电信联盟通信标准化组(ITU ...
- python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解
1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...
- python详细安装教程环境配置-python3.6环境安装+pip环境配置教程图文详解
1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...
- python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解
1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...
最新文章
- xmpp关于后台挂起的消息接收,后台消息推送,本地发送通知
- Mysql 参数最佳实践_MySQL参数调优最佳实践
- .dat文件写入byte类型数组_《计算机导论》课程实验报告(文件)
- 大咖说中台 | 建设数据中台系列(五)——中台架构详解(下)
- python中random函数用法_random函数的用法
- 为什么开发人员要使用Linux
- cJSON解析和打包
- 多功能智慧(灯杆)路灯项目建设背景及现实的意义主要体现在哪几个方面?
- TFS2010 - 强制撤销签出
- linux yassl 漏洞修复,漏洞加固方案.docx
- 修改mysql的authen_MySQL数据库出现Authentication plugin怎么办
- Android OpenGL ES纹理总结、纹理坐标系说明、使用代码示例
- 艰难困苦,玉汝于成!
- 摘要-Amira用户指南
- 51cto python数据分析系列课程 55g_热图_ Python数据分析系列视频课程--玩转数据可视化_数据可视化视频-51CTO学院...
- linux软路由 iptv,软路由实现任意端口看IPTV电视的方法
- 如何计算俩日期相隔多少年,多少月,多少天或者两时间相差XX年XX月XX日
- 【ICDAR 2023 X 阿里安全】挑战赛正式启动!篡改文本分类和检测两大赛题!
- POI报表——模板打印 AND 海量数据导出
- BP神经网络工具箱使用
热门文章
- 使用opencv读取rtsp流的图片帧进行目标检测,并将处理好的图像推到rtsp服务器上
- 导向滤波-Guided Image Filtering
- Android自定义星星评分控件,高效
- Lake Shore低温温度传感器之Cernox
- 传统软件厂商生存模式推演
- 三个学生开发的学术钓鱼软件,成功忽悠了整个学术圈
- Unity浏览器插件Embedded browser
- 大数据与云计算、物联网三者的区别和关联
- html里怎么计算梯形周长公式是什么,梯形的周长怎么计算 梯形周长计算公式
- [SSL_CHX][2021-08-19]子矩阵求和