java - 每个字符串都作为 SecretKeySpec 的参数?

标签 java encryption aes

我可以使用所有可能的字符串来创建新的 SecretKeySpec 吗?或者它会削弱整个加密吗?

byte[] raw = password.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

最佳答案

直接使用密码字节会相对较弱。至少您需要通过强哈希来运行它们。并添加一个盐,一些可以为场景重现的字节数组(对于您的应用程序来说是静态的,或者更好的是固定用户 ID 之类的东西)。

MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(password.getBytes());
digest.update(salt);
byte[] raw = digest.digest();

如果您确实想让暴力破解密码变得更加困难,您可以使散列变得更复杂。例如,这只会为合法用例增加几十毫秒,但会显着减慢暴力攻击的速度:

for (int i = 0; i < 34000; i++) {
    digest.reset();
    digest.update(raw);
    raw = digest.digest();
}

理想情况下,您还要确保密码的强度(长度、复杂性、大写/小写/数字字符的组合)。如果它是一个简单的单词或足够短,那么攻击仍然很容易。也不要相信这种散列的模糊性,它并不会让它变得更安全。重要的是使用强密码和强哈希。

要充分发挥 128 位 AES 的优势,密码长度需要约为 20 个字符,但 8 到 12 个字符可能足以满足大多数问题。如果您在我的银行工作,请使用 20 个或更多。

关于java - 每个字符串都作为 SecretKeySpec 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5310223/

相关文章:

java - 匹配器未找到匹配项

c# - 压缩/加密的最佳实践

linux - 我如何在 linux 的 cryptoAPI 中添加更多算法

java - 填充异常: Given final block not properly padded

java - 如何在java中的对象数组中应用二分搜索?

java - 非线程安全代码意外地给出可重复的结果

encryption - 加密与未加密 EBS 卷 AWS

java - JCEKS keystore 不再加载 : com. sun.crypto.provider.SealedObjectForKeyProtector

java - JNI 与 Runtime.exec()

c# - 在 WPF 应用程序中加密凭据