目录

Java Cryptography

Java Cryptography Extension

Java 加密 API 由官方称为 Java Cryptography Extension (JCE) 提供。

Java Cryptography Extension 长期以来一直是 Java 平台的一部分。JCE 最初与 Java 是分开的,因为美国对加密技术有一些出口限制。因此,最强的加密算法并未包含在标准 Java 平台中。如果您是美国境内的公司,您可以为 Java JCE 获得这些更强大的加密算法,但世界其他地区不得不使用较弱的算法(或实现自己的加密算法并插入 JCE)。

今天(2017年)美国的加密出口规则放宽了很多。因此,世界上大部分地区都可以通过 Java JCE 从国际加密标准中受益。

JCA Java 密码体系架构

Java Cryptography Architecture (JCA)

在计算领域,Java Cryptography Architecture (JCA) 是一个使用Java 编程语言处理密码的框架。它构成Java security API的一部分,并且是在 JDK 1.1软件包中首次引入的。 java.security

JCA 使用基于“提供者”的架构 并包含一组用于各种用途的 API,例如加密、密钥生成和管理、安全随机数生成、证书验证等。这些 API 为开发人员提供了一种简单的集成方式应用程序代码的安全性。

核心类与接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java.security
java.security.cert
java.security.spec
java.security.interfaces
javax.crypto
javax.crypto.spec
javax.crypto.interfaces

Provider
SecureRandom
Cipher
MessageDigest
Signature
Mac
AlgorithmParameters
AlgorithmParameterGenerator
KeyFactory
SecretKeyFactory
KeyPairGenerator
KeyGenerator
KeyAgreement
KeyStore
CertificateFactory
CertPathBuilder
CertPathValidator
CertStore
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
  void securityServiceAlgorithms() {
    log.info(
        "default algorithm: keystore {} truststore {}",
        KeyManagerFactory.getDefaultAlgorithm(),
        TrustManagerFactory.getDefaultAlgorithm());
    Set<String> keyStoreAlgorithms = Security.getAlgorithms("KeyStore");
    Assertions.assertTrue(keyStoreAlgorithms.contains(RsaKeyUtil.KeyStoreType.PKCS12.getType()));
    log.info(
        "Provider {}",
        Arrays.stream(Security.getProviders()).map(Provider::getName).collect(Collectors.toList()));

    Set<String> serviceNames =
        Arrays.stream(Security.getProviders())
            .map(Provider::getServices)
            .flatMap(Collection::stream)
            .map(Provider.Service::getType)
            .collect(Collectors.toSet());
    log.info("security services {}", serviceNames);
    for (String serviceName : serviceNames) {
      log.info("{} {}", serviceName, Security.getAlgorithms(serviceName));
    }
  }

提供者

Java 密码学 API 最流行的密码学提供程序之一称为 Bouncy Castle (cryptography),提供很多哈希算法与加密算法的第三方库。

方式一:

# 下载 jce 包 包 <java-home>/lib/ext
# 修改 <java-home>/lib/security/java.security
security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

方式二

1
2
3
4
5
<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk15on</artifactId>
  <version>1.68</version>
</dependency>
1
2
3
4
static{
  // 只用注册一次
  Security.addProvider(new BouncyCastleProvider());
}

KeyStore

Java KeyStore是一个可以包含密钥的数据库。KeyStore可以持有以下类型的密钥:

  • Private keys
  • Public keys + certificates
  • Secret keys

私钥和公钥用于非对称加密。公钥可以具有关联的证书。证书是验证声称拥有公钥的个人、组织或设备的身份的文件。证书通常由验证方进行数字签名作为证明。密钥用于对称加密。

KeyTool

Java Keytool 是一个命令行工具,可以处理 Java KeyStore 文件。Keytool 可以将密钥对生成到 KeyStore 文件中,从 KeyStore 导出证书并将证书导入 KeyStore 以及其他几个功能。

附录