Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对称加密方法_Java_Encryption_Aes - Fatal编程技术网

Java对称加密方法

Java对称加密方法,java,encryption,aes,Java,Encryption,Aes,我有一个用Java编写的RESTful API,我想保护该API的外部配置文件 我试图用以下对称加密方法保护它: private final static String passPhrase = "My Super Ultra Passphrase"; private final static byte[] salt = "My Super Ultra Salt".getBytes(); private final static int iterations = 8192; private st

我有一个用Java编写的RESTful API,我想保护该API的外部配置文件

我试图用以下对称加密方法保护它:

private final static String passPhrase = "My Super Ultra Passphrase";
private final static byte[] salt = "My Super Ultra Salt".getBytes();
private final static int iterations = 8192;
private static String strIv = "";

private static String encryptText(String text) {
    String result = "";
    try {
        // create the key for encryption
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        SecretKey secret = factory.generateSecret(
                new PBEKeySpec(passPhrase.toCharArray(), salt, iterations, 128));
        SecretKeySpec key = new SecretKeySpec(secret.getEncoded(), "AES");

        // encrypts the text
        Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aes.init(Cipher.ENCRYPT_MODE, key);
        byte[] cipherText = aes.doFinal(text.getBytes());
        byte[] iv = aes.getIV();

        result = new String(Base64.encode(cipherText));
        strIv = new String(Base64.encode(iv));

    } catch (NoSuchAlgorithmException 
            | InvalidKeySpecException 
            | NoSuchPaddingException 
            | InvalidKeyException 
            | IllegalBlockSizeException 
            | BadPaddingException e) {
        e.printStackTrace();
    }
    return result;
}

private static String decryptText(String text) {
    String result = "";
    try {
        // create the key for decryption
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        SecretKey secret = factory.generateSecret(
                new PBEKeySpec(passPhrase.toCharArray(), salt, iterations, 128));
        SecretKeySpec key = new SecretKeySpec(secret.getEncoded(), "AES");

        byte[] iv = Base64.decode(strIv);
        byte[] cipherText = Base64.decode(text);

        // decrypt the text
        Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aes.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
        result = new String(aes.doFinal(cipherText));

    } catch (NoSuchAlgorithmException 
            | InvalidKeySpecException 
            | NoSuchPaddingException 
            | InvalidKeyException 
            | IllegalBlockSizeException 
            | BadPaddingException 
            | InvalidAlgorithmParameterException
            | Base64DecodingException e) {
        e.printStackTrace();
    }
    return result;
}

我的问题是:这段代码是否相当强大?

您正试图针对哪种攻击场景进行自卫?我将回答一些假设,如果我错了,请更正

如果要保护配置文件,则您正试图防御已获得服务器文件读取权限的攻击者。在这种情况下,由于密钥是硬编码的,攻击者也可以下载程序本身并使用调试器提取密钥。这是一个额外的防御层,可以使一些攻击者放弃,但只会拖延其他人


希望能有所帮助。

您究竟在针对哪种攻击场景进行自卫?我将回答一些假设,如果我错了,请更正

如果要保护配置文件,则您正试图防御已获得服务器文件读取权限的攻击者。在这种情况下,由于密钥是硬编码的,攻击者也可以下载程序本身并使用调试器提取密钥。这是一个额外的防御层,可以使一些攻击者放弃,但只会拖延其他人


希望有帮助。

嗯,这很难回答。目前你的静脉注射和盐都不是随机的,所以这肯定是一个错误,很容易纠正。您确实添加了身份验证标记,因此您的配置可能不会被读取(保持机密),但可能会被更改。如果从一个系统切换到另一个系统,您可能会在
String.getBytes()
上得到不同的结果,因此这可能是一个与安全无关的问题

另一方面,在CBC模式下使用PBKDF2和AES可能是一个好主意。但是,如果您坚持使用这种传递短语,8Ki迭代可能是不够的


注意,我假设密码实际上不是一个静态字符串,如果是这样的话,请查看jspurim的答案

这很难回答。目前你的静脉注射和盐都不是随机的,所以这肯定是一个错误,很容易纠正。您确实添加了身份验证标记,因此您的配置可能不会被读取(保持机密),但可能会被更改。如果从一个系统切换到另一个系统,您可能会在
String.getBytes()
上得到不同的结果,因此这可能是一个与安全无关的问题

另一方面,在CBC模式下使用PBKDF2和AES可能是一个好主意。但是,如果您坚持使用这种传递短语,8Ki迭代可能是不够的


注意,我假设密码实际上不是一个静态字符串,如果是这样的话,请查看jspurim的答案

这个问题很难回答,因为这取决于你如何使用它以及谁可能是攻击者。AES是一种很好的密码,但只有当您可以限制对密钥的访问,或者在本例中限制对密码和salt的访问时,AES才是一种好密码。这个问题很难回答,因为它取决于您如何使用它以及谁可能是攻击者。AES是一种很好的密码,但只有当您可以限制对密钥的访问,或者在本例中限制对密码和salt的访问时,它才是好密码。感谢提示,它将帮助我改进算法。感谢提示,它将帮助我改进算法。正是如此。我们的想法是对java字节码进行模糊处理,以避免攻击者下载API、反转API然后进行调试。我不确定模糊处理的效果如何。同样,这是另一层防御,但只会延迟攻击者。您不应该相信这一点来保护您的数据,因为密钥存储在与您正在加密的文件相同的位置。应用程序的安全性更多地取决于您的服务器配置,而不是(在本例中)您对其进行编程的方式。事实正是如此。我们的想法是对java字节码进行模糊处理,以避免攻击者下载API、反转API然后进行调试。我不确定模糊处理的效果如何。同样,这是另一层防御,但只会延迟攻击者。您不应该相信这一点来保护您的数据,因为密钥存储在与您正在加密的文件相同的位置。应用程序的安全性更多地取决于服务器配置,而不是(在本例中)编程方式。