Basic Security Architecture
JDK 定义了一组跨越主要安全领域的 API,包括加密、公钥基础设施、身份验证、安全通信和访问控制(cryptography, public key infrastructure, authentication, secure communication, and access control)。
这些API遵循的原则:
- Implementation independence 执行独立性
-
- 应用程序不需要自己实现安全性
- 可以通过标准接口从 JDK 请求安全服务
- 应用程序的安全功能可能依赖于多个独立的提供程序
- Implementation interoperability 实现互操作性
-
- 提供程序可以跨应用程序互操作
- Algorithm extensibility 算法可扩展性
-
-
JDK 包括许多内置提供程序,同时也支持自定义提供程序***
-
Security Providers
Java Security API的“提供者”,其中提供者实现了Java Security的部分或全部部分。 提供商可能实施的服务包括:
- 算法(如DSA,RSA,MD5或SHA-1)。
- 密钥生成,转换和管理功能(如针对特定于算法的密钥)。
MessageDigest md = MessageDigest.getInstance("MD5");
MessageDigest md = MessageDigest.getInstance("MD5", "ProviderC");
Java Cryptography
Java的Cryptography架构是一个提供访问和开发密码功能的框架。它提供了许多cryptographic服务:
- Message digest algorithms 【信息摘要算法, 如:MD5】
- Digital signature algorithms 【数字签名算法,DSA】
- Symmetric bulk encryption 【对称块加密, 如:DES】
- Symmetric stream encryption 【对称流加密, 如:RC4】
- Asymmetric encryption 【非对称加密, 如:RSA】
- Password-based encryption (PBE) 【密码加密】
- Elliptic Curve Cryptography (ECC) 【椭圆曲线加密】
- Key agreement algorithms 【key协议算法】
- Key generators 【key生成器】
- Message Authentication Codes (MACs) 【消息认证码】
- (Pseudo-)random number generators 【伪随机数生成器】
因为历史原因,Cryptography API位于两个独立的包内:
- java.security(Signature, MessageDigest) contains classes that are not subject to export controls
- javax.crypto(Cipher, KeyAgreement) contains classes that are subject to export controls
Java内置的Provider提供了许多通用的密码算法比如:
- RSA, DSA, ECDSA等签名算法
- DES, AES, ARCFOUR等加密算法
- MD5, SHA-1, SHA-256等信息摘要算法
- 还有Diffie-Hellman和ECDH这样的密钥协商算法。
此外,还有一些特殊的provider,比如:
- SunPKCS11, 它允许Java代码无缝地使用PKCS#11的compliant tokens。
- 在Windows平台上,Java还提供了一些native的Provider去连接本地的 Microsoft CryptoAPI。这个provider的名字叫MSCAPI。它允许Java应用无缝地使用Windows平台的cryptographic service。
****Public Key Infrastructure
公钥基础设施(PKI)是一个术语,用于支持基于公钥加密的安全信息交换的框架。它允许(个人、组织等)的身份与数字证书绑定,并提供了一种验证证书真实性的方法。PKI 包括密钥、证书、公钥加密以及生成和数字签名证书的可信证书颁发机构(CA)。
Java 平台包括对 X.509数字证书和证书撤销列表(CRL)的 API 和提供者支持,以及符合 PKIX 的证书路径构建和验证。与 PKI 相关的类位于 java.security 和 java.security.cert 包中。
Key and Certificate Storage
Java 平台通过密钥和证书存储提供加密密钥和证书的长期持久存储。
- java.security.KeyStore 类表示密钥存储库、加密密钥和/或可信证书的安全存储库(例如,在验证路径验证期间使用)
- java.security.cert.CertStore 类表示一个证书存储库,这是一个公共的、可能包含大量不相关且通常不受信任的证书的存储库。CertStore 也可以存储 CRL。
KeyStore 和 CertStore 实现按类型区分。Java 平台包括标准的 PKCS11和 PKCS12密钥存储类型(其实现符合来自 RSA Security 的相应 PKCS 规范)。它还包含一个专有的基于文件的密钥存储类型 JKS (代表 Java Key Store)和一个名为 DKS (Domain Key Store)的密钥存储类型,后者是以单个逻辑密钥存储表示的密钥存储集合。
Java 平台还包括 LDAP 证书存储类型(用于访问存储在 LDAP 目录中的证书) ,以及内存中 Collection 证书存储类型(用于访问在 Java.util 中管理的证书)。集合对象)。
Public Key Infrastructure Tools
有两个用于处理密钥、证书和密钥存储的内置工具:
- Keytool 创建并管理密钥存储:
-
- Create public/private key pairs 创建公钥/私钥对
- Display, import, and export X.509 v1, v2, and v3 certificates stored as files 显示、导入和导出作为文件存储的 X.509 v1、 v2和 v3证书
- Create X.509 certificates 创建 X.509证书
- Issue certificate (PKCS#10) requests to be sent to CAs 要发送到 CA 的发行证书(PKCS # 10)请求
- Create certificates based on certificate requests 根据证书请求创建证书
- Import certificate replies (obtained from the CAs sent certificate requests) 导入证书答复(从 CA 发送的证书请求中获得)
- Designate public key certificates as trusted 指定公钥证书为受信任证书
- Accept a password and store it securely as a secret key 接受密码并将其安全地存储为密钥
- Jarsigner 对 JAR 文件进行签名并验证已签名的 JAR 文件上的签名。JavaArchive (JAR)文件格式允许将多个文件绑定到一个文件中。通常,JAR 文件包含与 applet 和应用程序关联的类文件和辅助资源。
-
-
代码数字签名(省略)
-
Authentication
Secure Communication
Access Control
XML Signature
JavaXML 数字签名 API 是用于生成和验证 XML 签名的标准 JavaAPI。
Security Tools Summary
重要加密类
Providers
该类代表Java Security API的“提供者”,其中提供者实现了Java Security的部分或全部部分。 提供商可能实施的服务包括:
-
算法(如DSA,RSA,MD5或SHA-1)。
-
密钥生成,转换和管理功能(如针对特定于算法的密钥)。
Security
此类集中所有安全属性和常见的安全方法。其主要用途之一是管理提供商。
安全属性的默认值是从具体实现的位置,这是典型的属性文件中读取lib/security/java.security在Java安装目录。
KeySotre
该类代表加密密钥和证书的存储设备。KeyStore管理不同类型的条目。 每种类型的条目实现了KeyStore.Entry接口。 提供了三个基本的KeyStore.Entry实现:
- KeyStore.PrivateKeyEntry这种类型的条目保存加密PrivateKey ,其可选地以受保护的格式存储以防止未经授权的访问。 还附有相应公钥的证书链。私钥和证书链由给定实体用于自身认证。 用于此认证的应用程序包括在发布和/或许可软件时签署JAR文件的软件分发机构。
- KeyStore.SecretKeyEntry这种类型的条目保存加密SecretKey ,其可选地以受保护的格式存储以防止未经授权的访问。
- KeyStore.TrustedCertificateEntry这种类型的条目包含属于另一方的单个公钥Certificate 。 它被称为可信证书 ,因为密钥库所有者信任证书中的公钥确实属于由证书的主体 (所有者)标识的身份。这种类型的条目可用于验证其他方。
密钥库中的每个条目都由“别名”字符串标识。 在私钥及其关联的证书链的情况下,这些字符串区分实体可以自己认证的不同方式。 例如,实体可以使用不同的证书颁发机构或使用不同的公钥算法对其进行身份验证。
- getInstance(String type)返回指定类型的密钥库对象
- getKey(String alias, char[] password) 返回与给定别名相关联的密钥,使用给定的密码恢复它
- load(InputStream stream, char[] password) 从给定的输入流加载此KeyStore
- store(OutputStream stream, char[] password) 将此密钥库存储到给定的输出流,并使用给定的密码保护其完整性
- getCertificate(String alias) 返回与给定别名相关联的证书
// 提供特定的密钥库类型
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(privateKeyPath), PASSWORD.toCharArray());
Certificate x509Certificate = keyStore.getCertificate(ALIAS);
Certificate
用于管理各种身份证件的抽象类。 身份证明书是一个委托人与另一个委托人提供的公钥的绑定。 (主体代表一个实体,如个人用户,一个团体或一个公司)。
该类是具有不同格式但重要常见用途的证书的抽象。 例如,不同类型的证书(如X.509和PGP)共享一般证书功能(如编码和验证)以及某些类型的信息(如公钥)。
X.509,PGP和SDSI证书都可以通过对证书类进行子类化来实现,即使它们包含不同的信息集,并且以不同的方式存储和检索信息。
- getPublicKey() 从此证书获取公钥
Signature 数字签名
Signature 类是个引擎类,它是为了提供诸如 DSA 或 RSA with MD5 这样的数字签名算法功能而设计的,可用于生成和验证数字签名。
密码学上安全的签名算法可接受任意大小的输入和一个私钥,并产生一个比较短(常常是固定大小的)的名为 signature 的字节串,它具有以下属性:
-
给定与签名的私钥相对应的公钥,就应能校验输入的真实性和完整性。
-
签名和公钥不反映有关私钥的任何内容。
签名的意义:
- Integrity (完整性)确保信息没有被改变
- Authentication可以验证是谁发送的信息
签名算法可以是NIST标准DSA,使用DSA和SHA-1。 使用SHA-1消息摘要算法的DSA算法可以指定为SHA1withDSA 。 在RSA的情况下,存在对消息多个选择摘要算法,所以签名算法可被指定为,例如, MD2withRSA , MD5withRSA ,或SHA1withRSA 。 必须指定算法名称,因为没有默认值。
Signature对象用于签名数据或验证签名有三个阶段:
- 初始化
-
- 一个公钥,用于初始化签名以进行验证(见initVerify )或
- 私钥(和可选的安全随机数生成器),其初始化用于签名的签名(参见initSign(PrivateKey)和initSign(PrivateKey, SecureRandom) )。
MessageDigest 信息摘要
MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的。
消息摘要(数字指纹) 是采用任意大小的数据并输出固定长度散列值的安全单向散列函数。摘要特点:
- 无法通过计算找到两个散列成相同值的报文。
- 摘要不反映任何与输入有关的内容。
重要方法
- digest() 通过执行最后的操作(如填充)来完成哈希计算。
- getAlgorithm() 获取算法名称
- getDigestLength() 获取算法返回摘要长度
- getInstance(String algorithm, Provider provider) 返回实现指定摘要算法的MessageDigest对象
- update(byte input) 使用指定的字节更新摘要
- reset() 重置算法
与 Signature 的区别
- 通过Message Digest 可确定文件未被修改,但无法确定是谁发送的
- 签名可确保文件完整性、可信发送方
Cipher
该类提供加密和解密的加密密码的功能。 它构成了Java加密扩展(JCE)框架的核心
参考文档:
JAVA加密体系结构_soief的博客-CSDN博客
【网络】java密码安全_hancoder的博客-CSDN博客