Java对称加密方法
我有一个用Java编写的RESTful API,我想保护该API的外部配置文件 我试图用以下对称加密方法保护它: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
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然后进行调试。我不确定模糊处理的效果如何。同样,这是另一层防御,但只会延迟攻击者。您不应该相信这一点来保护您的数据,因为密钥存储在与您正在加密的文件相同的位置。应用程序的安全性更多地取决于服务器配置,而不是(在本例中)编程方式。