对称加密和非对称加密的核心区别在于密钥使用方式:对称加密使用同一把密钥进行加密和解密,而非对称加密使用一对密钥,公钥加密需私钥解密,私钥签名需公钥验证;2. 对于入门者,对称加密更适合,因其概念直观、实现简单,如aes算法通过生成密钥、初始化加密器、执行加解密即可完成,而非对称加密涉及公私钥管理、数字签名等复杂概念,学习曲线较陡;3. java中实现加密需注意安全实践:密钥不得硬编码或明文存储,应使用keystore、环境变量等安全方式管理;避免使用ecb等不安全模式,推荐cbc或gcm模式以增强安全性;确保密钥传输通过ssl/tls等加密通道进行,防止泄露。

在Java里实现简单的加密解密功能,其实并不像想象中那么神秘,核心就是利用Java自带的
javax.crypto
要说具体怎么操作,我们拿AES来举个例子吧。它算是目前比较主流、安全性也相对可靠的对称加密算法了。整个过程,从生成密钥到加密再到解密,其实就是几步:
下面这段代码,应该能让你对这个流程有个直观的感受:
立即学习“Java免费学习笔记(深入)”;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class SimpleAES {
// AES算法名,通常会带上模式和填充方式,例如 "AES/ECB/PKCS5Padding"
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; // ECB模式简单,但实际应用中推荐CBC等
/**
* 生成AES密钥
* @return SecretKey对象
* @throws Exception
*/
public static SecretKey generateAESKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
keyGen.init(128); // AES支持128, 192, 256位密钥
return keyGen.generateKey();
}
/**
* 加密数据
* @param data 待加密的原始数据
* @param key 用于加密的密钥
* @return 加密后的Base64编码字符串
* @throws Exception
*/
public static String encrypt(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
/**
* 解密数据
* @param encryptedData 加密后的Base64编码字符串
* @param key 用于解密的密钥
* @return 解密后的原始数据
* @throws Exception
*/
public static String decrypt(String encryptedData, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
try {
SecretKey aesKey = generateAESKey();
// 实际应用中,你可能需要将密钥保存或传输,这里为了演示直接使用
// 将SecretKey转换为字节数组,方便存储或传输
byte[] keyBytes = aesKey.getEncoded();
// 从字节数组恢复SecretKey
SecretKey restoredKey = new SecretKeySpec(keyBytes, ALGORITHM);
String originalText = "这是一段需要加密的秘密信息。";
System.out.println("原始文本: " + originalText);
String encryptedText = encrypt(originalText, restoredKey);
System.out.println("加密后: " + encryptedText);
String decryptedText = decrypt(encryptedText, restoredKey);
System.out.println("解密后: " + decryptedText);
// 尝试用错误的密钥解密,会抛出BadPaddingException
// SecretKey wrongKey = generateAESKey();
// String wrongDecrypted = decrypt(encryptedText, wrongKey);
// System.out.println("错误密钥解密: " + wrongDecrypted);
} catch (Exception e) {
e.printStackTrace();
}
}
}这段代码里,我们用
KeyGenerator
Cipher
SecretKey
byte[]
SecretKeySpec
main
keyBytes
aesKey
说起来,加密算法大致能分成两大类:对称加密和非对称加密。对于刚接触加密的同学来说,理解这两者的区别,对选择合适的加密方式非常重要。
对称加密,顾名思义,就是加密和解密都用同一把密钥。就像你家大门的钥匙,开门和锁门都是它。它的优点是速度快,效率高,特别适合处理大量数据。AES、DES就是典型的对称加密算法。缺点嘛,就是密钥的管理比较麻烦,你需要想办法把这把“共享钥匙”安全地分发给所有需要加密和解密的人,一旦密钥泄露,所有加密的数据就都暴露了。
非对称加密就有点不一样了,它用的是一对密钥:一把是公开的(公钥),另一把是私有的(私钥)。公钥可以随便给别人,私钥你得自己藏好。用公钥加密的数据,只能用对应的私钥解密;反过来,用私钥加密的数据(这通常用于数字签名),只能用公钥解密。RSA就是最常见的非对称加密算法。它的优点是密钥分发方便,安全性高,因为你不需要共享私钥。但缺点也很明显,就是速度慢,效率低,不适合直接加密大量数据,通常用来加密对称密钥或者进行身份认证。
那么,哪种更适合入门呢?我个人觉得,对称加密是更好的选择。你看上面那个AES的例子,整个流程相对直观,概念也容易理解。你只需要关注一把密钥和数据的转换。非对称加密涉及到公钥、私钥、密钥对生成、签名、验证等概念,对于初学者来说,信息量会比较大,容易感到困惑。先从对称加密入手,打好基础,再逐步深入非对称加密,会是一个比较平滑的学习曲线。
光知道怎么写代码实现加密还不够,实际应用中,有些坑是必须得注意的。不然,你可能以为自己加密了,结果数据还是裸奔。
一个大头就是密钥管理。这是加密里最难、也最容易出问题的地方。你不能把密钥硬编码在代码里,也不能随便放在公开可访问的文件里。想象一下,如果你的加密密钥和加密算法都写在同一个地方,那不就是告诉黑客“钥匙藏在垫子下面”吗?密钥应该被安全地存储,比如使用Java的
KeyStore
再来就是算法和模式的选择。虽然前面例子用了AES/ECB/PKCS5Padding,但我要强调一下,ECB模式在实际应用中,如果加密的数据块有重复,密文也会有重复的模式,这可能会泄露一些信息。比如,你加密一张纯色图片,ECB模式下,加密后的图片仍然能看出轮廓。所以,更推荐使用CBC、GCM等模式。CBC
以上就是java使用教程怎样实现简单的加密解密功能 java使用教程的加密操作基础技巧的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号