Java Academy · 课时

AES 对称加密

使用 Java 的 javax.crypto API,通过 AES/CBC/PKCS5Padding 加密和解密敏感数据

第 2 / 4 课13 个步骤

AES 对称加密 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

对称加密与非对称加密

对称加密使用同一个密钥进行加密和解密(速度快,适合大量数据)。非对称加密使用公钥和私钥组成的密钥对(速度较慢,用于密钥交换和签名)。AES 是标准的对称密码。

AES 模式:CBC 与 GCM

AES 有多种模式。AES/CBC/PKCS5Padding 很常见,但不提供认证。AES/GCM/NoPadding 同时提供加密和认证(AEAD),因此强烈推荐用于新代码。

生成 AES 密钥

请使用 KeyGenerator 安全地生成 256 位 AES 密钥。

KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256); // 256-bit key
SecretKey key = kg.generateKey();
// Persist the key:
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());
// Restore the key:
byte[] decoded = Base64.getDecoder().decode(b64Key);
SecretKey restored = new SecretKeySpec(decoded, "AES");

AES/GCM 加密

GCM 模式要求每次加密使用唯一的 12 字节初始化向量(IV)。每次加密操作都要生成新的随机 IV,绝不能在同一个密钥下重复使用 IV。

byte[] iv = new byte[12]; // 96-bit IV for GCM
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv); // 128-bit auth tag
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
// Transmit/store: IV + ciphertext (IV is not secret)

AES/GCM 解密

从存储的数据中提取 IV,重建参数规范,然后进行解密。GCM 会自动验证真实性,数据被篡改时会抛出 AEADBadTagException。

// Assume stored = iv + ciphertext:
byte[] iv         = Arrays.copyOfRange(stored, 0, 12);
byte[] ciphertext = Arrays.copyOfRange(stored, 12, stored.length);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext); // throws if tampered

将 IV 与密文一起存储

IV 不是秘密信息,可以将它添加到密文前面,或与密文一起存储。接收方需要 IV 才能解密。密钥必须保密。

byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv,         0, encryptedData, 0,          iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
String b64 = Base64.getEncoder().encodeToString(encryptedData);

从密码派生密钥(PBKDF2)

绝不要直接将密码用作 AES 密钥,因为密码的熵太低。请使用随机盐值和较高的迭代次数,通过 PBKDF2 派生密钥。

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310_000, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] keyBytes = skf.generateSecret(spec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

使用 Java 安全提供程序

JDK 的默认提供程序可以处理 AES。对于其他算法或 FIPS 合规性要求,请使用 Bouncy Castle 提供程序。

// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");

信封加密模式

使用随机生成的数据加密密钥(DEK)加密数据。再使用存储在 KMS 中的密钥加密密钥(KEK)加密 DEK(AWS KMS、HashiCorp Vault)。这样可以限制密钥暴露范围。

Spring 应用中的 AES

Spring Security 的 TextEncryptor 或 Spring Security Crypto 模块提供高级 AES 加密功能,无需手动管理密码器和 IV。

TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);

常见陷阱

切勿:在同一个密钥下重复使用 IV,使用 ECB 模式(会保留数据模式),直接将密码用作密钥,或忽略认证标签。新代码始终应使用 GCM。

快速检查

AES/GCM 提供了哪些 AES/CBC 不具备的功能?

回顾

请使用 AES/GCM/NoPadding 进行认证加密。每次加密生成新的随机 12 字节 IV。将 IV 添加到密文前面。使用 PBKDF2 从密码派生密钥。绝不要在同一个密钥下重复使用 IV。

免费开始

用 AI 导师学习 Java — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
104
课程
374

常见问题解答

「AES 对称加密」课时是免费的吗?

是的 — 「AES 对称加密」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「AES 对称加密」这节课中我会学到什么?

使用 Java 的 javax.crypto API,通过 AES/CBC/PKCS5Padding 加密和解密敏感数据 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「AES 对称加密」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 MessageDigest 进行加密散列
  2. AES 对称加密
  3. 用于消息完整性的 HMAC-SHA256
  4. JWT:结构、创建与验证
← 返回 Java Academy