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的密码学–提供者中的服务相关推荐

  1. 使用JCA的密码术–提供者中的服务

    Java密码体系结构(JCA)是一个可扩展的框架,使您能够使用执行加密操作. JCA还促进实现独立性(程序不应该在乎谁提供加密服务)和实现互操作性(程序不应该与特定加密服务的特定提供者联系在一起). ...

  2. ssl 接收到一个超出最大准许长度的记录_我所经历的一次Dubbo服务雪崩,这是一个漫长的故事...

    这周本来是要写一篇Dubbo源码分析的,被突发事件耽搁了,下周有时间再补上. 这周,笔者经历了一次服务雪崩.服务雪崩,听到这个词就能想到问题的严重性.是的,整个项目,整条业务线都挂了,从该业务线延伸出 ...

  3. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]44在ECC密码学方案中基本的防御方法

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 在ECC密码学方案中,描述一些 ...

  4. java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题

    在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...

  5. SpringCloud无介绍快使用,子module提供者支付微服务业务开发(六)

    SpringCloud无介绍快使用,子module提供者支付微服务业务开发(六) 问题背景 项目搭建 Lyric: 一只灰狼问候我谁是神枪手 问题背景 从零开始学springcloud微服务项目 注意 ...

  6. jca 实例 java_采用jca分析javacore文件示例

    今天帮助项目组分析websphere 7下的线程挂起问题,现象如下: 后台日志抛出类似下面的异常: 线程"WebContainer : 6"(0000001f)已保持活动状态 62 ...

  7. access汇总_区块链或密码学相关论文汇总,持续更新中

    这里汇总区块链相关的论文,主要是顶会顶刊的. 温馨提示:没必要精读每一篇论文,因为时间和精力是有限的 下面的部分论文列表下面有知乎链接 ,它们是本人对该论文的解读. 同步更新本人Github,可通过& ...

  8. 函数加密_同态加密__密码学课堂笔记

    背景 对称.公钥加密算法解密密文,得到的是明文的全部信息.但是我们希望能够对密文的访问附加特殊的要求,使访问者只得到明文的一个函数值,而不会泄露明文. FE的核心要求:对明文的灵活访问 FE密钥:基于 ...

  9. 微服务openid等_使用OpenID Connect在Quarkus中保护微服务

    微服务openid等 This is the fourth part in a series on building a microservice from the ground up with Qu ...

最新文章

  1. Windows10上使用VS2017编译MXNet源码操作步骤(C++)
  2. 交叉熵损失函数分类_交叉熵损失函数
  3. C++中sstream的简单使用
  4. prim算法_图的生成树之最小生成树(Prim)
  5. JSP 实现 之 读取数据库显示图片
  6. 干加个偏旁可以变成什么字_字好看的孩子,都是用了这些小学生学写字的方法...
  7. 最小生成树算法(Prim和Kruskal)
  8. AI医疗--概念,应用场景及现状解析
  9. 血压预测常用数据集整理
  10. 363.矩形区域不超过K的最大数值和
  11. 解读《美国国家BIM标准》 – BIM能力成熟度模型(二)
  12. 浅议公司现场5S管理内部验收基准
  13. rt1021环境搭建(MCUXpresso Config Tools的使用)以及外设配置
  14. c语言上机试题倒计时,C语言课程实训-显示考试倒计时.doc
  15. jQuery事件 笔记
  16. Python内置函数的源码中方法只有pass占位符说明 Docs
  17. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修
  18. 基于Capacitor编写Ionic React二维码扫描应用
  19. IOS 下使用AdMob广告
  20. 杭州人才补助领取遇到的问题

热门文章

  1. 程序员如何写简历?来自硅谷的八条建议
  2. JAVA数据库连接池实现
  3. 并发场景下MySQL存在的问题及解决思路
  4. Spring Boot Server容器配置
  5. Java7任务并行执行神器:ForkJoin框架
  6. 亦云小组KTV点歌系统简介
  7. SpringMVC中使用作用域对象完成数据的流转
  8. 请求和响应向更多内容
  9. Java标识符与命名规则
  10. java数据库编程——事务