我正在尝试学习Java密码加密,并且对下面的代码有几个问题:
public class Main2 {
public static void main(String[] args) {
Cipher cipher;
KeyGenerator keyGenerator;
SecureRandom secureRandom;
int keyBitSize = 128;
SecretKey secretKey;
byte[] plainText, plainText2;
byte[] cipherText, cipherText2;
try
{
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
keyGenerator = KeyGenerator.getInstance("AES");
secureRandom = new SecureRandom();
keyGenerator.init(keyBitSize, secureRandom);
secretKey = keyGenerator.generateKey();
try
{
//pass secretKey to cipher.init()
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
try
{
plainText = "helloWorld".getBytes("UTF-8");
plainText2 = "helloWorld".getBytes("UTF-8");
cipherText = cipher.doFinal(plainText);
cipherText2 = cipher.doFinal(plainText2);
System.out.println(cipherText + "n" + cipherText2);
}
catch (IllegalBlockSizeException e)
{
e.printStackTrace();
}
catch (BadPaddingException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
catch (InvalidKeyException e)
{
e.printStackTrace();
}
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (NoSuchPaddingException e)
{
e.printStackTrace();
}
}
}
为什么当
keyBitSize
设置为 256 时会出现无效密钥异常(无效密钥大小(? 密码限制为 128 位吗?此加密方法是否始终生成一致的加密字符串长度 11(设置为
keyBitSize = 128
时(?此方法是否会截断任何更大长度的纯文本输入字符串?
在将加密值存储在MySQL数据库中之前,使用此方法加密用户输入是否是一种可靠的安全形式?
为什么当 keyBitSize 设置为 256 时会出现无效密钥异常(无效密钥大小(?密码限制为 128 位吗?
假设您使用的是OracleJDK,则需要无限强度的JCE库(如注释所示(。是的,进入 jre/lib/security 文件夹
此加密方法是否始终生成一致的加密字符串长度 11(设置为 keyBitSize = 128 时(?
此方法是否会截断任何更大长度的纯文本输入字符串?
您打印的是字节数组引用,而不是任何加密值。加密的结果是一个字节数组,您应该将数组编码为可打印的字符(好的做法是 base64 或十六进制(
你可以看看我的博客,看看一些例子。
在将加密值存储在MySQL数据库中之前,使用此方法加密用户输入是否是一种可靠的安全形式?
一点也不。它与加密无关,而是您使用它的方式。
当涉及到用户身份验证凭据时,永远不要存储用户密码,即使是加密的。那么原则上用户密码是可逆的。有很多关于它的文章,例如 https://www.google.be/amp/s/nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/amp/
目前存储身份验证凭据的最佳实践是使用加盐慢速哈希 (pbkdf2,...