我可以使用所有可能的字符串来创建新的 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/