gpt4 book ai didi

java - JAVA中的AES加密漏洞

转载 作者:行者123 更新时间:2023-12-02 11:16:19 27 4
gpt4 key购买 nike

我试图了解这个简单的 AES 加密代码的工作原理以及它可能面临的漏洞。

public static void main(String ... args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
1) String key = "/AbCd17%%/gvg8(";
2) byte[] keyBytes = key.getBytes();
3) SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
4) Cipher cipher = Cipher.getInstance("AES");
5) cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
6) byte[] ciphertext = cipher.doFinal("Message".getBytes());
7) System.out.println(ciphertext);
}

到目前为止我认为问题在于以下几点:

-> 第 2 行和第 6 行使用 getBytes(),而不是首先使用 getBytes("UTF8") 对 key /明文进行编码,但这到底会造成什么威胁?

-> 在第 4 行中,我们使用的是不安全的 ECB 模式(默认模式),因此我们应该使用其他模式,如 OCB、CTR 等。

-> 列出的异常是否会导致任何漏洞?我还缺少什么?

我是这方面的新手,希望得到任何帮助。

最佳答案

首先 - 您可以尝试查看 at my blog关于Java中的加密,这是非常基础的,但至少你会得到一些如何正确加密的提示

1) String key = "/AbCd17%%/gvg8(";
2) byte[] keyBytes = key.getBytes();

简单的key.getBytes()可以工作,直到使用在默认系统编码下可打印的字符。

还有另一个(更大的)问题 - 您正在使用静态字符串键,它将键空间限制为可打印字符。您应该使用 byte[] 作为 key 并由 KeyGenerator 或至少 SecureRandom 生成。

key 也可以基于密码,因为您可以查看链接的博客如何从密码生成 key 。 (或搜索 PBKDF2 )

4) Cipher cipher = Cipher.getInstance("AES"); -> In line 4 we are using ECB mode(default mode) which is insecure, so instead we should use other modes like OCB,CTR etc.

恕我直言,最佳实践是显式指定操作模式和填充,例如 AES/CBC/PKCS5Padding。如果您不指定任何标准,我不确定标准是什么(某些密码默认使用 ECB 模式,我不确定 AES)。

除 ECB 模式外,其他模式均使用 IV(初始化 vector )。未指定时,IV 是随机生成的(您可以从密码对象中读取它)。恕我直言,最佳实践是创建一个随机 IV,并在加密和解密中明确使用它。它使代码更具可读性。

IV 将与密文一起提供。

6) byte[] ciphertext = cipher.doFinal("Message".getBytes()); 7) System.out.println(ciphertext);

您不能只打印字节数组,您需要以某种方式对数据进行编码(base64,十六进制,..)

and what more am I missing?

你可能还缺少一个经常被忽视的mac(消息验证码),但我发现它非常重要,here有一些选项。

关于java - JAVA中的AES加密漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50252516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com