Java加密密码在加密数据方面的可靠性如何?

时间:2018-10-15 03:44:34

标签: java security encryption cryptography block-cipher

我正在尝试学习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();
        }

    }

}
  1. keyBitSize设置为256时,为什么会收到无效的密钥异常(无效的密钥大小)?密码限制为128位吗?

  2. 此加密方法是否始终生成一致的加密字符串长度11(设置为keyBitSize = 128时)?

  3. 此方法会截断任何长度更大的纯文本输入字符串吗?

  4. 在将加密值存储在MySQL数据库中之前,是否可以使用这种方法对用户输入进行加密?

1 个答案:

答案 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,...)