一、JCA/ JCE

  • JCA(Java Cryptography Architecture) 是Java体系结构,提供了基本Java加密框架,比如证书、数字签名、消息摘要、秘钥对生成器等,在java.security包中实现。

  • JCE(Java Cryptography Extension)是JCA的扩展,主要负责提供DES、AES、RSA、DSA这样的加密算法,因为加密算法是会不断进步的,会有新的算法诞生,所以整个安全体系结构的可扩展性必须要得到保证。

  • JCE包因为其加密算法的安全限制,受美国出口限制,我们平时使用的是oracle提供的“阉割版”,比如默认不允许256位密钥的AES,我们通过oracle官网,可以下载“完整版”。
    下面是“完整版的加密扩展包”
    http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

  • 解压缩以后是这个样子:

    完整版加密扩展包.png

根据readme中的提示,放在<java-home>/lib/security包中就可以啦

image.png

  • JCE并不是只有oracle提供的,有多家厂商可以提供JCE的扩展包,在我们jdk的安装目录下的java.security文件中可以看到,支持的服务提供者Provider。

    Provider

  • JCA的实现是在java.security包下,这个包只能实现消息摘要算法,其他都要依赖JCE扩展包,在javax.crypto包中实现,也可以添加自己的provider,根据上图的格式继续填写第11个即可。使用Security.addProvider("xxx")可以完成Provider的添加,使用insertProviderAt("xxx", position)可以在指定位置完成添加,这里涉及到一个优先级的概念,如上图Provider所示,数字越小优先级越高。

  • 借用oracle官方的一个例子,如图privider example,我们可以使用如下代码获得摘要实例,比如我们要获取SHA-256算法生成摘要的实例,第一句代码会走左侧的图,遍历所有provider,获取到支持该算法的Provider就立刻返回,左侧会返回ProviderB,而生成摘要是提供重载方法的,可以指定Provider,第二行代码指定了ProviderC,那么就会直接返回ProviderC,可以看到使用方法简单灵活。

privider example

md = MessageDigest.getInstance("SHA-256");
md = MessageDigest.getInstance("SHA-256", "ProviderC");
  • 官方是不推荐使用Sun, SunJSSE,SunJCE,SunRsaSign这些厂商提供的Provider的,据说是因为历史原因导致这些厂商提供的功能和加密强度都不怎么样 。

  • MessageDigest.getInstance("SHA-256");这一行代码,的执行流程会是什么样子的呢?我们找到MessageDigest在包中位置,发现旁边还有一个和他的名字很像的SPI类,SPI全称是Service Provider Interface,是软件设计可插拔的体现,经常被用在插件的设计上。

  • 类似MessageDigest这样的类,我们通常叫做“engine”类,可以翻译叫做引擎类,每一个这样的引擎类都有一个对应的SPI类,引擎类继承SPI类,引擎类负责被用户调用,引擎类调用SPI类,我们发现所有的SPI类都是abstract的,也就是说SPI类提供模板,其他Provider实现SPI类中的方法就可以了,这些对于用户来说都是透明的,用户只需要在java.security中进行配置就可以了,是可插拔的一种体现,后面将会对这些引擎类进行简单介绍。

    MessageDigestSpi

  • 对于某些provider,可能会提供加密算法的别名,官方文档不推荐使用别名这种行为,因为其他厂商不一定叫这个别名。

  • 如果想知道自己可以使用那些Provider,Security的getProvider()方法可以获取到,获取到key有很多,笔者使用的是1.8版本,有600+条,如下面这段代码。

    public static void main(String[] args) {for (Provider p : Security.getProviders()) {System.out.println(p);for (Map.Entry entry :p.entrySet()) {System.out.println("\t"+entry.getKey());}}
    }
    

二、java.security包类库

  • 类似MessageDigest这样的类,我们通常叫做引擎类,java.包中的引擎类都是为其继承的SPI类服务,这样的可插拔的机制方便了整体的扩展,下面将介绍java.security包下的引擎类。

1、MessageDigest类

  • 可以使用MessageDigest生成指定加密算法的摘要,代码如下,首先根据MessageDigest的静态方法获取对应算法的实例,然后调用update()方法更新摘要,最后使用digest()方法生成摘要。

        MessageDigest digest =  MessageDigest.getInstance("SHA");digest.update(input);byte[] output = digest.digest();
    

2、Key接口

  • Key是一个接口,是秘钥的抽象概念,所有与秘钥相关的类都要实现这个接口,通过查看源代码我们可以发现这个接口继承了Serializable接口,这是因为秘钥多数情况都是在系统间进行传输,这个接口很简单只有三个方法,如下:

    public String getAlgorithm();//获取算法名称
    public String getFormat();//获取秘钥格式化的编码格式
    public byte[] getEncoded();//返回二进制格式的秘钥

  • 有三个接口继承了它:分别是SecretKey、PublicKey、PrivateKey,SecretKey是对称秘钥的抽象,对称加密算法的秘钥由SecretKey提供,PublicKey和PrivateKey对应非对称件加密算法中的公钥和私钥。

3、KeyPair接口

  • KeyPair是非对称加密算法秘钥对的抽象,如下图所示,这个类的构造方法参数只有两个,类型为PublicKey和PrivateKey,这个类是不提供公钥和私钥的setter方法的,只可以通过构造方法的方式去构造秘钥对。

KeyPair

4、KeyPairGenerator类

  • 秘钥对的生成就是由KeyPairGenerator来完成的,这是一个引擎类,同样也继承了SPI类,通过工厂方法getInstance()来完成秘钥对的构建,下面通过调用KeyPairGenerator的getInstance()方法获得实例,初始化秘钥长度,然后获得秘钥对。

     KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA");generator.initialize(1024);KeyPair keys = generator.generateKeyPair();
    

5、KeyFactory类

  • KeyFactory最大的作用就是根据指定的规范生成秘钥,如下面这段代码,使用的是PKCS8规范,这样的规范还有很多,如下图所示:

      PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    

spec

6、Signature类

  • Signature类主要用于生成和验证数字签名,生成数字签名这一步我们通常称为“加签”,验证数字签名这一步,我们通常称为“验签”,首先我们根据KeyPairGenerator的工厂方法getInstance()获取实例秘钥对实例,初始化秘钥长度1024,生成秘钥对,根据指定算法构建Signature签名实例,根据私钥初始化,调用sign()方法完成加签,下面这一段代码展示了加签的过程:

      byte[] data = "Signature Data".getBytes();KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA");generator.initialize(1024);KeyPair keyPair = generator.generateKeyPair();Signature signature = Signature.getInstance(generator.getAlgorithm());signature.initSign(keyPair.getPrivate());signature.update(data);byte[] signData = signature.sign();
    
  • 验签过程和加签相似,使用公钥初始化,调用verify()方法完成验签,如下面代码所示:

      signature.initVerify(keyPair.getPublic());signature.update(data);boolean status = signature.verify(signData);
    

7、KeyStore类

  • KeyStore是秘钥库的抽象,用于管理秘钥和证书,这也是一个引擎类,如下代码,我们从本地加载秘钥库配合密码加载秘钥库,这里我们可以看到通过keyStore.aliases();获取了全部的别名列表,原因是keystore是通过别名去加载秘钥的,原理类似前面提到的Provider,获取到第一个别名返回。

       String keyPassword = "123456";inputStream = new FileInputStream(new File(keyPath));KeyStore keyStore = KeyStore.getInstance(keyType);keyStore.load(inputStream, keyPassword.toCharArray());Enumeration enum2 = keyStore.aliases();String keyAlias = null;if (enum2 == null) {return null;} else {if (enum2.hasMoreElements()) {keyAlias = (String) enum2.nextElement();} else {return null;}}PrivateKey priviteKey = keyStore.getKey(keyAlias, keyPassword.toCharArray());
    

摘自:oralce JCA参考指南

Java加密体系-java.security包相关推荐

  1. java加密框架_Java加密解密(一)Java加密体系基础

    标签: Java加密解密(一)Java加密体系基础 1. JCA(Java Cryptography Architecture) 提供基本的加密框架,如证书,数字签名,消息摘要和密钥对生成器.其主要实 ...

  2. java类加载体系,Java类加载体系

    早期的java程序员可能只要懂基本语法,还有少数的项目经验就可以找到一份比较好的工作.Java和java社区的发展,更多的人了解它,深入它.现在java程序员了解一些语法我看还远远不够了,对于jvm的 ...

  3. 【密码学】——初识JAVA加密体系(JCA)

  4. android java加密_Android Java字符串加密

    Java字符串加密学习笔记 Java字节码 字节码生成Java2bitcode 由Java源代码生成字节码的过程如下图(图片来源于网络) JVM执行不是热代码直接走字节码解释器 热代码:多次调用,多次 ...

  5. Java日志体系权威总结

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:http://r6d.cn/MSaE 概要 本文的目 ...

  6. Java日志体系总结

    概要 本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用.依赖,好让我们平时在工作中如果遇到"日志打不出"或者"日志jar包冲突"等之类的问题 ...

  7. JAVA加密狗(JAVA程序加密保护,防拷贝和防止反编译)

    JAVA加密狗(JAVA程序加密保护,防拷贝和防止反编译)      众所周知,java为开发语言提供了很方便的开发平台,但开发出来的程序很容易在不同的平台上面被移植,现在越来越多的人使用它开发软件. ...

  8. java异常体系_Java异常体系(Throwable、Error、Exception)

    Java异常体系 java异常体系继承图 Throwable Throwable类是所有异常的父类,常见的子类有两个Error.Exception. Error Error类就是程序运行时候抛出的最严 ...

  9. 深入理解Java虚拟机-走近Java

    本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...

最新文章

  1. vue 点击事件执行多次
  2. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
  3. C#实现监听网易邮箱
  4. 微信公众平台开发--判断终端使用的浏览器是否是微信浏览器
  5. Oracle出现ora-01045的解决方法-可用
  6. Prometheus 的云上 MySQL 监控实践
  7. 高斯模型matlab程序代码,我找到的高斯混合模型的代码
  8. MVCC(多版本并发控制)原理
  9. Unity的超大开放世界解决方案
  10. 基于python的数据分析-基于Python的南京二手房数据可视化分析
  11. 原滴滴副总裁叶杰平加盟贝壳找房,任首席科学家,用AI帮你找房
  12. 从朋友圈看女神的情感状态
  13. 仅需简单的文字描述,即可把文字转图片
  14. 雅居乐陈卓林第二人生业主文化节收官,记录下这些天的温情与感动
  15. 口令登陆创新的一些想法
  16. 终极 Shell——ZSH
  17. Excel破解工作表保护密码
  18. jQuery 学习-样式篇(五):jQuery 设置元素的 html 结构或 text 内容
  19. excel减法函数_发现EXCEL隐藏功能,SUMIFS函数居然可以多条件求差值看了不后悔...
  20. App项目设计开发完整流程

热门文章

  1. 惠普台式计算机配置,惠普台式机配置曝光:或存在GTX 1180显卡
  2. 建立grub floppy
  3. PaddleX 模型库官方介绍
  4. 2021-05-22 《好好说话2》 节选感悟
  5. linux如何修改用户属性,Linux 修改文件用户属性
  6. QWT3D 之 三维动态曲线的实现
  7. maven--spring-boot-starter-parent
  8. 时间复杂度T(n)和渐进时间复杂度O(n)是什么,该如何计算?
  9. 使用MegaCli监控Linux硬盘
  10. CDR2020软件基础操作和实战案例教程