Java 密码在加密数据方面有多可靠?

How reliable is Java crypto cipher in encrypting data?

我正在尝试学习 Java Cipher Crypto,只是对下面的代码有几个问题:

  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 时,为什么会出现 Invalid Key Exception(无效的密钥大小)?密码是否限制为 128 位?

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

  3. 此方法是否会截断任何长度更长的明文输入字符串?

  4. 在将加密值存储到 MySQL 数据库之前使用此方法加密用户输入是否是一种可靠的安全形式?

Why does it get an Invalid Key Exception (invalid key size) when the keyBitSize is set to 256? Is cipher limited to 128 bits?

假设您使用的是 OracleJDK,您需要 Unlimited Strength JCE 库(如评论所述)。是的,进入 jre/lib/security 文件夹

Does this encryption method always generate a consistent encrypted string length of 11 (when set to keyBitSize = 128)?
Does this method truncate any plaintext input string of greater length?

您打印的是字节数组引用,而不是任何加密值。加密的结果是一个字节数组,你应该将数组编码成可打印的字符(好的做法是 base64 或十六进制)

您可以查看 at my blog 一些示例。

Would encrypting user input using this method before storing the encrypted values in a MySQL database a reliable form of security?

完全没有。它与加密无关,这是您使用它的方式。

当涉及到用户身份验证凭据时,永远不会存储用户密码,即使是加密的。那么原则上用户密码是可逆的。有很多关于它的文章,e。 G。 https://www.google.be/amp/s/nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/amp/

目前存储身份验证凭据的最佳做法是使用加盐慢散列 (pbkdf2,...)