jca使用_使用JCA的密码学–提供者中的服务
jca使用
Java密码体系结构(JCA)是一个可扩展的框架,使您能够使用执行加密操作。 JCA还促进实现独立性(程序不应该在乎谁提供加密服务)和实现互操作性(程序不应该与特定加密服务的特定提供者联系在一起)。
JCA允许将众多密码服务(例如密码,密钥生成器,消息摘要)捆绑到java.security.Provider类中,并声明式地注册在特殊文件(java.security)中,或者通过java.security.Security类以编程方式进行注册(方法'addProvider')。
尽管JCA是标准,但是不同的JDK实施JCA的方式有所不同。 在Sun / Oracle和IBM JDK之间,IBM JDK比Oracle更“有序”。 例如,IBM的超级提供程序(com.ibm.crypto.provider.IBMJCE)实现以下密钥库格式:JCEKS,PKCS12KS(PKCS12),JKS。 Oracle JDK将密钥库格式实现“传播”到以下提供程序中:
- sun.security.provider.Sun – JKS
- com.sun.crypto.provider.SunJCE – JCEKS
- com.sun.net.ssl.internal.ssl.Provider – PKCS12
尽管流行的建议是编写不指向特定Provider类的应用程序,但是在某些用例中,需要应用程序/程序确切了解Provider类提供的服务。 当支持可能与特定JDK(例如与IBM JDK捆绑在一起的WebSphere)紧密耦合的多个应用程序服务器时,此要求变得更加普遍。 我通常使用Tomcat + Oracle JDK进行开发(更轻便,更快),但是我的测试/生产设置是WebSphere + IBM JDK。 为了使事情更加复杂,我的项目需要使用硬件安全模块(HSM),该模块通过提供程序类com.ncipher.provider.km.nCipherKM使用JCA API。 因此,当我在家时(无法访问HSM),我想继续编写代码,但至少要在JDK提供程序上对代码进行测试。 然后,在将代码提交到源代码管理之前,我可以切换为使用nCipherKM提供程序进行另一轮单元测试。
通常的假设是,一个提供程序类就足够了,例如对于IBM JDK来说是IBMJCE,对于Oracle JDK是SunJCE。 因此,通常的解决方案是实现一个指定一个提供程序的类,并使用反射来避免由于“未找到类”而导致的编译错误:
//For nShield HSM
Class c = Class.forName('com.ncipher.provider.km.nCipherKM');
Provider provider = (Provider)c.newInstance();//For Oracle JDK
Class c = Class.forName('com.sun.crypto.provider.SunJCE');
Provider provider = (Provider)c.newInstance();//For IBM JDK
Class c = Class.forName('com.ibm.crypto.provider.IBMJCE');
Provider provider = (Provider)c.newInstance();
这种设计是可以的,直到遇到在Oracle JDK上运行某些单元测试用例的NoSuchAlgorithmException错误。 我使用的算法是RSA,这是一种常见算法! 怎么可能,文档说支持RSA! 相同的测试用例在IBM JDK上运行良好。
经过进一步的调查,我感到非常沮丧的是,SunJCE提供程序没有用于RSA的KeyPairGenerator服务的实现。 但是,可以在提供程序类sun.security.rsa.SunRsaSign中找到实现。 因此,“ 1提供者全部提供”的假设被打破了。 但是由于有了JCA的开放API,在请求Service实例时可以传递Provider对象,例如
KeyGenerator kgen = KeyGenerator.getInstance('AES', provider);
为了帮助检查各种Provider对象,我提供了一个JUnit测试,以漂亮地打印出JDK中每个已注册Provider实例的各种服务。
package org.gizmo.jca;import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;import javax.crypto.KeyGenerator;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Test;public class CryptoTests {@Testpublic void testBouncyCastleProvider() throws Exception {Provider p = new BouncyCastleProvider();String info = p.getInfo();System.out.println(p.getClass() + ' - ' + info);printServices(p);}@Testpublic void testProviders() throws Exception {Provider[] providers = Security.getProviders();for(Provider p : providers) {String info = p.getInfo();System.out.println(p.getClass() + ' - ' + info);printServices(p);}}private void printServices(Provider p) {SortedSetservices = new TreeSet(new ProviderServiceComparator());services.addAll(p.getServices());for(Service service : services) {String algo = service.getAlgorithm();System.out.println('==> Service: ' + service.getType() + ' - ' + algo);}}/*** This is to sort the various Services to make it easier on the eyes...*/private class ProviderServiceComparator implements Comparator{@Overridepublic int compare(Service object1, Service object2) {String s1 = object1.getType() + object1.getAlgorithm();String s2 = object2.getType() + object2.getAlgorithm();;return s1.compareTo(s2);}}
}
无论如何,如果您使用的算法是通用的并且足够强大,可以满足您的需求,那么可以使用BouncyCastle提供程序。 它在所有JDK(针对IBM和Oracle进行了测试)上都能很好地工作。 BouncyCastle不支持JKS或JCEKS密钥库格式,但是如果您不太挑剔,则BC密钥库格式可以正常工作。 BouncyCastle也是开源的,可以免费包含在您的应用程序中。
提示 :JKS密钥库无法存储SecretKeys。 您可以尝试做功课
希望本文能启发您进一步探索JCA,或者至少在与JCA合作时意识到“幸福的无知”的陷阱。
参考: YK研讨会的博客中, 使用JCA的密码学-来自我们JCG合作伙伴 Allen Julia的“ 提供者中的服务” 。
翻译自: https://www.javacodegeeks.com/2013/03/cryptography-using-jca-services-in-providers.html
jca使用
jca使用_使用JCA的密码学–提供者中的服务相关推荐
- 使用JCA的密码术–提供者中的服务
Java密码体系结构(JCA)是一个可扩展的框架,使您能够使用执行加密操作. JCA还促进实现独立性(程序不应该在乎谁提供加密服务)和实现互操作性(程序不应该与特定加密服务的特定提供者联系在一起). ...
- ssl 接收到一个超出最大准许长度的记录_我所经历的一次Dubbo服务雪崩,这是一个漫长的故事...
这周本来是要写一篇Dubbo源码分析的,被突发事件耽搁了,下周有时间再补上. 这周,笔者经历了一次服务雪崩.服务雪崩,听到这个词就能想到问题的严重性.是的,整个项目,整条业务线都挂了,从该业务线延伸出 ...
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]44在ECC密码学方案中基本的防御方法
这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 在ECC密码学方案中,描述一些 ...
- java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题
在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...
- SpringCloud无介绍快使用,子module提供者支付微服务业务开发(六)
SpringCloud无介绍快使用,子module提供者支付微服务业务开发(六) 问题背景 项目搭建 Lyric: 一只灰狼问候我谁是神枪手 问题背景 从零开始学springcloud微服务项目 注意 ...
- jca 实例 java_采用jca分析javacore文件示例
今天帮助项目组分析websphere 7下的线程挂起问题,现象如下: 后台日志抛出类似下面的异常: 线程"WebContainer : 6"(0000001f)已保持活动状态 62 ...
- access汇总_区块链或密码学相关论文汇总,持续更新中
这里汇总区块链相关的论文,主要是顶会顶刊的. 温馨提示:没必要精读每一篇论文,因为时间和精力是有限的 下面的部分论文列表下面有知乎链接 ,它们是本人对该论文的解读. 同步更新本人Github,可通过& ...
- 函数加密_同态加密__密码学课堂笔记
背景 对称.公钥加密算法解密密文,得到的是明文的全部信息.但是我们希望能够对密文的访问附加特殊的要求,使访问者只得到明文的一个函数值,而不会泄露明文. FE的核心要求:对明文的灵活访问 FE密钥:基于 ...
- 微服务openid等_使用OpenID Connect在Quarkus中保护微服务
微服务openid等 This is the fourth part in a series on building a microservice from the ground up with Qu ...
最新文章
- Windows10上使用VS2017编译MXNet源码操作步骤(C++)
- 交叉熵损失函数分类_交叉熵损失函数
- C++中sstream的简单使用
- prim算法_图的生成树之最小生成树(Prim)
- JSP 实现 之 读取数据库显示图片
- 干加个偏旁可以变成什么字_字好看的孩子,都是用了这些小学生学写字的方法...
- 最小生成树算法(Prim和Kruskal)
- AI医疗--概念,应用场景及现状解析
- 血压预测常用数据集整理
- 363.矩形区域不超过K的最大数值和
- 解读《美国国家BIM标准》 – BIM能力成熟度模型(二)
- 浅议公司现场5S管理内部验收基准
- rt1021环境搭建(MCUXpresso Config Tools的使用)以及外设配置
- c语言上机试题倒计时,C语言课程实训-显示考试倒计时.doc
- jQuery事件 笔记
- Python内置函数的源码中方法只有pass占位符说明 Docs
- jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修
- 基于Capacitor编写Ionic React二维码扫描应用
- IOS 下使用AdMob广告
- 杭州人才补助领取遇到的问题