我正在尝试学习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数据库中之前,是否可以使用这种方法对用户输入进行加密?
答案 0 :(得分:1)
为什么将keyBitSize设置为256时会得到无效的密钥异常(无效的密钥大小)?密码限制为128位吗?
假设您正在使用OracleJDK,则需要Unlimited Strength JCE库(如注释所示)。是的,进入jre / lib / security文件夹
此加密方法是否始终生成一致的加密字符串长度11(设置为keyBitSize = 128时)?
此方法会截断任何长度更大的纯文本输入字符串吗?
您正在打印字节数组引用,而不是任何加密值。加密的结果是一个字节数组,您应该将该数组编码为可打印的字符(良好的做法是base64或hex)
您可能会看到at my blog的一些示例。
在将加密值存储在MySQL数据库中之前,是否可以使用这种方法对用户输入进行加密?
一点也不。它与加密无关,这是您使用它的方式。
当涉及到用户身份验证凭据时,从不存储用户密码,甚至都不会进行加密。那么原则上用户密码是可逆的。有很多关于它的文章,例如。 G。 https://www.google.be/amp/s/nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/amp/
当今存储身份验证凭证的最佳做法是使用盐腌的慢散列(pbkdf2,...)