加密与安全_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中的安全编码实践与防御技巧,这对于开发人员来说…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
