java - Java 中使用任意长度密码的 AES 加密

标签 java encryption cryptography aes

我正在尝试使用任意长度的密码通过 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/

相关文章:

java - 任意 JRE 上的 "java.lang.InternalError: HTHEME is null"(Windows)

java - Boolean.TRUE == myBoolean 与 Boolean.TRUE.equals(myBoolean)

php - md5盐密码php

java - 正在寻找强 key 加密/解密算法,该算法在损坏或修改数据时会失败 "loudly"吗?

cryptography - iText 加密数字签名的 PDF

Java Cipher.getInstance ("RSA/ECB/NoPadding"); C# 中的等价物?我无法加密 .net 框架应用程序中的消息

python - HMAC签名和直接散列有什么区别?

java - 什么时候运行我自己的 Maven 存储库?

java - 带有时间戳的 StacktraceElement

ios - FaSTLane:无法使用 "match"命令生成的 p12 文件