加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库
文章目录
- Java Cryptography Architecture (JCA)
- 开源国密库
- 国密算法
- 对称加密(DES/AES⇒SM4)
- 非对称加密(RSA/ECC⇒SM2)
- 散列(摘要/哈希)算法(MD5/SHA⇒SM3)
- 在线生成公钥私钥对,RSA公私钥生成
- 参考
Java Cryptography Architecture (JCA)
https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html
Java加密体系(Java Cryptography Architecture,JCA)是Java平台的一部分,它提供了一套用于加密、密钥生成和管理的API。JCA的设计目标是能够插入不同的加密服务提供者(Cryptography Service Providers,CSP),使得Java应用程序能够在各种加密算法和协议中灵活选择。
JCA的主要组件包括:
- Cipher类:用于加密和解密数据的类。它支持多种加密模式,如电子密码本(ECB)、密码块链(CBC)、计数器(CTR)等,以及多种填充模式,如PKCS5Padding、NoPadding等。
- Key接口和其子类:表示加密密钥的接口,有不同类型的密钥,如SecretKey、PublicKey和PrivateKey。
- KeyPairGenerator和KeyGenerator类:用于生成密钥对和密钥的类。
- KeyStore类:用于存储和管理密钥和证书的类。
- MessageDigest类:用于生成哈希摘要的类,支持多种哈希算法,如MD5、SHA-1、SHA-256等。
- Signature类:用于生成和验证数字签名的类。
- SecureRandom类:用于生成安全随机数的类。
- Security类和Provider类:Security类用于管理已安装的加密服务提供者,而Provider类则是加密服务提供者的基类。
JCA还支持加密算法的参数设置,如密钥大小、迭代次数等,通过AlgorithmParameterSpec接口及其子类实现。
Java加密体系(JCA)支持多种加密算法,包括对称加密、非对称加密、哈希(散列)算法和数字签名算法。JCA支持的常见加密算法:
对称加密算法:
- AES (Advanced Encryption Standard)
- DES (Data Encryption Standard)
- DESede (Triple DES)
- RC2 (Rivest Cipher 2)
- RC4 (Rivest Cipher 4)
- Blowfish
- Camellia
非对称加密算法:
- RSA
- DSA (Digital Signature Algorithm)
- EC (Elliptic Curve)算法,包括ECDSA和ECDH
哈希(散列)算法:
- MD5 (Message Digest 5)
- SHA-1 (Secure Hash Algorithm 1)
- SHA-256 (SHA-2 family)
- SHA-384 (SHA-2 family)
- SHA-512 (SHA-2 family)
数字签名算法:
- RSA
- DSA
- ECDSA (Elliptic Curve Digital Signature Algorithm)
这些算法可以用于各种加密操作,如数据加密、密钥交换、哈希生成和数字签名。JCA通过Cipher类、Signature类、MessageDigest类等提供了对这些算法的支持。
随着加密技术的发展和安全性的变化,一些算法(如MD5和SHA-1)由于已不再被认为是安全的,因此在某些情况下可能不再推荐使用。
Demo示例
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class JCACryptoExample {public static void main(String[] args) throws Exception {// 生成AES密钥KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128); // 设置密钥大小为128位SecretKey secretKey = keyGenerator.generateKey();// 加密数据Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);String plainText = "This is a secret message!";byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());String encryptedBase64 = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("Encrypted (Base64): " + encryptedBase64);// 解密数据cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedBase64));String decryptedText = new String(decryptedBytes);System.out.println("Decrypted: " + decryptedText);}
}
首先使用KeyGenerator生成一个AES密钥。然后,我们创建一个Cipher实例来初始化加密模式,并使用生成的密钥对字符串进行加密。加密后的数据被转换为Base64编码的字符串以便于显示。接着,我们重新初始化Cipher以解密模式,并使用相同的密钥对加密后的数据进行解密,最后将解密后的数据转换回原始字符串
开源国密库
| 名称 | 描述 | GitHub |
|---|---|---|
| crypto-js | MD5、SHA1、SHA2、SHA3、RIPEMD-160 的哈希散列,AES、DES、Rabbit、RC4、Triple DES 对称加解密 | https://github.com/brix/crypto-js |
| JSEncrypt | 非对称RSA加解密,只支持浏览器,不支持Node | https://github.com/travist/jsencrypt |
| node-rsa | 支持Node运行的RSA加解密库 | https://github.com/rzcoder/node-rsa |
| Web Cryptography API | W3C制定的密码规范API,主流浏览器、Node15都已支持 | https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API |
| opensm | 开源国密SM2/SM3/SM4算法,基于GmSSL,基于OpenSSL1.1.0,7年前(老) | https://github.com/zhangyantao/opensm |
| TencentKonaSMSuite | 腾讯开源的国密套件SDK(Java) | https://github.com/tencent/TencentKonaSMSuite |
| sm-crypto | 国密算法sm2、sm3和sm4的JavaScript实现,有关联java版 | https://github.com/JuneAndGreen/sm-crypto |
| gm-crypto | 国密算法sm2、sm3和sm4的JavaScript实现 | https://github.com/byte-fe/gm-crypto |
| sm-crypto-v2 | 国密算法 sm2、sm3 和 sm4 的 JavaScript 实现 | https://github.com/Cubelrti/sm-crypto-v2 |
| GmSSL | 北京大学国密开源库,包含多个版本Java、JS、PHP、Go…,没有npm包 | https://github.com/guanzhi/GmSSL |
| Tongsuo 铜锁 | 阿里开源的综合性基础密码库,功能比较全 | https://github.com/Tongsuo-Project/Tongsuo |
国密算法

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在一般信息化系统开发中主要使用公开的SM2(非对称)、SM3(摘要)、SM4(对称)三类算法。
Base64是一种编码格式,并不属于加密,常用于数据传输、兼容性问题。Base64编码本质上是一种将二进制数据转成文本数据的方案,将一些不适合传输的数据内容进行编码来适合传输。
对称加密(DES/AES⇒SM4)
🔸基本特点:
- 同一个秘钥进行加密、解密。因此秘钥的保密性就很重要,不能泄漏。
- 计算量小、效率高。
🔸应用场景:
- 数据加密存储。
- 加密通信,如HTTPS、SSL、VPN,会与其他加密算法混合使用。
非对称加密(RSA/ECC⇒SM2)
🔸基本特点:
- 密钥配对:一个私钥、一个公钥,用私钥加密,用公钥解密。注意每一个密钥对都是独一无二、天生一对的,只能配对的秘钥加密、解密。简单来说,公钥加密的数据,只能配对的私钥才能解密。
- 安全性高,但计算量大。
- 基本原理:利用某一数学公式,正向计算容易,反向推理则非常难。
🔸应用场景:
- HPPTS、SSH协议,如Git的ssh认证。
- HTTPS的安全传输就是混合了非对称加密、对称加密,非对称加密协商会话秘钥,用会话秘钥对称加密传输数据。
- 敏感数据的加密传输,如客户端登录时传输用户名、密码信息时,采用公钥加密数据,服务端私钥解密。
- 对数据进行签名、验签,保障数据的完整性,同时验证身份。
散列(摘要/哈希)算法(MD5/SHA⇒SM3)
🔸基本特点:
- 无需秘钥,“加密”后的数据不可逆。所以这也不算是“加密”,一般称为哈希(Hash)。
- 任何长度的数据生成的哈希值长度都固定。
- 相同数据每次生成的哈希值相同,不同的数据则不同。
🔸应用场景:
- 数据摘要/哈希,验证数据是否被篡改、或数据丢失,保障数据的完整性、不可篡改性。
- 单向加密保存数据,如密码的保存,密码的存储普遍都是存的哈希值,登录时比较其hash值即可。
🔸彩虹表破解:
由于散列算法的特点(同一数据生成哈希值始终一样),如果存储了大量(海量)字符内容的哈希值,就很容易进行查询破解了,这就是彩虹表,暴力破解也是一样的道理。常用的6位数字密码是相当容易破解的,如CMD5这个网站就利用存储的大量密文字典,反向查询破解。怎么解决呢?
-
提升散列算法的安全性,常用方法就是加“盐”,核心思想就是在哈希过程中添加一些自定义的内容、规则,仅自己知道,从而避免被字典破解。
-
最简单的比如在密文中某一位置添加一串随机字符,只有自己知道,使用的时候去掉干扰字符即可。
-
加盐的具体方式很多,可以自己DIV,常用的一种模式如下图,加盐+双重哈希。
MD5(MD5(password) + salt) -
如果加盐的规则被窃取了,对于现代的硬件是挺容易被破解的,只能设置尽量复杂的密码+定期更换了。
📢实际应用中,可能会多种加密算法组合使用。
-
比如HTTPS的安全数据传输就是同时用了对称加密、非对称加密,用非对称传送(动态)密钥,对称加密传输数据。 《HTTP协议图文简述》
-
对一个数据进行多重加密,以防被破解
在线生成公钥私钥对,RSA公私钥生成
https://www.metools.info/code/c80.html
RSA非对称加密公私钥对生成,输出PEM格式的公私钥对,同时支持PKCS#1、PKCS#8密钥格式输出;生成的公私钥对,可拷贝到文本文件,保存为.key文件即可使用。
-
PEM格式:RSA公私钥对常用的编码方式,OPENSSL以PEM格式为主,相对DER可读性更强,以BASE64编码呈现;
开头类似 -----BEGIN PRIVATE KEY-----
结尾类似 -----END PRIVATE KEY----- -
PKCS#8密钥格式,多用于JAVA、PHP程序加解密中,为目前用的比较多的密钥、证书格式;
-
PKCS#1密钥格式,多用于JS等其它程序加解密,属于比较老的格式标准。
-
PKCS#1和PKCS#8的主要区别,从本质上说,PKCS#8格式增加验证数据段,保证密钥正确性。
参考
国密SSL实验室
国家密码管理局-密码规范
前端加密·国密算法
一文读懂“密评”实施流程

相关文章:
加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库
文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密(DES/AES⇒SM4)非对称加密(RSA/ECC⇒SM2)散列(摘要/哈希)算法(MD5/SHA⇒SM3) 在线生成公钥私钥对,RSA公私钥生成参考…...
读书笔记-《Spring技术内幕》(三)MVC与Web环境
前面我们学习了 Spring 最核心的 IoC 与 AOP 模块(读书笔记-《Spring技术内幕》(一)IoC容器的实现、读书笔记-《Spring技术内幕》(二)AOP的实现),接下来继续学习 MVC,其同样也是经典…...
k8s及常用对象简介
文章目录 一、k8s是什么应用程序早期部署形式容器的引入k8s的作用 二、k8s中的常用对象1、Node获取node信息 2、Namespacenamespace的使用 3、Pod生命周期pod的使用 4、DaemonSetDaemonSet的使用 5、Deployment创建deploy 6、ReplicaSet7、StatefulSet创建StatefulSet 8、更新操…...
HTTPS数字证书验证论述
1 概述 网络请求方式通常分为两种,分别是HTTP请求和HTTPS请求,其中HTTP的传输属于明文传输,在传输的过程中容易被人截取并且偷窥其中的内容,而HTTPS是一种在HTTP的基础上加了SSL/TLS层(安全套接层)的安全的…...
【高考志愿】地质资源与地质工程
目录 一、专业概述 1.1 专业定义 1.2 主要课程 1.3 专业培养目标 二、就业前景和考研方向 三、工作特点和挑战 四、如何培养核心竞争力 五、 地质资源与地质工程专业排名 六、结语 关于高考志愿选择地质资源与地质工程专业,以下是一些详细的介绍和参考信息…...
全网最佳硕士研究生复试简历模板
硕士研究生复试简历模板 ✨ 简介 提供了一个适用于国内硕士研究生复试的个人简历模板。该模板通过统一的“样式”形成规范的Word格式,是目前研究生复试的最佳简历模板之一。模板使用“华文中宋”字体,如您的电脑中未安装此字体,请提前安装。…...
Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复
Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387:regreSSHion:OpenSSH 服务器中的远程代码执行(RCE),至少在…...
Sping源码(九)—— Bean的初始化(非懒加载)—mergeBeanDefinitionPostProcessor
序言 前几篇文章详细介绍了Spring中实例化Bean的各种方式,其中包括采用FactoryBean的方式创建对象、使用反射创建对象、自定义BeanFactoryPostProcessor以及构造器方式创建对象。 创建对象 这里再来简单回顾一下对象的创建,不知道大家有没有这样一个疑…...
labview技巧——AMC框架安装
AMC工具包的核心概念是队列,队列是一种先进先出(FIFO,First In First Out)的数据结构,适用于处理并发和异步任务。在LabVIEW中,队列可以用于在不同VI之间传递数据,确保消息的有序处理࿰…...
解锁分布式云多集群统一监控的云上最佳实践
作者:在峰 引言 在当今数字化转型加速的时代,随着混合云、多云多集群环境等技术被众多企业广泛应用,分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选,分布式云容器平台 ACK One(Distributed Clou…...
学会拥抱Python六剑客,提高编程效率
在Python语言中,有六个强大的工具,它们被称为"Python六剑客"。而Python六剑客指的是Python中常用的六种功能强大且灵活的工具,它们分别是“切片(Slicing),推导列表(List Comprehensio…...
mysql 根据当前时间筛选某个时间范围内的数据
1.根据天数筛选 SELECT * FROM coupons WHERE NOW() BETWEEN start_time AND end_time; 在这个查询中,NOW()函数返回当前的日期和时间。BETWEEN操作符用于检查NOW()返回的当前时间是否在start_time和end_time之间(包括这两个时间)。 注意&a…...
Linux 常用指令详解
Linux 是一个强大而灵活的操作系统,掌握常用的 Linux 指令是使用和管理 Linux 系统的基础。本文将介绍一些常用的 Linux 指令,并附上 Vim 和 g 的常用指令说明,帮助你更好地进行开发和操作。 1. 基本文件操作指令 1.1 显示目录内容 ls常用…...
【简单讲解下npm常用命令】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
Header Location重定向机制解析与应用
Header Location重定向机制解析与应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨HTTP中的Header Location重定向机制,以及在…...
硅纪元AI应用推荐 | 国产创作引擎即梦AI助力创作者探索创作新境界
“硅纪元AI应用推荐”栏目,为您精选最新、最实用的人工智能应用,无论您是AI发烧友还是新手,都能在这里找到提升生活和工作的利器。与我们一起探索AI的无限可能,开启智慧新时代! 在人工智能快速发展的今天,各…...
使用TableGeneration生成已标注的表格数据用于表格识别
利用 TableGeneration 生成多样化表格数据 TableGeneration 简介环境准备chrome浏览器(Linux下推荐)火狐浏览器(Mac下推荐) 生成表格生成表格 参数说明结论 在数据生成和处理领域,表格数据的生成是一个常见需求,尤其是在机器学习和数据分析领域。今天&am…...
赛目科技三度递表:净利率及资产回报率不断下滑,经营成本越来越高
《港湾商业观察》施子夫 5月29日,北京赛目科技股份有限公司(以下简称,赛目科技)第三次递表港交所,公司拟主板上市,独家保荐机构为光银国际。 公开信息显示,赛目科技此前曾于2022年12月&#x…...
【QT】概述|对象树模型|两种控件模式|信号和槽|lambda
目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…...
Java中的安全编码实践与防御技巧
Java中的安全编码实践与防御技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java中的安全编码实践与防御技巧,这对于开发人员来说…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
