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

  1. jca使用_使用JCA的密码学–提供者中的服务

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

  2. dubbo中对服务多版本的支持

    dubbo中对服务多版本的支持 在dubbo的文档中说: 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用. 在低压力时间段,先升级一半提供者为新版本 再将所有消费者升 ...

  3. 2003系统中证书服务

    关于2003系统中证书服务(CA) 以下请自己参考! 下面就以Windows .NET为例,step by step介绍如何为IIS开启SSL通道.  1.单击"开始",指向&qu ...

  4. Dubbo中暴露服务的过程解析

    原文链接 dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者延迟设置为-1(delay="-1" ...

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

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

  6. 一文理解分布式开发中的服务治理

    我们在分布式开发中经常听到的一个词就是 "服务治理". 在理解"服务治理"的概念之前让我们先理解什么是分布式系统,分布式系统之间如何通过RPC(Remote P ...

  7. 分布式概念-如何访问到分布式系统中的服务

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 之前的文章我们介绍了什么是分布式系统,以及分布式系统的一些特点和存在的问题. 我们知道的分布式系统是多台计算机通过网络链接, ...

  8. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  9. ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务-Oracle连接错误

    连接Oracle时突然报"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误 检查OracleServiceORCL服务是否启动! win10:此电脑→管理 ...

最新文章

  1. 常见的神经网络求导总结!
  2. Mecanim动画系统
  3. 【NOIP2001】【Luogu1025】数的划分(可行性剪枝,上下界剪枝)
  4. 用python实现的仿真程序_如何实现疫情扩散仿真程序?
  5. ryuyan 方差分析_R语言之方差分析篇
  6. 用计算机编纂家谱的作用,家谱的编纂几大流程?
  7. zynq使用lwip远程更新flash
  8. 通过SecurityUtils获取Subject详解
  9. 阿里云设置登录掩码错误无法登录
  10. 基于SGIP协议的短信网关接口
  11. 展望下未来的计算机400字,展望未来作文400字
  12. pycharm遇坑指南(win32gui)
  13. 美国计算机加音乐专业,史上最全的美国大学音乐学院专业解析
  14. 一个可以在线编写matlab的网站,你了解吗?
  15. 悖论在计算机中的应用,信息悖论
  16. outlook的archive pst丢失后
  17. 使用elastic job管理调度定时任务
  18. 纯css固定tbody高度,超出滚动效果
  19. [汉化教程] Android(APK)软件汉化完整详细图文教程(含工具软件)
  20. Jenkins开发之——SCM日程表配置

热门文章

  1. 计算机二级c语言考试模拟试题,计算机二级C语言考前模拟试题及答案2016
  2. discuz 版块导航function_forumlist.php,Discuz! X2“扩建”左侧版块导航 让社区层次一目了然...
  3. python爬新闻并保存csv_用python爬取内容怎么存入 csv 文件中
  4. openfire log4j:ERROR setFile(null,true) call failed.
  5. mybatis_user_guide(2)mybatis3.4.0快速入门
  6. java –cp ./:_成为Java流专家–第2部分:中级操作
  7. lucene使用3.0.3_Jirasearch 2.0狗粮:使用Lucene查找我们的Jira问题
  8. drools6.5_Drools 6.4.0.Final提供
  9. 抽象工厂模式设计模式_21世纪的设计模式:抽象工厂模式
  10. wildfly mysql_MySQL作为Kubernetes服务,可从WildFly Pod访问