1 概念

JCA: Java密码体系结构 Java Cryptography Architecture
JCE(Java Cryptography Extension),在早期JDK版本中,由于受美国的密码出口条例约束,Java中涉及加解密功能的API被限制出口,所以Java中安全组件被分成了两部分: 不含加密功能的JCA(Java Cryptography Architecture )和含加密功能的JCE(Java Cryptography Extension)。现在JCE已经捆绑在JDK中,所以,这里JCE是JCA的一部分

JCA包含一个提供者【Provider】体系结构和一组用于数字签名,消息摘要(哈希),证书和证书验证,加密(对称/非对称块/流密码),密钥生成管理和安全随机数生成等等的API。
这些API允许开发人员将安全性轻松集成到应用程序代码中。

JCA包含两个软件组件:

  • 定义和支持Provider为其提供实现的加密服务的框架。 这个框架包含了诸如java.security,javax.crypto,javax.crypto.spec和javax.crypto.interfaces等软件包。
  • Sun,SunRsaSign,SunJCE等实际提供者都包含了具体的加密实现。

2 架构

2.1 加密服务提供者(CSP)

java.security.Provider是所有安全提供程序的基类。 每个CSP都包含这个类的一个实例,它包含了提供者的名字,并列出了它实现的所有安全服务/算法。 当需要特定算法的实例时,JCA框架会咨询提供者的数据库,如果找到合适的匹配项,则创建该实例。

Provider包含一个包(或一组包),为声明的加密算法提供具体的实现。 每个JDK安装都默认安装并配置了一个或多个提供程序。 其他提供者可以静态或动态添加(参见Provider和Security类)。 客户端可以配置其运行时环境来指定提供程序的首选顺序。 首选顺序是在没有请求特定提供者时提供者搜索请求的服务的顺序。

要使用JCA,应用程序只需要请求特定类型的对象(如MessageDigest)和特定的算法或服务(如“SHA-256”算法),并从一个已安装的提供者获取实现。 或者,程序可以请求来自特定提供者的对象。 每个提供者都有一个名字来引用它。

应用程序需要一个“AES”算法的javax.crypto.Cipher实例,并不关心使用哪个提供者。应用程序调用Cipher引擎类的getInstance()工厂方法,然后请求JCA框架查找支持“AES”的第一个提供程序实例。该框架会咨询每个已安装的提供者,并获取提供者类的提供者实例

在调用时,不指定提供者 和 指定提供者的调用流程:

2.2 provider 提供者

provider提供者,这里的全称是 Cryptographic Service Provider (CSP),是指实现一个或多个密码服务(如数字签名算法,消息摘要算法和密钥转换服务)的包或一组包。 每个JDK安装都默认安装并配置了一个或多个provider包。用户可以静态或动态添加其他provider。
JDK中的加密库出于历史原因,由几个不同的提供者实现:

  • SUN
  • SunRsaSign
  • SunEC
  • SunJSSE
  • SunJCE
  • SunJGSS
  • SunSASL
  • XMLDSig
  • SunPCSC
  • SunMSCAPI

java.security.Provider是所有安全提供程序的基类

获取提供者和算法的代码示例:

     System.out.println("|提供者|算法|");System.out.println("|:---|:---|");for(Provider provider: Security.getProviders()){for(Provider.Service service:provider.getServices()){System.out.println("|"+provider.getName()+"|"+service.getAlgorithm()+"|");}}

Engine类和算法

引擎类为特定类型的密码服务提供接口,而不依赖于特定的密码算法或提供者。 引擎需要提供如下功能:

  • 密码操作(加密,数字签名,消息摘要等),
  • 发生器或密码材料的转换器(密钥和算法参数)
  • 对象(密钥库或证书)封装了密码数据,可以在更高的抽象层使用。
引擎类 功能
SecureRandom 用于生成随机或伪随机数字。
MessageDigest 用于计算指定数据的消息摘要(散列)。
Signature 使用密钥初始化,这些签名用于签署数据并验证数字签
Cipher 用密钥初始化,用于加密/解密数据。存在各种类型的算法
Message Authentication Codes(MAC) 与MessageDigests一样,它们也会生成散列值,但是首先使用密钥初始化以保护消息的完整性。
KeyFactory 用于将Key类型的现有不透明密钥转换为密钥规范(底层密钥材料的透明表示),反之亦然。
SecretKeyFactory 用于将SecretKey类型的现有不透明加密密钥转换为密钥规范(底层密钥材料的透明表示),反之亦然。 SecretKeyFactorys是专门的KeyFactorys,只能创建密钥(对称)。
KeyPairGenerator 用于生成一对适用于指定算法的公钥和私钥。
KeyGenerator 用于生成与指定算法一起使用的新密钥。
KeyAgreement 由两方或多方使用,商定和建立一个特定的密钥,用于特定的密码操作。
AlgorithmParameters 用于存储特定算法的参数,包括参数编码和解码。
AlgorithmParameterGenerator 用于生成适合于指定算法的一组AlgorithmParameters。
KeyStore 用于创建和管理密钥库。密钥库是密钥的数据库。密钥库中的私钥具有与其关联的证书链,用于验证相应的公钥。密钥库还包含来自可信实体的证书。
CertificateFactory 用于创建公钥证书和证书吊销列表(CRL)。
CertPathBuilder 用于构建证书链(也称为证书路径)。
CertPathValidator 用于验证证书链。
CertStore 用于从存储库中检索证书和CRL。
注意 生成器可以创建具有全新内容的对象,而工厂只能从现有材料(例如编码)中创建对象。

3 使用示例

3.1 MessageDigest使用示例

以md5加密,演示MessageDigest的使用

public static void main(String[] args) {byte[] content = "hello world".getBytes();System.out.println(DigestUtils.md5DigestAsHex(content));System.out.println(DigestUtils.digestAsHexString("MD5", content));for (String algName : Security.getAlgorithms("MessageDigest")) {System.out.println(algName + "==>" + DigestUtils.digestAsHexString(algName, content));}}

3.2 MessageDigest工具类

public class DigestUtils {private static final String MD5_ALGORITHM_NAME = "MD5";private static final char[] HEX_CHARS ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};/*** Calculate the MD5 digest of the given bytes.** @param bytes the bytes to calculate the digest over* @return the digest*/public static byte[] md5Digest(byte[] bytes) {return digest(MD5_ALGORITHM_NAME, bytes);}/*** Return a hexadecimal string representation of the MD5 digest of the given bytes.** @param bytes the bytes to calculate the digest over* @return a hexadecimal digest string*/public static String md5DigestAsHex(byte[] bytes) {return digestAsHexString(MD5_ALGORITHM_NAME, bytes);}/*** Append a hexadecimal string representation of the MD5 digest of the given* bytes to the given {@link StringBuilder}.** @param bytes   the bytes to calculate the digest over* @param builder the string builder to append the digest to* @return the given string builder*/public static StringBuilder appendMd5DigestAsHex(byte[] bytes, StringBuilder builder) {return appendDigestAsHex(MD5_ALGORITHM_NAME, bytes, builder);}public static String digestAsHexString(String algorithm, byte[] bytes) {char[] hexDigest = digestAsHexChars(algorithm, bytes);return new String(hexDigest);}public static StringBuilder appendDigestAsHex(String algorithm, byte[] bytes, StringBuilder builder) {char[] hexDigest = digestAsHexChars(algorithm, bytes);return builder.append(hexDigest);}/*** Create a new {@link MessageDigest} with the given algorithm.* Necessary because {@code MessageDigest} is not thread-safe.*/private static MessageDigest getDigest(String algorithm) {try {return MessageDigest.getInstance(algorithm);} catch (NoSuchAlgorithmException ex) {throw new IllegalStateException("Could not find MessageDigest with algorithm \"" + algorithm + "\"", ex);}}private static byte[] digest(String algorithm, byte[] bytes) {return getDigest(algorithm).digest(bytes);}private static char[] digestAsHexChars(String algorithm, byte[] bytes) {byte[] digest = digest(algorithm, bytes);return encodeHex(digest);}private static char[] encodeHex(byte[] bytes) {char[] chars = new char[32];for (int i = 0; i < chars.length; i = i + 2) {byte b = bytes[i / 2];chars[i] = HEX_CHARS[(b >>> 0x4) & 0xf];chars[i + 1] = HEX_CHARS[b & 0xf];}return chars;}}

参考

【Java加密】JCA体系结构
Java –可用的MessageDigest算法列表
Java生成MD5的两种方式

provider及算法

提供者 算法
SUN SHA1PRNG
SUN SHA1withDSA
SUN NONEwithDSA
SUN SHA224withDSA
SUN SHA256withDSA
SUN DSA
SUN MD2
SUN MD5
SUN SHA
SUN SHA-224
SUN SHA-256
SUN SHA-384
SUN SHA-512
SUN DSA
SUN DSA
SUN DSA
SUN X.509
SUN JKS
SUN CaseExactJKS
SUN DKS
SUN JavaPolicy
SUN JavaLoginConfig
SUN PKIX
SUN PKIX
SUN LDAP
SUN Collection
SUN com.sun.security.IndexedCollection
SunRsaSign RSA
SunRsaSign RSA
SunRsaSign MD2withRSA
SunRsaSign MD5withRSA
SunRsaSign SHA1withRSA
SunRsaSign SHA224withRSA
SunRsaSign SHA256withRSA
SunRsaSign SHA384withRSA
SunRsaSign SHA512withRSA
SunEC EC
SunEC EC
SunEC NONEwithECDSA
SunEC SHA1withECDSA
SunEC SHA224withECDSA
SunEC SHA256withECDSA
SunEC SHA384withECDSA
SunEC SHA512withECDSA
SunEC EC
SunEC ECDH
SunJSSE RSA
SunJSSE RSA
SunJSSE MD2withRSA
SunJSSE MD5withRSA
SunJSSE SHA1withRSA
SunJSSE MD5andSHA1withRSA
SunJSSE SunX509
SunJSSE NewSunX509
SunJSSE SunX509
SunJSSE PKIX
SunJSSE TLSv1
SunJSSE TLSv1.1
SunJSSE TLSv1.2
SunJSSE TLS
SunJSSE Default
SunJSSE PKCS12
SunJCE RSA
SunJCE DES
SunJCE DESede
SunJCE DESedeWrap
SunJCE PBEWithMD5AndDES
SunJCE PBEWithMD5AndTripleDES
SunJCE PBEWithSHA1AndDESede
SunJCE PBEWithSHA1AndRC2_40
SunJCE PBEWithSHA1AndRC2_128
SunJCE PBEWithSHA1AndRC4_40
SunJCE PBEWithSHA1AndRC4_128
SunJCE PBEWithHmacSHA1AndAES_128
SunJCE PBEWithHmacSHA224AndAES_128
SunJCE PBEWithHmacSHA256AndAES_128
SunJCE PBEWithHmacSHA384AndAES_128
SunJCE PBEWithHmacSHA512AndAES_128
SunJCE PBEWithHmacSHA1AndAES_256
SunJCE PBEWithHmacSHA224AndAES_256
SunJCE PBEWithHmacSHA256AndAES_256
SunJCE PBEWithHmacSHA384AndAES_256
SunJCE PBEWithHmacSHA512AndAES_256
SunJCE Blowfish
SunJCE AES
SunJCE AES_128/ECB/NoPadding
SunJCE AES_128/CBC/NoPadding
SunJCE AES_128/OFB/NoPadding
SunJCE AES_128/CFB/NoPadding
SunJCE AES_128/GCM/NoPadding
SunJCE AES_192/ECB/NoPadding
SunJCE AES_192/CBC/NoPadding
SunJCE AES_192/OFB/NoPadding
SunJCE AES_192/CFB/NoPadding
SunJCE AES_192/GCM/NoPadding
SunJCE AES_256/ECB/NoPadding
SunJCE AES_256/CBC/NoPadding
SunJCE AES_256/OFB/NoPadding
SunJCE AES_256/CFB/NoPadding
SunJCE AES_256/GCM/NoPadding
SunJCE AESWrap
SunJCE AESWrap_128
SunJCE AESWrap_192
SunJCE AESWrap_256
SunJCE RC2
SunJCE ARCFOUR
SunJCE DES
SunJCE DESede
SunJCE Blowfish
SunJCE AES
SunJCE RC2
SunJCE ARCFOUR
SunJCE HmacMD5
SunJCE HmacSHA1
SunJCE HmacSHA224
SunJCE HmacSHA256
SunJCE HmacSHA384
SunJCE HmacSHA512
SunJCE DiffieHellman
SunJCE DiffieHellman
SunJCE DiffieHellman
SunJCE DiffieHellman
SunJCE DES
SunJCE DESede
SunJCE PBE
SunJCE PBEWithMD5AndDES
SunJCE PBEWithMD5AndTripleDES
SunJCE PBEWithSHA1AndDESede
SunJCE PBEWithSHA1AndRC2_40
SunJCE PBEWithSHA1AndRC2_128
SunJCE PBEWithSHA1AndRC4_40
SunJCE PBEWithSHA1AndRC4_128
SunJCE PBES2
SunJCE PBEWithHmacSHA1AndAES_128
SunJCE PBEWithHmacSHA224AndAES_128
SunJCE PBEWithHmacSHA256AndAES_128
SunJCE PBEWithHmacSHA384AndAES_128
SunJCE PBEWithHmacSHA512AndAES_128
SunJCE PBEWithHmacSHA1AndAES_256
SunJCE PBEWithHmacSHA224AndAES_256
SunJCE PBEWithHmacSHA256AndAES_256
SunJCE PBEWithHmacSHA384AndAES_256
SunJCE PBEWithHmacSHA512AndAES_256
SunJCE Blowfish
SunJCE AES
SunJCE GCM
SunJCE RC2
SunJCE OAEP
SunJCE DiffieHellman
SunJCE DES
SunJCE DESede
SunJCE PBEWithMD5AndDES
SunJCE PBEWithMD5AndTripleDES
SunJCE PBEWithSHA1AndDESede
SunJCE PBEWithSHA1AndRC2_40
SunJCE PBEWithSHA1AndRC2_128
SunJCE PBEWithSHA1AndRC4_40
SunJCE PBEWithSHA1AndRC4_128
SunJCE PBEWithHmacSHA1AndAES_128
SunJCE PBEWithHmacSHA224AndAES_128
SunJCE PBEWithHmacSHA256AndAES_128
SunJCE PBEWithHmacSHA384AndAES_128
SunJCE PBEWithHmacSHA512AndAES_128
SunJCE PBEWithHmacSHA1AndAES_256
SunJCE PBEWithHmacSHA224AndAES_256
SunJCE PBEWithHmacSHA256AndAES_256
SunJCE PBEWithHmacSHA384AndAES_256
SunJCE PBEWithHmacSHA512AndAES_256
SunJCE PBKDF2WithHmacSHA1
SunJCE PBKDF2WithHmacSHA224
SunJCE PBKDF2WithHmacSHA256
SunJCE PBKDF2WithHmacSHA384
SunJCE PBKDF2WithHmacSHA512
SunJCE HmacMD5
SunJCE HmacSHA1
SunJCE HmacSHA224
SunJCE HmacSHA256
SunJCE HmacSHA384
SunJCE HmacSHA512
SunJCE HmacPBESHA1
SunJCE PBEWithHmacSHA1
SunJCE PBEWithHmacSHA224
SunJCE PBEWithHmacSHA256
SunJCE PBEWithHmacSHA384
SunJCE PBEWithHmacSHA512
SunJCE SslMacMD5
SunJCE SslMacSHA1
SunJCE JCEKS
SunJCE SunTlsPrf
SunJCE SunTls12Prf
SunJCE SunTlsMasterSecret
SunJCE SunTlsKeyMaterial
SunJCE SunTlsRsaPremasterSecret
SunJGSS 1.2.840.113554.1.2.2
SunJGSS 1.3.6.1.5.5.2
SunSASL DIGEST-MD5
SunSASL NTLM
SunSASL GSSAPI
SunSASL EXTERNAL
SunSASL PLAIN
SunSASL CRAM-MD5
SunSASL CRAM-MD5
SunSASL GSSAPI
SunSASL DIGEST-MD5
SunSASL NTLM
XMLDSig http://www.w3.org/2006/12/xml-c14n11#WithComments
XMLDSig http://www.w3.org/2000/09/xmldsig#base64
XMLDSig http://www.w3.org/TR/1999/REC-xslt-19991116
XMLDSig http://www.w3.org/2001/10/xml-exc-c14n#
XMLDSig http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments
XMLDSig http://www.w3.org/2000/09/xmldsig#enveloped-signature
XMLDSig http://www.w3.org/2002/06/xmldsig-filter2
XMLDSig DOM
XMLDSig http://www.w3.org/TR/2001/REC-xml-c14n-20010315
XMLDSig http://www.w3.org/2001/10/xml-exc-c14n#WithComments
XMLDSig http://www.w3.org/2006/12/xml-c14n11
XMLDSig http://www.w3.org/TR/1999/REC-xpath-19991116
XMLDSig DOM
SunPCSC PC/SC
SunMSCAPI Windows-PRNG
SunMSCAPI Windows-MY
SunMSCAPI Windows-ROOT
SunMSCAPI NONEwithRSA
SunMSCAPI SHA1withRSA
SunMSCAPI SHA256withRSA
SunMSCAPI SHA384withRSA
SunMSCAPI SHA512withRSA
SunMSCAPI MD5withRSA
SunMSCAPI MD2withRSA
SunMSCAPI RSA
SunMSCAPI RSA
SunMSCAPI RSA/ECB/PKCS1Padding

JAVA加密--JCA、JCE、CSP概念、体系架构与使用示例相关推荐

  1. 谈谈SOA面向服务体系架构的安全问题

    谈谈SOA面向服务体系架构的安全问题 本文我们讨论的是面向服务体系架构(SOA)的安全应用.在展开讨论之前,首先让我们来解析面向服务体系架构的实际含义.面向服务体系架构是一种涉及若干以服务为导向的应用 ...

  2. Java加密体系-java.security包

    一.JCA/ JCE JCA(Java Cryptography Architecture) 是Java体系结构,提供了基本Java加密框架,比如证书.数字签名.消息摘要.秘钥对生成器等,在java. ...

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

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

  4. 第 1 章 JVM 和 Java 体系架构

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM ...

  5. 第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师, 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却 ...

  6. Hadoop:HDFS的概念理解和体系架构-成都加米谷大数据分享

    HDFS是什么? HDFS 全称 Hadoop Distributed File System ,简称HDFS,是一个分布式文件系统.它是谷歌的GFS提出之后出现的另外一种文件系统.它有一定高度的容错 ...

  7. 大数据晋级之路(4)Hadoop生态系统体系架构及基本概念

    一.基本概念 机架:HDFS集群,由分布在多个机架上的大量DataNode组成,不同机架之间节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID, ...

  8. Java Security:Java加密框架(JCA)简要说明

    加密服务总是关联到一个特定的算法或类型,它既提供了密码操作(如Digital Signature或MessageDigest),生成或供应所需的加密材料(Key或Parameters)加密操作,也会以 ...

  9. Java的三大体系架构

    Java发展到今天已经形成了一个完整的体系架构,主要分为三个体系,如下: Java SE ------------------------------------------------------- ...

最新文章

  1. 赠书 | 读懂生成对抗神经网络 GAN,看这文就够了
  2. 人工智能加“医真云”,每年让5700万人告别误诊
  3. Makefile 使用总结
  4. python 面向对象 私有化浅析
  5. thinkPHP利用ajax异步上传图片并显示、删除
  6. python 生成图片_python生成带有表格的图片
  7. codeforces 558E A Simple Task 线段树
  8. easyui tab页面关闭根据回调函数刷新父tab页
  9. python 汽车行业数据库_python3+Neo4j+flask,汽车行业知识图谱项目实战
  10. Android BT种子文件解析
  11. 永中Office—公文的数据集成(转)
  12. springcloudfeign Required request body is missing
  13. 内存报错:Cannot allocate memory
  14. Java工作流管理系统(activity6.0)
  15. [QT_015]Qt学习之基于条目控件的自定义特性(拖拽+右键菜单+样式)
  16. 在Docker 上完成对Springboot+Mysql+Redis的前后端分离项目的部署(全流程,全截图)
  17. excel一个表格分成多个的简单方法
  18. Android多线程下载
  19. 企业承担社会责任的必要性
  20. 数据库系统概论 实验报告答案 实验三:创建及管理数据表

热门文章

  1. Unity 3d 中Debug.Log和Print的区别。
  2. Mac Navicat连接MySQL8.0.11出错:2003 - Can't connect to MySQL server on ……(61 Connection refused)
  3. 微信扫描普通二维码进入小程序
  4. i2c的IOL及上拉电阻
  5. winmerge对比时出现中文乱码的解决办法
  6. 翁恺老师c语言课程笔记
  7. 面向对象(冰箱装大象)
  8. Mac电脑升级13系统后,git clone 代码报错,mac升级后git ssh用不了
  9. 你了解CNAS认证吗?
  10. dhcp服务器是如何进行租约信息的更新的,DHCP服务器