本文主要是介绍【Java基础】了解Java安全体系JCA,使用BouncyCastle的ED25519算法生成密钥对、数据签名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一.Java安全体系结构
- 二.JCA和JCE
- 三.CSP(加密服务提供程序)与Engine类
- 1.CSP
- 2.Engine类
- 如何使用引擎类
- 四.查看当前JDK支持的算法服务提供商(Provider)
- 五.BouncyCastle是什么
- 六.如何使用BouncyCastle?
- 七.bouncycastle实现ED25519工具类
一.Java安全体系结构
总共分为4个部分:
- JCA( Java Cryptography Architecture, Java加密体系结构):提供了基本的加密框架,包括证书、数字签名、消息摘要和密钥对产生器等。它允许开发者通过Java API来访问和操作加密相关的功能。
- JCE( Java Cryptography Extension, Java加密扩展包):JCE在JCA的基础上作了扩展, 提供了各种加密算法、 消息摘要算法(散列算法、哈希算法)和密钥管理等功能。JCE的实现主要在
javax.crypto包( 及其子包)
中 - JSSE( Java Secure Sockets Extension, Java安全套接字扩展包):JSSE提供了基于SSL( Secure Sockets Layer,安全套接字层) 的加密功能。。这有助于确保在网络传输过程中的信息安全,防止数据被窃取或篡改。
- JAAS( Java Authentication and Authentication Service, Java认证和授权服务):用于Java应用程序的
认证和授权
。它允许程序根据用户的身份和权限来限制对某些资源的访问,从而增强了应用程序的安全性。
二.JCA和JCE
JCA: Java密码体系结构 Java Cryptography Architecture
-
JCE(Java Cryptography Extension),在早期JDK版本中,由于受美国的密码出口条例约束,Java中涉及加解密功能的API被限制出口,所以Java中安全组件被分成了
2部分
: 不含加密功能的JCA
(Java Cryptography Architecture )和含加密功能的JCE
(Java Cryptography Extension)。- 现在JCE已经捆绑在JDK中,所以,这里
JCE是JCA的一部分
- 现在JCE已经捆绑在JDK中,所以,这里
-
JCA包含一个提供者
【Provider】体系结构
和一组用于数字签名
,消息摘要(哈希)
,证书和证书验证
,加
密(对称/非对称块/流密码),密钥生成管理
和安全随机数
生成等等的API。
JCA包含两个组件:
-
定义和支持Provider为其提供实现的加密服务的框架。 这个框架包含了诸如java.security,javax.crypto,javax.crypto.spec和javax.crypto.interfaces等软件包。
-
JCA相关代码位于JDK的
rt.jar
中的java.security包及其子包中。 -
JCE相关代码位于JDK的
jce.jar
中的javax.crypto包及其子包中。java.security.Provider
类是所有加密与安全算法的父类。
-
-
Sun,SunRsaSign,SunJCE等实际提供者的具体的加密实现。
-
通过JCA统一的、可扩展的一套
用于实现加密服务的基础功能基础API
,,打包成一个Provider服务( 安全提供者),也就是一个实现JCA标准的jar包
, 可以动态地加载到Java运行环境中。- 而开发者在使用只需根据JCA框架提供的
统一接口来调用各种第三方服务商加密算法
、密钥管理等功能,而无需关心底层的实现细节
- 而开发者在使用只需根据JCA框架提供的
三.CSP(加密服务提供程序)与Engine类
1.CSP
在Java中,并没有直接称为"Cryptographic Service Provider (CSP)
"的官方组件或术语。 然而,Java有一个类似的机制,即Java Cryptography Extension (JCE)中的Provider机制,它允许第三方实现并集成加密服务
。
- java.security.Provider是所有安全算法提供实现的父类。 每个CSP都包含这个类的一个实例,它包含了
提供者的名字,并列出了它实现的所有安全服务/算法
。 - 每个Provider可以包含多种类型的Engine类,这些Engine类
是实现特定加密算法或功能的基类
。这些基类定义了算法的通用接口
,而具体的实现则由不同的Provider提供
。
2.Engine类
Engine类为特定类型的密码服务提供的统一接口,不依赖于特定的密码算法或提供者。
- 加密,数字签名,消息摘要等
- 密钥和算法参数
- 密钥库或证书
消息摘要引擎(Message Digest Engine):
- 作用:用于数据完整性校验。它将输入的任意长度消息进行哈希运算,生成一个固定长度的摘要值。
- 常见算法:包括MD5、SHA-1等。
- 使用场景:在保证消息完整的前提下,即使消息长度非常大,也可以通过摘要值的校验实现快速和安全的数据校验。
java.security.MessageDigest
数字签名引擎(Digital Signature Engine):
- 作用:用于验证数据真实性和完整性。
- 使用场景:常用于电子商务、在线金融等领域,用于保证交易的安全性。
java.security.Signature
对称加密引擎:
- 使用相同的密钥进行加密和解密数据。
javax.crypto.Cipher
类来进行对称加密。- 常见算法:包括DES、AES和Blowfish等。
非对称加密引擎:
- 使用一对密钥(公钥和私钥)进行加密和解密。发送方使用接收方的公钥加密数据,接收方使用自己的私钥解密数据。
- 使用
javax.crypto.Cipher
类进行非对称加密操作。
消息认证码(Message Authentication Code,MAC)引擎
- Mac是一个带密钥的hash算法,首先使用密钥初始化后生成散列值,以保护消息的完整性。
java.crypto.Mac
密钥生成器:
- KeyGenerator:用于生成指定算法的对称密钥。
- KeyPairGenerator:用于生成一对适用于指定算法的非对称加密算法的密钥对。
KeyFactory
- 用于从某种类型的密钥规范(key specification)中导出密钥的引擎。
SecretKeyFactory
- 用于从原始密钥序列化数据中导出密钥的引擎。
SecureRandom
- 用于生成随机或伪随机数字。
如何使用引擎类
1.使用KeyPairGenerator引擎类
生成公钥和私钥的密钥对
- 要使用KeyPairGenerator生成密钥对,你需要首先获取
对应算法的实例
,然后通过调用genKeyPair()
方法来生成密钥对。
public class KeyPairGeneratorExample {public static void main(String[] args) {try {// 创建一个KeyPairGenerator实例,指定密钥对的算法为RSAKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");// 初始化KeyPairGenerator,指定密钥长度keyPairGenerator.initialize(2048); // 2048位密钥长度// 生成密钥对KeyPair keyPair = keyPairGenerator.genKeyPair();// 获取公钥和私钥PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 打印公钥和私钥信息(在实际应用中,不应该直接打印或输出私钥)System.out.println("Public Key: " + publicKey);System.out.println("Private Key: " + privateKey);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}
}
2.使用Mac引擎类
,生成消息摘要算法
- 使用Mac算法,先获取一个Mac实例,指定所使用的算法(如HmacSHA256),然后提供密钥和要计算MAC的消息。
public class MacExample {public static void main(String[] args) {try {// 创建一个Mac实例,指定算法为HmacSHA256Mac mac = Mac.getInstance("HmacSHA256");// 初始化Mac实例,使用指定的密钥byte[] keyBytes = "mySecretKey".getBytes(StandardCharsets.UTF_8);SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");mac.init(secretKeySpec);// 提供要计算MAC的消息byte[] message = "Hello, World!".getBytes(StandardCharsets.UTF_8);// 计算MAC值byte[] macBytes = mac.doFinal(message);// 打印MAC值(通常以十六进制形式表示)System.out.println("MAC: " + bytesToHex(macBytes));} catch (NoSuchAlgorithmException | InvalidKeyException e) {e.printStackTrace();}}// 辅助方法,将字节数组转换为十六进制字符串private static String bytesToHex(byte[] hash) {StringBuilder hexString = new StringBuilder(2 * hash.length);for (int i = 0; i < hash.length; i++) {String hex = Integer.toHexString(0xff & hash[i]);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();}
}
四.查看当前JDK支持的算法服务提供商(Provider)
- 当前版本jdk1.8
public class JavaProividerTest {public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException {System.out.println(printAllSecurityProvidersInMdTable());}// 输出MarkDown格式的表格,具体内容见下表public static String printAllSecurityProvidersInMdTable() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("Provider Name(供应商名称)|Provider Version(供应商版本)|Algorithm Type(算法类型)|Algorithm Name(算法名称)\r\n");stringBuilder.append("|:-|:-|:-|:-\r\n");Map<String, Map<String, String>> providers2Algorithms = Arrays.stream(Security.getProviders()).collect(Collectors.toMap(provider -> provider.getName() + "@" + provider.getVersion(), provider -> provider.getServices().stream().collect(Collectors.toMap(service -> service.getType(), service -> service.getAlgorithm(), (algorithm1, algorithm2) -> algorithm1 + "@" + algorithm2))));providers2Algorithms.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).forEachOrdered(entryProvider -> {String[] provider = entryProvider.getKey().split("@");Map<String, String> algoType2AlgoName = entryProvider.getValue();int[] rowNumber = {0};algoType2AlgoName.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).forEachOrdered(entryAlgorithm -> {StringBuilder algorithmCellStr = new StringBuilder();int[] numberOfAlgorithm = {1};Arrays.stream(entryAlgorithm.getValue().split("@")).sorted(String::compareTo).forEachOrdered(algorithm -> {algorithmCellStr.append(algorithm);if (0 == numberOfAlgorithm[0] % 1) {algorithmCellStr.append("<br>");}numberOfAlgorithm[0]++;});stringBuilder.append(String.format("|%s|%s|%s|%s\r\n", 0 == rowNumber[0] ? provider[0] : "", 0 == rowNumber[0] ? provider[1] : "", entryAlgorithm.getKey(), algorithmCellStr.toString()));rowNumber[0]++;});});return stringBuilder.toString();}// 输出纯文本格式public static void printAllSecurityProviders() {for (Provider provider : Security.getProviders()) {System.out.println("Provider: " + provider.getName() + " (ver " + provider.getVersion() + ")");System.out.print(" Algorithms: ");ArrayList<String> algos = new ArrayList<String>();for (Provider.Service service : provider.getServices()) {algos.add(String.format("%s (%s)", service.getAlgorithm(), service.getType()));}java.util.Collections.sort(algos);String algorsStr = algos.toString();algorsStr = algorsStr.substring(1, algorsStr.length() - 1);System.out.println(algorsStr);System.out.println();}}
}
当前JDK版本为1.8,每个JDK安装都默认安装并配置了一个或多个provider包。
public static void main(String[] args) {System.out.println("-------列出加密服务提供者-----");Provider[] pro = Security.getProviders();for (Provider p : pro) {System.out.println("Provider:" + p.getName() + " - version:" + p.getVersion());System.out.println(p.getInfo());}System.out.println("");System.out.println("-------列出系统支持的消息摘要算法(散列算法、哈希算法):");for (String s : Security.getAlgorithms("MessageDigest")) {System.out.println(s);}System.out.println("-------列出系统支持的生成公钥和私钥对的算法:");for (String s : Security.getAlgorithms("KeyPairGenerator")) {System.out.println(s);}}
- 可以看到默认情况下java1.8已经支持市面上绝大多数常见算法
有一些算法JDK中的Provider并没有提供,用户可以静态或动态添加其他provider。
- 除了jdk自带的加解密实现外,另外2个主要的加解密算法的提供者为
bouncy castle
和apache common codec
,它们提供了额外的算法以及在JDK基础上提高了易用性。其中bouncy castle就提供了Provider的扩展,补充了JDK没有实现的一些算法
。
下面我们就以bouncy castle为例,看看如何添加新的Provider扩展:
五.BouncyCastle是什么
- BouncyCastle(轻量级密码术包)是一种用于 Java 平台的开源的轻量级加密包;Bouncycstle 包含了大量哈希算法和加密算法,包括Java标准库没有的一些算法,如非对称加密算法
ECDSA(椭圆曲线数字签名算法)
,并提供JCE 1.2.1
的实现、RipeMD160哈希算法、椭圆曲线数字签名算法分支ED25519
六.如何使用BouncyCastle?
- maven中央仓库
引入bouncycastle依赖
<!-- <dependency>--><!-- <groupId>org.bouncycastle</groupId>--><!-- <artifactId>bcprov-jdk18on</artifactId>--><!-- <version>1.77</version>--><!-- </dependency>--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>
Java标准库的java.security包提供了一种标准机制,允许第三方提供商无缝接入
。使用BouncyCastle提供的ED25519算法,需要先把BouncyCastle注册一下:
- 加入一行代码:在java应用程序启动注册BouncyCastle提供的所有哈希算法和加密算法
static {//注册只需要在启动时进行一次,后续就可以使用BouncyCastle提供的所有哈希算法和加密算法。Security.addProvider(new BouncyCastleProvider());}
执行代码:
-
可以看到bouncycastle作为加密服务提供者已经注册到java程序中
-
系统支持的哈希算法和非对称加密算法也多出了很多
-------列出系统支持的消息摘要算法(散列算法、哈希算法):
SHA-1
SHA-384
HARAKA-256
SKEIN-512-256
SKEIN-1024-384
BLAKE2B-160
SHA
KECCAK-288
WHIRLPOOL
SKEIN-512-384
SHA-224
SM3
BLAKE2B-512
OID.1.0.10118.3.0.55
GOST3411-2012-512
KECCAK-256
SKEIN-512-128
BLAKE2B-384
SHAKE256-512
SKEIN-256-160
DSTU7564-256
SHA-256
BLAKE2S-224
SHA3-256
KECCAK-384
SKEIN-256-128
DSTU7564-384
HARAKA-512
SHAKE128-256
KECCAK-224
SKEIN-512-512
SKEIN-1024-512
SKEIN-512-160
GOST3411
BLAKE2B-256
SKEIN-1024-1024
SHA3-384
BLAKE2S-256
SHA-512/224
TIGER
RIPEMD256
SKEIN-256-256
SHA3-224
SHA3-512
RIPEMD320
RIPEMD160
GOST3411-2012-256
KECCAK-512
SKEIN-512-224
BLAKE2S-160
SHA-512/256
MD2
RIPEMD128
MD4
SHA-512
SKEIN-256-224
MD5
BLAKE2S-128
DSTU7564-512
-------列出系统支持的生成公钥和私钥对的算法(非对称加密算法):
ECDH
DH
DIFFIEHELLMAN
ECGOST3410-2012
X448
ECDHC
ED25519
GOST3410
ELGAMAL
DSA
ED448
DSTU4145
XDH
EC
ECDSA
RSA
X25519
ECGOST3410
ECIES
ECDHWITHSHA1KDF
RSASSA-PSS
EDDSA
ECMQV
七.bouncycastle实现ED25519工具类
Ed25519是椭圆曲线数字签名算法(ECDSA)的一个重要分支
特点:
- 安全性: Ed25519相对于传统的ECDSA有着更好的安全性。
- 效率: 它的运行效率非常高,适合在各种设备上执行,包括移动设备。
- 短签名: 它产生的签名非常短,只有64字节。
- 可用于区块链签名。签名过程不依赖
随机数生成器,
不依赖哈希函数的抗碰撞性
,没有时间通道
攻击的问题。
- 可用于区块链签名。签名过程不依赖
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.generators.Ed25519KeyPairGenerator;
import org.bouncycastle.crypto.params.Ed25519KeyGenerationParameters;
import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
import org.bouncycastle.crypto.signers.Ed25519Signer;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;/*** BouncyCastle是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。其它第三方库还有Commons Codec等。* 你可以使用Bouncy Castle的API来生成密钥对,然后使用私钥对消息进行签名,使用公钥来验证签名。*/
public class Ed25519Utils {static {//注册只需要在启动时进行一次,后续就可以使用BouncyCastle提供的所有哈希算法和加密算法。Security.addProvider(new BouncyCastleProvider());}//1.初始化密钥对private static AsymmetricCipherKeyPair KEY_PAIR = generateKeyPair();//2.创建一个私钥和私钥private static Ed25519PrivateKeyParameters PRIVATE_KEY = getPrivateKey(KEY_PAIR);private static Ed25519PublicKeyParameters PUBLIC_KEY = getPublicKey(KEY_PAIR);/*** 初始化上下文*/public static void initContext() {KEY_PAIR = generateKeyPair();PRIVATE_KEY = getPrivateKey(KEY_PAIR);PUBLIC_KEY = getPublicKey(KEY_PAIR);}/*** 获取私钥对消息签名的Base64格式字符串** @param message* @return*/public static String getPrivateKeySignMessageBase64(String message) {byte[] messageBytes = getBytes(message);System.out.println("签名消息:" + message + "\n");//使用私钥对消息进行签名,然后将私钥签名编码为Base64格式,最后将base64私钥签名进行url编码byte[] privateSignatureByte = privateKeySign(PRIVATE_KEY, messageBytes);return base64EncodeToString(privateSignatureByte);}/*** 使用公钥来验证签名。** @param message 签名消息* @param privateBase64Sign 私钥对消息签名的Base64格式字符串*/public static boolean publicKeyCheckSign(String message, String privateBase64Sign) {//初始化签名器Ed25519Signer verifier = new Ed25519Signer();verifier.init(false, PUBLIC_KEY);//执行验签verifier.update(getBytes(message), 0, getBytes(message).length);//验签结果return verifier.verifySignature(Base64.getDecoder().decode(privateBase64Sign));}/*** 使用私钥对消息进行签名** @param privateKey 私钥* @param messageBytes 消息 "account=zichangaibantest1@163.com&captcha=111111&code=WrPQctXMOu&pub_key=" + publicBase64Str + "&type=2";* @return 私钥签名后的base编码消息*/public static byte[] privateKeySign(Ed25519PrivateKeyParameters privateKey, byte[] messageBytes) {//初始化签名器Ed25519Signer signer = new Ed25519Signer();signer.init(true, privateKey);// 执行签名signer.update(messageBytes, 0, messageBytes.length);//7.将私钥签名编码为Base64格式return signer.generateSignature();}private static AsymmetricCipherKeyPair generateKeyPair() {//1.创建ed25519密钥生成器Ed25519KeyPairGenerator keyPairGenerator = new Ed25519KeyPairGenerator();//密钥生成参数,需要指定随机种子SecureRandom secureRandom = new SecureRandom();Ed25519KeyGenerationParameters keyGenerationParameters = new Ed25519KeyGenerationParameters(secureRandom);keyPairGenerator.init(keyGenerationParameters);//2.生成公私钥对return keyPairGenerator.generateKeyPair();}/*** 获取私钥对象** @param keyPair* @return*/private static Ed25519PrivateKeyParameters getPrivateKey(AsymmetricCipherKeyPair keyPair) {return (Ed25519PrivateKeyParameters) keyPair.getPrivate();}/*** 获取公钥对象** @param keyPair* @return*/private static Ed25519PublicKeyParameters getPublicKey(AsymmetricCipherKeyPair keyPair) {return (Ed25519PublicKeyParameters) keyPair.getPublic();}/*** 获取私钥字节** @param privateKey* @return*/private static byte[] getPrivateByte(Ed25519PrivateKeyParameters privateKey) {//序列化私钥return privateKey.getEncoded();}/*** 获取公钥字节** @param publicKey* @return*/private static byte[] getPublicByte(Ed25519PublicKeyParameters publicKey) {//序列化公钥return publicKey.getEncoded();}/*** 获取base64编码后字符串** @param bytes* @return 如:/85uEv81XgrIbuHqnUMVRSrS8C/tr9jn0NBSv0wb1Dk= 会携带/、=之类特殊符号*/public static String base64EncodeToString(byte[] bytes) {return Base64.getEncoder().encodeToString(bytes);}/*** 获取私钥base64编码后字符串** @param privateBase64Str 如:/85uEv81XgrIbuHqnUMVRSrS8C/tr9jn0NBSv0wb1Dk= 会携带/、=之类特殊符号* @return*/public static String urlEncodeStr(String privateBase64Str) {try {return URLEncoder.encode(privateBase64Str, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}public static byte[] getBytes(String str) {return str.getBytes(StandardCharsets.UTF_8);}/*** 获取base64编码公钥字符串** @return*/public static String getBase64Public() {byte[] publicBytes = getPublicByte(PUBLIC_KEY);return base64EncodeToString(publicBytes);}/*** 获取url编码后的 获取base64编码公钥字符串** @return* @throws*/public static String getBase64UrlEncodePublic() {return urlEncodeStr(getBase64Public());}/*** 获取base64编码私钥字符串** @return*/public static String getBase64Private() {byte[] priavteBytes = getPrivateByte(PRIVATE_KEY);return base64EncodeToString(priavteBytes);}/*** 获取url编码后的 获取base64编码私钥字符串** @return* @throws*/public static String getBase64UrlEncodePrivate() {return urlEncodeStr(getBase64Private());}
}
测试代码
public static void main(String[] args) {for (int i = 0; i < 1; i++) {Ed25519Utils.initContext();//1.将publicBytes编码为Base64格式,然后对Base64公钥进行url编码String publicBase64 = Ed25519Utils.getBase64Public();String urlEncodedBase64Public = Ed25519Utils.urlEncodeStr(publicBase64);System.out.println("base64公钥:" + publicBase64);System.out.println("URL编码后的base64公钥为:" + urlEncodedBase64Public + "\n");//2.将privateBytes编码为Base64格式,然后对Base64私钥进行url编码String privateBase64 = Ed25519Utils.getBase64Private();String urlEncodedBase64Private = Ed25519Utils.urlEncodeStr(privateBase64);System.out.println("base64私钥:" + privateBase64);System.out.println("URL编码后的base64私钥为:" + urlEncodedBase64Private + "\n");//3.拼接公钥到请求消息中,同时序列化消息String message = "account=zichangaibantest1@163.com&captcha=111111&code=WrPQctXMOu&pub_key=publicKey&type=2";// 需要签名的数据,根据key进行排序,然后序列化签名message = message.replaceAll("publicKey", publicBase64);//4.使用私钥对消息进行签名,然后将私钥签名编码为Base64格式,最后将base64私钥签名进行url编码String privateBase64Sign = Ed25519Utils.getPrivateKeySignMessageBase64(message);String urlEncodePrivateBase64Sign = Ed25519Utils.urlEncodeStr(privateBase64Sign);System.out.println("bas4私钥签名消息为:" + privateBase64Sign);System.out.println("私钥签名消息:" + urlEncodePrivateBase64Sign + "\n");//5.使用公钥验证签名boolean isValid = Ed25519Utils.publicKeyCheckSign(message, privateBase64Sign);System.out.println("验证私钥签名是否正确 i: " + isValid);System.out.println("----------------------------------------------------");System.out.println("----------------------------------------------------");}}
}
执行结果
Provider Name | Provider Version | Algorithm Type | Algorithm Name |
---|---|---|---|
SUN | 1.8 | AlgorithmParameterGenerator | DSA |
AlgorithmParameters | DSA | ||
CertPathBuilder | PKIX | ||
CertPathValidator | PKIX | ||
CertStore | Collection LDAP com.sun.security.IndexedCollection | ||
CertificateFactory | X.509 | ||
Configuration | JavaLoginConfig | ||
KeyFactory | DSA | ||
KeyPairGenerator | DSA | ||
KeyStore | CaseExactJKS DKS JKS | ||
MessageDigest | MD2 MD5 SHA SHA-224 SHA-256 SHA-384 SHA-512 | ||
Policy | JavaPolicy | ||
SecureRandom | SHA1PRNG | ||
Signature | NONEwithDSA SHA1withDSA SHA224withDSA SHA256withDSA | ||
SunEC | 1.8 | AlgorithmParameters | EC |
KeyAgreement | ECDH | ||
KeyFactory | EC | ||
KeyPairGenerator | EC | ||
Signature | NONEwithECDSA SHA1withECDSA SHA224withECDSA SHA256withECDSA SHA384withECDSA SHA512withECDSA | ||
SunJCE | 1.8 | AlgorithmParameterGenerator | DiffieHellman |
AlgorithmParameters | AES Blowfish DES DESede DiffieHellman GCM OAEP PBE PBES2 PBEWithHmacSHA1AndAES_128 PBEWithHmacSHA1AndAES_256 PBEWithHmacSHA224AndAES_128 PBEWithHmacSHA224AndAES_256 PBEWithHmacSHA256AndAES_128 PBEWithHmacSHA256AndAES_256 PBEWithHmacSHA384AndAES_128 PBEWithHmacSHA384AndAES_256 PBEWithHmacSHA512AndAES_128 PBEWithHmacSHA512AndAES_256 PBEWithMD5AndDES PBEWithMD5AndTripleDES PBEWithSHA1AndDESede PBEWithSHA1AndRC2_128 PBEWithSHA1AndRC2_40 PBEWithSHA1AndRC4_128 PBEWithSHA1AndRC4_40 RC2 | ||
Cipher | AES AESWrap AESWrap_128 AESWrap_192 AESWrap_256 AES_128/CBC/NoPadding AES_128/CFB/NoPadding AES_128/ECB/NoPadding AES_128/GCM/NoPadding AES_128/OFB/NoPadding AES_192/CBC/NoPadding AES_192/CFB/NoPadding AES_192/ECB/NoPadding AES_192/GCM/NoPadding AES_192/OFB/NoPadding AES_256/CBC/NoPadding AES_256/CFB/NoPadding AES_256/ECB/NoPadding AES_256/GCM/NoPadding AES_256/OFB/NoPadding ARCFOUR Blowfish DES DESede DESedeWrap PBEWithHmacSHA1AndAES_128 PBEWithHmacSHA1AndAES_256 PBEWithHmacSHA224AndAES_128 PBEWithHmacSHA224AndAES_256 PBEWithHmacSHA256AndAES_128 PBEWithHmacSHA256AndAES_256 PBEWithHmacSHA384AndAES_128 PBEWithHmacSHA384AndAES_256 PBEWithHmacSHA512AndAES_128 PBEWithHmacSHA512AndAES_256 PBEWithMD5AndDES PBEWithMD5AndTripleDES PBEWithSHA1AndDESede PBEWithSHA1AndRC2_128 PBEWithSHA1AndRC2_40 PBEWithSHA1AndRC4_128 PBEWithSHA1AndRC4_40 RC2 RSA | ||
KeyAgreement | DiffieHellman | ||
KeyFactory | DiffieHellman | ||
KeyGenerator | AES ARCFOUR Blowfish DES DESede HmacMD5 HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 RC2 SunTls12Prf SunTlsKeyMaterial SunTlsMasterSecret SunTlsPrf SunTlsRsaPremasterSecret | ||
KeyPairGenerator | DiffieHellman | ||
KeyStore | JCEKS | ||
Mac | HmacMD5 HmacPBESHA1 HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 PBEWithHmacSHA1 PBEWithHmacSHA224 PBEWithHmacSHA256 PBEWithHmacSHA384 PBEWithHmacSHA512 SslMacMD5 SslMacSHA1 | ||
SecretKeyFactory | DES DESede PBEWithHmacSHA1AndAES_128 PBEWithHmacSHA1AndAES_256 PBEWithHmacSHA224AndAES_128 PBEWithHmacSHA224AndAES_256 PBEWithHmacSHA256AndAES_128 PBEWithHmacSHA256AndAES_256 PBEWithHmacSHA384AndAES_128 PBEWithHmacSHA384AndAES_256 PBEWithHmacSHA512AndAES_128 PBEWithHmacSHA512AndAES_256 PBEWithMD5AndDES PBEWithMD5AndTripleDES PBEWithSHA1AndDESede PBEWithSHA1AndRC2_128 PBEWithSHA1AndRC2_40 PBEWithSHA1AndRC4_128 PBEWithSHA1AndRC4_40 PBKDF2WithHmacSHA1 PBKDF2WithHmacSHA224 PBKDF2WithHmacSHA256 PBKDF2WithHmacSHA384 PBKDF2WithHmacSHA512 | ||
SunJGSS | 1.8 | GssApiMechanism | 1.2.840.113554.1.2.2 1.3.6.1.5.5.2 |
SunJSSE | 1.8 | KeyFactory | RSA |
KeyManagerFactory | NewSunX509 SunX509 | ||
KeyPairGenerator | RSA | ||
KeyStore | PKCS12 | ||
SSLContext | Default TLS TLSv1 TLSv1.1 TLSv1.2 | ||
Signature | MD2withRSA MD5andSHA1withRSA MD5withRSA SHA1withRSA | ||
TrustManagerFactory | PKIX SunX509 | ||
SunMSCAPI | 1.8 | Cipher | RSA RSA/ECB/PKCS1Padding |
KeyPairGenerator | RSA | ||
KeyStore | Windows-MY Windows-ROOT | ||
SecureRandom | Windows-PRNG | ||
Signature | MD2withRSA MD5withRSA NONEwithRSA SHA1withRSA SHA256withRSA SHA384withRSA SHA512withRSA | ||
SunPCSC | 1.8 | TerminalFactory | PC/SC |
SunRsaSign | 1.8 | KeyFactory | RSA |
KeyPairGenerator | RSA | ||
Signature | MD2withRSA MD5withRSA SHA1withRSA SHA224withRSA SHA256withRSA SHA384withRSA SHA512withRSA | ||
SunSASL | 1.8 | SaslClientFactory | CRAM-MD5 DIGEST-MD5 EXTERNAL GSSAPI NTLM PLAIN |
SaslServerFactory | CRAM-MD5 DIGEST-MD5 GSSAPI NTLM | ||
XMLDSig | 1.8 | KeyInfoFactory | DOM |
TransformService | http://www.w3.org/2000/09/xmldsig#base64 http://www.w3.org/2000/09/xmldsig#enveloped-signature http://www.w3.org/2001/10/xml-exc-c14n# http://www.w3.org/2001/10/xml-exc-c14n#WithComments http://www.w3.org/2002/06/xmldsig-filter2 http://www.w3.org/2006/12/xml-c14n11 http://www.w3.org/2006/12/xml-c14n11#WithComments http://www.w3.org/TR/1999/REC-xpath-19991116 http://www.w3.org/TR/1999/REC-xslt-19991116 http://www.w3.org/TR/2001/REC-xml-c14n-20010315 http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments | ||
XMLSignatureFactory | DOM |
这篇关于【Java基础】了解Java安全体系JCA,使用BouncyCastle的ED25519算法生成密钥对、数据签名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!