Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。
一、对称加密算法
对称加密算法是指加密和解密使用相同密钥的算法。其特点是加密和解密速度快,效率高,但密钥管理较为复杂,需要安全地传输和存储密钥。在 Java 中常见的对称加密算法有:
- AES(高级加密标准):AES 是一种分组加密算法,它将明文分成固定长度的块进行加密,支持 128 位、192 位和 256 位密钥长度。由于其安全性高、性能好,已成为对称加密的首选算法。在 Java 中使用 AES 加密的示例代码如下:
-
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
public class AESExample {
public static void main(String[] args) throws Exception {
// 生成密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128, new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
// 创建AES密钥规范
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
// 创建Cipher对象并初始化为加密模式
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
// 加密明文
String plainText = "Hello, AES!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// 初始化为解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
System.out.println("明文: " + plainText);
System.out.println("加密后: " + bytesToHex(encryptedBytes));
System.out.println("解密后: " + new String(decryptedBytes));
}
public static String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
}
- DES(数据加密标准):DES 也是一种分组加密算法,它使用 56 位密钥。不过,随着计算机计算能力的提升,56 位密钥长度已逐渐难以满足现代安全需求,其安全性相对较弱,目前在一些对安全性要求不高的旧系统中可能仍有使用。
- 3DES(三重数据加密算法):3DES 通过对数据进行三次 DES 加密,增加了密钥长度,提高了安全性。它使用两个或三个 56 位的密钥,本质上是对 DES 算法的改进,但相比 AES,其加密效率较低。
二、非对称加密算法
非对称加密算法使用一对密钥,即公钥和私钥,公钥用于加密,私钥用于解密。与对称加密不同,非对称加密无需安全传输密钥,解决了密钥分发的难题,但加密和解密速度相对较慢。Java 中常见的非对称加密算法有:
- RSA:RSA 是目前应用最广泛的非对称加密算法之一,它基于大数分解的数学难题。RSA 支持不同长度的密钥,常见的有 1024 位、2048 位等,密钥长度越长,安全性越高,但加密和解密的性能也会越低。在实际应用中,2048 位密钥长度较为常用。以下是 Java 中使用 RSA 进行加密和解密的示例:
-
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
public class RSAExample {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 创建Cipher对象并初始化为加密模式
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// 加密明文
String plainText = "Hello, RSA!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// 初始化为解密模式
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
System.out.println("明文: " + plainText);
System.out.println("加密后: " + bytesToHex(encryptedBytes));
System.out.println("解密后: " + new String(decryptedBytes));
}
public static String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
}
- DSA(数字签名算法):DSA 主要用于数字签名,确保数据的完整性和真实性,以及验证数据的来源。它不用于数据加密,而是通过私钥生成签名,公钥验证签名。在一些需要进行身份认证和数据完整性校验的场景中,DSA 发挥着重要作用。
- ECC(椭圆曲线密码学):ECC 是一种基于椭圆曲线数学的加密算法,与 RSA 相比,在相同的安全强度下,ECC 使用的密钥长度更短,加密和解密速度更快,占用的资源也更少。随着移动设备和物联网的发展,ECC 在资源受限的环境中具有很大的优势,逐渐得到广泛应用。
三、哈希算法
哈希算法是将任意长度的数据映射为固定长度的哈希值,它是一种单向函数,即无法通过哈希值还原原始数据。哈希算法常用于数据完整性校验、密码存储等场景。Java 中常见的哈希算法有:
- MD5:MD5 曾经是广泛使用的哈希算法,它生成 128 位的哈希值。然而,随着研究的深入,MD5 已被发现存在碰撞(不同数据生成相同哈希值)的问题,其安全性受到质疑,目前不建议在对安全性要求高的场景中使用,例如不应用于密码存储等关键场景。
- SHA - 1:SHA - 1 生成 160 位的哈希值,也曾被广泛应用。但同样面临碰撞问题,其安全性也逐渐不能满足现代需求,逐渐被更安全的算法取代。
- SHA - 256 及以上:SHA - 256 生成 256 位的哈希值,相比 MD5 和 SHA - 1,具有更高的安全性,是目前较为常用的哈希算法。此外,还有 SHA - 384、SHA - 512 等,它们生成的哈希值更长,安全性更高,适用于对数据完整性和安全性要求极高的场景,如金融交易、数字证书等。在 Java 中使用 SHA - 256 进行哈希计算的示例如下:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA256Example {
public static void main(String[] args) {
try {
String input = "Hello, SHA - 256!";
MessageDigest digest = MessageDigest.getInstance("SHA - 256");
byte[] hash = digest.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
System.out.println("原文: " + input);
System.out.println("SHA - 256哈希值: " + hexString.toString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
四、算法选择建议
- 数据加密场景:如果对加密速度要求较高,且能妥善管理密钥,可优先选择 AES 对称加密算法;若涉及密钥分发困难,或者需要进行数字签名、身份认证等场景,则应使用非对称加密算法,如 RSA 或 ECC。在实际应用中,也常结合对称加密和非对称加密的优点,使用非对称加密传输对称加密的密钥,然后用对称加密对大量数据进行加密和解密。
- 密码存储场景:避免使用 MD5 和 SHA - 1 等已不安全的哈希算法,建议使用 SHA - 256 及以上的哈希算法,并结合盐值(Salt)技术,增加密码破解的难度。盐值是一个随机字符串,与密码一起进行哈希计算,即使两个用户使用相同的密码,经过不同盐值处理后的哈希值也不同,有效防止彩虹表攻击。
- 数据完整性校验场景:根据对安全性的要求,选择合适的哈希算法。一般情况下,SHA - 256 能够满足大多数场景的需求;对于安全性要求极高的场景,可考虑使用 SHA - 384 或 SHA - 512。
五、实际应用中选择合适加密算法的方法
(一)数据加密场景
1、对加密速度要求高且密钥管理便捷
若应用场景中对数据加密和解密速度要求极高,同时能够通过安全可靠的渠道传输和存储密钥,对称加密算法是理想选择,其中 AES 算法凭借高安全性和良好性能脱颖而出。例如在大数据实时处理系统中,大量数据需要快速加密存储与传输,AES 128 位或 256 位密钥能够在保障安全的同时,高效完成加密任务,满足系统对性能的要求。
2、密钥分发困难或涉及数字签名
当面临密钥分发难题,或者需要实现数字签名、身份认证等功能时,非对称加密算法更为适用。RSA 算法应用广泛,常用于 SSL/TLS 协议中实现密钥交换和数字证书验证;而 ECC 算法在相同安全强度下,密钥长度更短、运算速度更快,适合对资源占用敏感的移动设备和物联网应用。比如在移动支付场景中,ECC 算法可用于保护用户交易数据,在保障安全的同时减少设备计算资源和电量的消耗。
此外,在实际应用中,常采用混合加密方式,先用非对称加密算法安全传输对称加密算法的密钥,再使用对称加密算法对大量数据进行加密和解密,充分发挥两种算法的优势。例如在邮件加密系统中,发送方使用接收方的公钥加密 AES 密钥,然后用该 AES 密钥加密邮件正文,接收方先用私钥解密获取 AES 密钥,再用其解密邮件内容,既解决了密钥分发问题,又保证了加密效率。
(二)密码存储场景
由于 MD5 和 SHA-1 已被证明存在安全隐患,容易出现碰撞问题,在密码存储时应避免使用这两种算法。建议采用 SHA-256 及以上的哈希算法,并结合盐值技术。盐值是随机生成的字符串,与用户密码拼接后再进行哈希计算,这样即使多个用户使用相同密码,其哈希值也各不相同,有效抵御彩虹表攻击。
以用户注册系统为例,用户输入密码后,系统为每个用户生成唯一的盐值,并将盐值和哈希后的密码存储在数据库中。当用户登录时,系统从数据库取出对应盐值,与用户输入密码拼接后进行哈希计算,将计算结果与存储的哈希值比对,从而验证密码的正确性。这种方式大大提高了密码存储的安全性。
(三)数据完整性校验场景
根据数据的重要程度和对安全性的要求,选择相应的哈希算法。对于一般应用,如普通文件的完整性检查、网页数据的一致性验证等,SHA-256 算法足以满足需求,其 256 位哈希值能够提供较高的碰撞阻力。
而在金融交易、数字证书、电子合同等对数据完整性和安全性要求极高的场景下,建议使用 SHA-384 或 SHA-512 算法。这些算法生成的哈希值更长,安全性更强,可有效防止数据被篡改,确保交易的真实性和可靠性。例如在区块链技术中,SHA-256 算法常用于计算区块哈希值,保证区块链数据的完整性和不可篡改性;在一些国家级的数字证书认证系统中,则可能采用 SHA-512 算法,以满足极高的安全标准。
(四)其他考量因素
1、法律法规与行业标准
不同行业和地区对数据加密有特定的法律法规和标准要求。例如,医疗行业的健康数据加密需遵循 HIPAA(美国健康保险流通与责任法案),金融行业的交易数据加密要符合 PCI DSS(支付卡行业数据安全标准)等。开发者应确保选择的加密算法符合相关规定,避免法律风险。
2、兼容性与可扩展性
选择加密算法时,需考虑其与现有系统、框架和第三方库的兼容性,确保能够顺利集成到应用中。同时,也要为未来系统的升级和扩展预留空间,选择具有良好扩展性的加密算法,便于后续根据安全需求变化进行调整和优化。
在实际应用中选择加密算法,不能一概而论,需结合具体业务场景、安全需求、性能要求、法律法规等多方面因素综合判断,权衡利弊后做出最合适的选择,从而为数据安全筑牢防线。
以上从多维度说明了加密算法的选择方法。如果你还想了解某特定场景下更具体的选择方案,或是算法应用中的注意事项,欢迎随时提出。
Java 中的加密算法丰富多样,每种算法都有其特点和适用场景。开发者在实际应用中,需要根据具体的业务需求、安全要求和性能考量,合理选择加密算法,以保障数据的安全。
如果你对 Java 加密算法的实际应用、代码优化,或是其他相关内容感兴趣,欢迎随时分享需求,我可以进一步拓展文章内容。
在实际开发与应用中,选择合适的加密算法是保障数据安全的关键环节,需综合多方面因素谨慎决策。以下从不同应用场景出发,详细阐述选择加密算法的要点。
相关文章:
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...