基础篇:java.security框架之签名、加密、摘要及证书
前言
和前端进行数据交互时或者和第三方商家对接时,需要对隐私数据进行加密。单向加密,对称加密,非对称加密,其对应的算法也各式各样。java提供了统一的框架来规范(java.security)安全加密这类API。下面将一一介绍
- 加密算法概念及分类
- 秘钥生成
- 摘要算法工具-MessageDigest
- 签名算法工具-Signature
- 常用加密工具类-Cipher
- Certificate-证书的保存
- KeyStore-密钥证书的实体类
- https证书加载
关注公众号,一起交流;微信搜一搜: 潜行前行
1 加密算法概念及分类
常用的加密算法类型有三种,如下:
- 单向加密:也就是不可逆的加密,例如MD5,SHA,HMAC
- 对称加密:也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等
- 非对称加密:非对称加密分为公钥和秘钥,二者是非对称的,例如用私钥加密的内容需要使用公钥来解密,使用公钥加密的内容需要用私钥来解密,DSA,RSA
2 秘钥生成
对称加密密钥的生成
- KeyGenerator用于生成对称秘钥(可逆加密),或者一个密码性秘钥
- 支持算法:AES、ARCFOUR、DES、DESede、HmacMD5、HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512、RC2
- 示例
非对称加密秘钥的生成
- KeyPairGenerator用于生成非对称加密算法的密钥对KeyPair,KeyPair会包括一个公钥和私钥
- 支持算法:DiffieHellman、DSA、RSA、RSASSA-PSS、EC
- 示例
- 输出结果
密钥Key和密钥规格KeySpec的相互转化
If the key is stored on a hardware device, its specification may contain information that helps identify the key on the device
KeySpec是一个接口,用来组成加密密钥的密钥内容的(透明)规范。如果密钥存储在硬件设备上,则其规范可以包含有助于标识该设备上的密钥的信息
- KeySpec具有规范性,所以一般会根据外部参数生成KeySpec,再根据KeySpec生成对应的Key(个人理解,如有高见,请说出你的见解)。SecretKeyFactory、KeyFactory的作用就是转换Key与KeySpec
SecretKeyFactory:用于对称加密的密钥和密钥规格之间的转换,配合KeyGenerator使用
- 支持算法:AES、ARCFOUR、DES、DESede、PBEWithMD5AndDES、PBEWithHmacSHA256AndAES_128、PBKDF2WithHmacSHA256
- 示例
KeyFactory:用于非对称加密的密钥和密钥规格之间的转换,配合KeyPairGenerator使用
- 支持算法:DiffieHellman、DSA、RSA、RSASSA-PSS、EC
- 示例
- 输出结果
3 摘要算法-MessageDigest和javax.crypto.Mac(HMAC)
- 单向加密是不可逆的,MD5、SHA、MAC都是属于单向加密算法的一种,也称之为摘要算法
- MD5、SHA它们会根据明文用哈希算法计算一个固定长度的摘要(哈希值),然后把明文和摘要发送给接收者,接收者根据同样的算法计算出摘要,对比两个摘要是否一样即可验证明文的正确性,它的应用场景是:防止篡改和校验数据
- MD5、SHA等算法是开源的,容易被试探出来。有没有更安全的摘要算法呢?HMAC-带密钥(密码)的hash函数,用一个密钥和一个明文消息作为输入,生成一个消息摘要。密钥一般使用KeyGenerator创建,相当于一个密码值,其被试探出的概率小
- MessageDigest支持的算法:MD2、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256
- javax.crypto.Mac支持的算法:HmacMD5、HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512、PBEWithHmacSHA1
- MD5的示例
- MAC的示例
4 签名算法工具-Signature
- 签名算法其实也是加密算法,它加密后的数据具有唯一标识性,就像一个人的签名能代表一个人身份。签名一般是指用非对称加密算法的私钥来加密明文的过程,生成的密文可以被持有公钥的人识别解密,只要你的公钥是准确对应无误的,就能保证你解密的数据是来自持有私钥的一方
- 如何保证公钥是正确无误,没被篡改的?1:一对一给你,2:获取公钥后通过权威机构认证,相关过程可以看下之前写的一篇文章网络篇:朋友面试之https认证加密过程
- 支持算法:NONEwithRSA、MD2withRSA、MD5withRSA、SHA512/224withRSA、SHA512/256withRSA、RSASSA-PSS、NONEwithDSA、SHA512withDSA、NONEwithECDSA、SHA512withECDSA、MD5withRSAandMGF1(太多了,选择列举几个)
- Signature.API示例,配合KeyPairGenerator使用
5 常用加密工具类-Cipher
- 用于加密/解密数据。支持各种类型的算法:对称加密(例如AES),非对称加密(例如RSA)
- 支持算法:AES、AESWrap、ARCFOUR、Blowfish、DES、DESede、DESedeWrap、ECIES、RSA(太多了,选择列举几个)
- 示例
6 Certificate-证书存储
- CertificateFactory:用于创建公钥证书(Certificate)和证书吊销列表(CRL)
- Certificate及其子类X509Certificate
- CertPath和CertPathBuilder:用于构建证书链(也称为证书路径)
- CertPathValidator:用于验证证书链
- CRL:证书吊销列表
- CertStore:用于存储检索证书和CRL
- CertificateFactory和Certificate的示例
- 示例
7 KeyStore-密钥证书的实体类
- KeyStore用于存储私钥和证书(公钥在证书Certificate里面)
- 公钥:是一个详细的实体的数字关联,并有意让所有想同这个实体发生信任关系的其他实体知道.公共钥匙用来检验签名;
- 私钥:是一些数字,私有和公共钥匙存在所有用公共钥匙加密的系统的钥匙对中.公共钥匙用来加密数据,私有钥匙用来计算签名.公钥加密的消息只能用私钥解密,私钥签名的消息只能用公钥检验签名。
- 示例
8 java.https加载证书的API
- KeyManagerFactory、TrustManagerFactory => KeyManager、TrustManager => SSLContext => SSLEngine、SSLSocketFactory、SSLSocket
一般的证书加载过程
- 用Certificate、KeyStore生成创建KeyManagerFactory和TrustManagerFactory
- KeyManagerFactory和TrustManagerFactory用来创建KeyManager和TrustManager
- 而KeyManager和TrustManager用来初始化SSLContext
- 然后使用SSLContext,创建实际实现SSL/TLS协议的对象(SSLSocketFactory、SSLSocket或者SSLEngine)
- SSLSocket和SSLEngine可以直接在通信对象中使用
- KeyManager和TrustManager作用:
- KeyManager负责向对等端显示使用的凭证(使用的密码标准、加密算法、证书、公钥、签名等)
- TrustManager负责验证从对等端收到的凭证,验证凭证有多种方式:其中之一是创建CertPath对象,并让JDK的内置公钥基础结构(PKI)框架处理验证。 在内部,CertPath实现可能会创建一个Signature对象,并使用它来验证证书链中的每个签名
- 示例:生成SSLContext,并使用SSLContext初始化apache-httpClient
欢迎指正文中错误
参考文章
- JCA-Java加密框架
- Java加密框架(JCA)简要说明
- Java加密解密之MAC
- 关于keyGenerator,KeyPairGenerator,SecretKeyFactory的解析
- JCA 实践记录——SecretKeyFactory
- HttpClient 双向认证
- java内置可用加密算法文档
- key解析
__EOF__
本文作者:潜行前行
本文链接:https://www.cnblogs.com/cscw/p/14532682.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/cscw/p/14532682.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY