当前位置: 首页 > article >正文

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​

一、对称加密算法​

对称加密算法是指加密和解密使用相同密钥的算法。其特点是加密和解密速度快,效率高,但密钥管理较为复杂,需要安全地传输和存储密钥。在 Java 中常见的对称加密算法有:​

  1. 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();​

    }​

    }​

  1. DES(数据加密标准):DES 也是一种分组加密算法,它使用 56 位密钥。不过,随着计算机计算能力的提升,56 位密钥长度已逐渐难以满足现代安全需求,其安全性相对较弱,目前在一些对安全性要求不高的旧系统中可能仍有使用。​
  2. 3DES(三重数据加密算法):3DES 通过对数据进行三次 DES 加密,增加了密钥长度,提高了安全性。它使用两个或三个 56 位的密钥,本质上是对 DES 算法的改进,但相比 AES,其加密效率较低。​

二、非对称加密算法​

非对称加密算法使用一对密钥,即公钥和私钥,公钥用于加密,私钥用于解密。与对称加密不同,非对称加密无需安全传输密钥,解决了密钥分发的难题,但加密和解密速度相对较慢。Java 中常见的非对称加密算法有:​

  1. 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();​

    }​

    }​

  1. DSA(数字签名算法):DSA 主要用于数字签名,确保数据的完整性和真实性,以及验证数据的来源。它不用于数据加密,而是通过私钥生成签名,公钥验证签名。在一些需要进行身份认证和数据完整性校验的场景中,DSA 发挥着重要作用。​
  2. ECC(椭圆曲线密码学):ECC 是一种基于椭圆曲线数学的加密算法,与 RSA 相比,在相同的安全强度下,ECC 使用的密钥长度更短,加密和解密速度更快,占用的资源也更少。随着移动设备和物联网的发展,ECC 在资源受限的环境中具有很大的优势,逐渐得到广泛应用。​

三、哈希算法​

哈希算法是将任意长度的数据映射为固定长度的哈希值,它是一种单向函数,即无法通过哈希值还原原始数据。哈希算法常用于数据完整性校验、密码存储等场景。Java 中常见的哈希算法有:​

  1. MD5:MD5 曾经是广泛使用的哈希算法,它生成 128 位的哈希值。然而,随着研究的深入,MD5 已被发现存在碰撞(不同数据生成相同哈希值)的问题,其安全性受到质疑,目前不建议在对安全性要求高的场景中使用,例如不应用于密码存储等关键场景。​
  2. SHA - 1:SHA - 1 生成 160 位的哈希值,也曾被广泛应用。但同样面临碰撞问题,其安全性也逐渐不能满足现代需求,逐渐被更安全的算法取代。​
  3. 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();​

}​

}​

}​

四、算法选择建议​

  1. 数据加密场景:如果对加密速度要求较高,且能妥善管理密钥,可优先选择 AES 对称加密算法;若涉及密钥分发困难,或者需要进行数字签名、身份认证等场景,则应使用非对称加密算法,如 RSA 或 ECC。在实际应用中,也常结合对称加密和非对称加密的优点,使用非对称加密传输对称加密的密钥,然后用对称加密对大量数据进行加密和解密。​
  2. 密码存储场景:避免使用 MD5 和 SHA - 1 等已不安全的哈希算法,建议使用 SHA - 256 及以上的哈希算法,并结合盐值(Salt)技术,增加密码破解的难度。盐值是一个随机字符串,与密码一起进行哈希计算,即使两个用户使用相同的密码,经过不同盐值处理后的哈希值也不同,有效防止彩虹表攻击。​
  3. 数据完整性校验场景:根据对安全性的要求,选择合适的哈希算法。一般情况下,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微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

现代密码学 | 椭圆曲线密码学—附py代码

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

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 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开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【配置 YOLOX 用于按目录分类的图片数据集】

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

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

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

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&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样…...