ZBLOG

使用web浏览器的方式进行数据加密,java后端实现解密,最简单的方式 不使用iv向量

如果您希望在Web浏览器中进行数据加密,并且想要实现一个最简单的方式,而不使用初始化向量(IV),可以使用AES对称加密中的ECB模式。然而,值得注意的是,ECB模式并不安全,因为它对于相同的明文块总是生成相同的密文块。

下面是如何在Web浏览器中使用JavaScript加密数据,以及在Java后端解密这些数据的示例。

1. 在浏览器中的 JavaScript 加密代码(使用 ECB 模式)

  1. async function encrypt(plainText, key) {
  2. const encoder = new TextEncoder();
  3. const data = encoder.encode(plainText);
  4. // 导入AES密钥
  5. const importedKey = await window.crypto.subtle.importKey(
  6. "raw",
  7. key,
  8. { name: "AES-ECB" },
  9. false,
  10. ["encrypt"]
  11. );
  12. // 使用 AES-ECB 模式进行加密
  13. const encryptedData = await window.crypto.subtle.encrypt(
  14. {
  15. name: "AES-ECB",
  16. },
  17. importedKey,
  18. data
  19. );
  20. return btoa(String.fromCharCode.apply(null, new Uint8Array(encryptedData)));
  21. }
  22. // 示例用法
  23. (async () => {
  24. // 随机生成16字节的AES秘钥
  25. const keyMaterial = crypto.getRandomValues(new Uint8Array(16));
  26. // 加密文本
  27. const encryptedText = await encrypt("Hello World", keyMaterial);
  28. console.log("Encrypted:", encryptedText);
  29. })();

2. Java 后端解密代码

  1. import javax.crypto.Cipher;
  2. import javax.crypto.spec.SecretKeySpec;
  3. import java.util.Base64;
  4. public class AESDecryption {
  5. public static String decrypt(String encryptedBase64, byte[] secretKey) throws Exception {
  6. // 解码 Base64 字符串为字节数组
  7. byte[] decodedBytes = Base64.getDecoder().decode(encryptedBase64);
  8. SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "AES");
  9. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  10. cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
  11. byte[] decryptedBytes = cipher.doFinal(decodedBytes);
  12. return new String(decryptedBytes); // 返回解密后的字符串
  13. }
  14. public static void main(String[] args) {
  15. try {
  16. String encryptedBase64 = "经过前端加密得到的Base64字符串";
  17. byte[] secretKey = ...; // 在此处填入相同的秘密key(16个字节)
  18. String decryptedText = decrypt(encryptedBase64, secretKey);
  19. System.out.println("Decrypted text: " + decryptedText);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

注意事项:

  1. 安全性:虽然此示例提供了基本功能,但使用ECB模式并不推荐用于生产环境。尽量选择更安全的加密模式,例如CBC,并确保始终使用随机初始化向量。

  2. 秘钥管理:请务必确保安全存储和传递秘钥,避免硬编码。

  3. 字符编码:确认前后端都使用相同字符编码(通常为UTF-8)。

  4. 错误处理:实际应用中需要添加适当的错误处理机制。

这种方法虽然简单,但是在真实项目中仍需考虑安全性问题。如果有进一步的问题或需要其他帮助,请随时询问!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20634

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?