首页 > 解决方案 > Java 密码在加密数据方面的可靠性如何?

问题描述

我正在尝试学习 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 (invalid key size)?密码是否限制为 128 位?

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

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

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

标签: javasecurityencryptioncryptographyblock-cipher

解决方案


为什么 keyBitSize 设置为 256 时会出现 Invalid Key Exception (invalid key size)?密码是否限制为 128 位?

假设您使用的是 OracleJDK,您需要 Unlimited Strength 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-安全密码/amp/

当今存储身份验证凭据的最佳做法是使用加盐慢速哈希 (pbkdf2,...)


推荐阅读