我正在尝试使用任意长度的密码通过 AES 加密来加密 java 中的字符串。到目前为止,这是我的代码,但我不太理解它:
public static byte[] encrypt(String input, String salt) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
SecretKeySpec key = new SecretKeySpec(salt.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(input.getBytes());
}
如何使用任意长度的密码来加密和解密任意长度的字符串。还有盐是什么?我一直使用盐名称作为密码,它只允许我使用 16 个字符的密码。
最佳答案
如果您想加密/解密密码中的某些数据,您需要使用一种算法,该算法可以从此密码生成适合您要使用的密码的 key 。
Java提供了PBKDF2(基于密码的 key 派生函数)的实现。
char[] password = /* ... */
byte[] salt = /* ... */
SecretKeyFactory kf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(password, salt, 8192, 256);
SecretKey tmp = kf.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
请注意:
盐是一个非 secret 随机字节数组。它用于避免基于字典的攻击(有关更多详细信息,请参阅维基百科 Rainbow tables 文章)
迭代计数使暴力攻击变得更加复杂,因为迭代计数越大,攻击需要更多的资源。今天的迭代次数不应低于 5000。
关于java - Java 中使用任意长度密码的 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20739513/