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

时间:2011-03-15 10:12:09

标签: java encryption aes

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

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

1 个答案:

答案 0 :(得分:3)

直接使用密码字节会相对较弱。至少你会希望通过强哈希运行它们。并抛出一些盐,一些字节数组,您可以为场景重现(对于您的应用程序是静态的,或者更像是固定用户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或更多。