我对加密/解密相当陌生,必须对一些数据文件进行加密,但我并不完全确定我是否会以正确的方式进行加密。现在,我有一个脚本来加密所有文件,这并不包括在我的repo中,但是解密器包含在repo中,加密密钥作为环境变量读取。我认为,即使在回购中包含解密器也是错误的做法,因为算法/模式/填充在代码中是可见的,如下所示。
除此之外,经过一些研究之后,看起来如果攻击者知道初始化向量,他们将能够解密加密文件中的第一个块。我明白了吗?另外,我还读到,每次都应该随机生成向量,但我不明白如何做到这一点,因为除非我改变了加密文件的方式,否则加密器只能运行一次。
在最后一个question...would中,使用另一个环境变量来存储所使用的初始化向量是有意义的?我认为没有,因为向量的随机化是人们所追求的。
private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
private static IvParameterSpec ivspec = new IvParameterSpec(iv);
private static byte[] decodedKey = Base64.getDecoder().decode(System.getenv("SECRET_KEY"));
private static SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
//any encrypted input file that is not a database will be read in as an input stream
public static CipherInputStream decryptInputStream(InputStream inputStream) {
try{
// Initialize the cipher by specifying the algorithm/mode/padding
Cipher aes2 = Cipher.getInstance("AES/CBC/PKCS5Padding");
//
aes2.init(Cipher.DECRYPT_MODE, originalKey, ivspec);
CipherInputStream in = new CipherInputStream(inputStream, aes2);
return in;
} catch(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException e){
logger.info(e.getMessage());
return null;
}
}发布于 2019-12-17 10:38:53
但我不能完全确定我是否会以正确的方式去做。
我有自己的几个使用密码的示例。
除了静态IV (已经注释过了)之外,您还缺少了某种形式的完整性控制(用于“认证加密”的seach)。它可以使用完整的内置模式(如AES-CGM)或使用HMAC来实现.
我认为,即使在回购中包含解密器也是错误的做法,因为算法/模式/填充在代码中是可见的,如下所示。
算法/模式/填充是否可见对解决方案安全性没有影响。你唯一需要保护的就是钥匙。
除此之外,经过一些研究之后,看起来如果攻击者知道初始化向量,他们将能够解密加密文件中的第一个块。
那是胡说。对于使用相同密钥(thx Maarten)执行的每个加密操作,IV需要是唯一的(对于CBC来说,IV需要是不可预测的/随机的)。已知的IV无法帮助攻击者解密任何东西。
如前所述,- IV通常作为密文的一部分传递。通常,加密结果类似于IV || ciphertext || MAC,其中||表示级联。IV和MAC的大小是固定的,所以在解密时,参数的分割很简单。
我明白了吗?此外,我还读到,每次都要随机生成向量。
肯定
所以,静脉注射只应该在文件之间随机分配,而不是在运行之间随机分配?
使用IV的要点是,如果使用相同的密钥加密多个输入,则安全性存在一些缺陷。使用唯一的或随机的IV实际上可以防止这类弱点。
https://stackoverflow.com/questions/59361444
复制相似问题