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

Java加密密码在加密数据方面的可靠性如何?,java,security,encryption,cryptography,block-cipher,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 secretKe

我正在尝试学习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数据库中存储加密值之前使用此方法加密用户输入是否是一种可靠的安全形式

    一点也不。它与加密无关,而是您使用它的方式

    当涉及到用户身份验证凭据时,从不存储用户密码,即使是加密的密码。那么原则上用户密码是可逆的。有很多关于它的文章,e。g


    目前存储身份验证凭据的最佳实践是使用salted slow hash(pbkdf2,…)

    您需要在jdk中分别安装JCE扩展以实现无限密钥强度。对于OracleJDK8。你可以找到其他供应商的类似下载。在我jdk的jre/lib/security文件夹中,对吗?是的………我刚刚意识到你提供的链接是针对Java SE的。我在运行JavaEE。。这两种方式都应该兼容?关于我的最后一个问题(#4),我应该澄清一下,我存储的是用户数据,如姓名、地址和信用卡。我想知道使用密码是否会提供一层安全性,以防未经授权的用户进入数据库并看到明文中的字段值。有了这个,他们只会看到随机字节数组存储为blob/varbinary,而不是纯文本。我也已经在使用BCrypt在我的数据库中存储web应用程序用户密码。@jae-bin是的,确实可以加密敏感信息。您可以查看链接的博客,因此对于加密本身,您应该使用适当的IV(初始化向量)、编码(因此您可以使用文本字段)和经过身份验证的加密NIT:OracleJDK或8u151以下的JRE需要策略JAR。8u15x只需要在jre/lib/security/java.security中进行编辑,而8u161 up(包括9,10,11)已经具有policy=unlimited。另外,用于打印阵列的规范或至少是古老的经典是