网站首页 > java教程 正文
首先,我得回忆一下常见的加密算法有哪些。对称加密的话,AES和DES是比较常用的,不过DES现在不太安全了,可能应该重点提AES。非对称加密的话,RSA应该是必须的,还有ECC可能也值得提一下。然后哈希算法,比如MD5、SHA-1、SHA-256这些,不过MD5和SHA-1已经被认为不够安全了,但可能还是有很多地方在用,所以需要说明情况。
接下来,每个算法需要说明用途、流程,然后给出Java代码示例。比如对于AES,需要生成密钥,加密和解密的步骤。Java中可以用Cipher类,密钥生成用KeyGenerator。要注意加密模式,比如CBC或者GCM,以及是否需要填充,比如PKCS5Padding。可能还要提到初始向量IV的使用,特别是在CBC模式下,需要将IV和密文一起传输。
对于RSA,密钥对的生成是关键,使用KeyPairGenerator。加密用公钥,解密用私钥。同样使用Cipher类。需要注意RSA加密的数据长度限制,比如不能超过密钥长度减去一些填充字节,所以通常用来加密对称密钥,而不是大量数据。
哈希算法的话,比如SHA-256,使用MessageDigest类。流程是输入数据,生成摘要。MD5虽然不安全,但可能还是需要示例,但要提醒用户不要用于安全敏感的地方。
然后,用户可能需要的是代码示例的正确性和实用性。比如在AES示例中,是否需要处理IV,存储和传输IV。可能代码中需要将IV和密文拼接在一起,解密时分开读取。这样更符合实际应用场景。
还要考虑异常处理,比如在Java代码中可能需要处理NoSuchAlgorithmException、InvalidKeyException等异常,但示例代码可能为了简洁省略了try-catch块,但最好注明需要处理异常。
另外,用户可能想了解加密算法的分类,比如对称和非对称的区别,哈希算法的不可逆性。所以在解释的时候需要分门别类,结构清晰。
可能需要注意Java版本的不同,比如有些旧版本的Java可能不支持某些算法或密钥长度,但假设用户使用的是较新的Java版本,比如Java 8及以上。
最后,代码示例要确保能够运行,比如正确的类导入,正确的步骤。比如AES的密钥生成,加密和解密过程,Base64编码的使用,因为加密后的字节数组通常需要转换为Base64字符串以便传输或存储。
总结一下,我应该分三个部分:对称加密(AES)、非对称加密(RSA)、哈希算法(SHA-256),每个部分介绍用途、流程,然后给出Java代码示例,并解释代码的关键点。同时提醒一些安全注意事项,比如密钥管理、IV的使用、算法安全性等。
以下是常见的信息加密算法分类及Java实战代码示例:
一、对称加密算法(AES为例)
用途:加密大数据内容(如文件、消息)
特点:加密解密使用相同密钥,速度快
流程:
- 生成AES密钥
- 设置加密模式(如CBC)和填充方式(如PKCS5Padding)
- 加密时生成随机IV(初始向量)
- 将IV与密文拼接存储
- 解密时分离IV和密文进行解密
Java代码:
java
import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.Base64;
import java.security.SecureRandom;
public class AESExample {
public static void main(String[] args) throws Exception {
String plainText = "京东技术2023";
// 1. 生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey secretKey = keyGen.generateKey();
// 2. 加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecureRandom random = new SecureRandom();
byte[] iv = new byte[16];
random.nextBytes(iv); // 生成随机IV
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
byte[] cipherText = cipher.doFinal(plainText.getBytes());
// 拼接IV和密文(IV通常不保密)
byte[] combined = new byte[iv.length + cipherText.length];
System.arraycopy(iv, 0, combined, 0, iv.length);
System.arraycopy(cipherText, 0, combined, iv.length, cipherText.length);
System.out.println("密文:" + Base64.getEncoder().encodeToString(combined));
// 3. 解密
byte[] decoded = Base64.getDecoder().decode(combined);
byte[] iv2 = new byte[16];
System.arraycopy(decoded, 0, iv2, 0, iv2.length);
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv2));
byte[] plainBytes = cipher.doFinal(decoded, iv2.length, decoded.length - iv2.length);
System.out.println("原文:" + new String(plainBytes));
}
}
二、非对称加密算法(RSA为例)
用途:密钥交换/数字签名
特点:公钥加密,私钥解密,安全性高但速度慢
流程:
- 生成RSA密钥对
- 公钥加密数据
- 私钥解密数据
Java代码:
java
import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;
public class RSAExample {
public static void main(String[] args) throws Exception {
String data = "敏感数据123";
// 1. 生成密钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
// 2. 公钥加密
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] cipherText = cipher.doFinal(data.getBytes());
System.out.println("RSA密文:" + Base64.getEncoder().encodeToString(cipherText));
// 3. 私钥解密
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] decrypted = cipher.doFinal(cipherText);
System.out.println("解密结果:" + new String(decrypted));
}
}
三、哈希算法(SHA-256为例)
用途:数据完整性校验/密码存储
特点:不可逆,固定长度输出
流程:
- 输入任意长度数据
- 生成固定长度的哈希值
Java代码:
java
import java.security.MessageDigest;
import java.util.Base64;
public class HashExample {
public static void main(String[] args) throws Exception {
String input = "用户密码123";
// 1. 创建MessageDigest实例
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 2. 计算哈希值
byte[] hashBytes = md.digest(input.getBytes());
// 3. 转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
hexString.append(String.format("%02x", b));
}
System.out.println("SHA-256哈希值:" + hexString);
// 安全提示:实际存储密码应使用PBKDF2或bcrypt
}
}
四、安全注意事项
- 密钥管理:对称密钥需安全存储(可使用KMS)
- 算法选择:
- 避免使用DES(已不安全)、MD5/SHA1(易碰撞)
- 推荐使用AES-256、RSA-2048+、SHA-256/512
- 加密模式:优先选GCM(提供认证功能)模式
- 密码存储:必须加盐并使用慢哈希(如PBKDF2)
完整代码需处理异常(NoSuchAlgorithmException等),实际生产环境建议使用Bouncy Castle等专业加密库。
- 上一篇: Java md5加密解密数据
- 下一篇: 如何在Spring Boot中实现数据库配置文件的加密?
猜你喜欢
- 2025-04-27 Java多线程编程中的锁优化技巧:锁的艺术之旅
- 2025-04-27 ECC加密算法Illegal key size错误源码详解
- 2025-04-27 基于Vue.js的http网站如何实现帐号密码加密传输?
- 2025-04-27 Java虚拟机类加载机制剖析:探秘Java世界的“魔法师”
- 2025-04-27 Springboot 配置文件、隐私数据脱敏最佳实践(原理+源码)
- 2025-04-27 Java 如何加载带密码的 PCKS8 PEM 私钥
- 2025-04-27 轻松掌握Java多线程 - 第六章:volatile关键字
- 2025-04-27 Java网络编程中的Socket通信优化之道
- 2025-04-27 Java 17中的新加密API:实现数据安全传输
- 2025-04-27 Java代码保护方法之四:JVMTI实现Java源码保护
你 发表评论:
欢迎- 最近发表
-
- 多种负载均衡算法及其Java代码实现
- 输入www.baidu.com背后经历了啥?说清楚这个,已经超过90%的人了
- 优化MySQL:为什么你应该用 UNSIGNED INT 存储IP地址
- 实模式下CPU如何获取数据及指令(实模式寻址方式)
- java基础都在这了,小主们拿去吧(java基础是指什么)
- 盘点爬虫语言为何选择Python而不是Java
- 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇
- 网络协议之TCP/IP协议(面试必考内容) - javaEE初阶 - 细节狂魔
- 深夜报警!10亿次请求暴击,如何用Redis找出最热IP?
- VPN技术(IPsec/L2TP/SSLVPN/PPTP)学习笔记
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)