JAVA 中的 AES 加密漏洞



我正在尝试了解这个简单的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"( 对键/明文进行编码,但这究竟如何构成威胁?

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

-> 列出的异常会导致任何漏洞吗? 我还错过了什么?

我是这些东西的新手,将不胜感激任何帮助。

首先 - 您可以尝试查看我的博客 Java 中的加密,这是非常基本的,但至少你会得到一些如何正确进行加密的提示

1( 字符串键 = "/AbCd17%%/gvg8(";
2( byte[] keyBytes = key.getBytes((;

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

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

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

4( Cipher cipher = Cipher.getInstance("AES"(; -> 在第 4 行中,我们使用不安全的 ECB 模式(默认模式(,因此我们应该使用其他模式,如 OCB、CTR 等。

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

除ECB模式外,还使用IV(初始化向量(。IV 在未指定时随机生成(您可以从密码对象读取它(。恕我直言,最佳做法是创建一个随机 IV,将其与加密和解密显式一起使用。它使代码更具可读性。

IV将沿着密文提供。

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

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

我还错过了什么?

您可能仍然缺少的是经常被忽略的mac(消息身份验证代码(,但我发现它非常重要,这里有一些选项。

最新更新