我最近一直在使用this script为不同的脚本做一些数据加密,我稍后会将这些脚本传递给其他用户,而我目前正在使用固定的IV和Salt。我目前使用固定Salt和IV的原因是我加密的数据只需要加密一次,但每次运行脚本时都需要解密。因此,解决所有问题意味着我的脚本的其他用户只需要知道密码。
从阅读中看,似乎已知Salt并不会对数据被恶意解密的容易程度造成太大影响,如果它是唯一的,但我认为通过使用固定的Salt我目前正在喋喋不休应用它的要点。
我传入此脚本的密码是在加密/解密时输入的,不存储在任何地方。 通过保持密码完全保密,这是否会加强加密?
此外,是否有人对可能更安全的实施有任何建议?
非常感谢所有人的帮助。
答案 0 :(得分:2)
Salts和IV用于同一目的,通过从随机起点开始防止重复使用工作。当您进行哈希处理时,将其称为Salt,当您进行加密时,将其称为IV。
有一个固定的Salt和VI与没有Salt或IV的情况相同,这两件事的重点是它们每次都不同所以如果我在File A
上破解密钥我无法重用File B
的工作,我必须从头开始。
通常,Salt和IV只是前置在文件的前面或者在文件头中。当您首先解密您在IV / Salt中读取的文件时,然后开始读取您的加密数据。
我要做的不是使用固定盐和固定的IV,我只是让程序生成Salt和IV。
$r = new-Object System.Security.Cryptography.RijndaelManaged
$r.GenerateIV();
#generate a new instance of our KDF with a random 32 bit salt.
$deriveBytes = new-Object Security.Cryptography.Rfc2898DeriveBytes($Passphrase, 32)
$r.Key =$deriveBytes.GetBytes(32) #generate a 32 bit key based off of $Passphrase
#store $r.IV.Length, $r.IV, $deriveBytes.Salt at the front of your file ($deriveBytes.Salt we know will be 32 bytes big because we set it)
进一步阅读:
- Is it safe to have the salt equal to IV?
- Secret vs. Non-secret Initialization Vector
- Why would you need a salt [...] when IV is already randomly generated and stored with the encrypted data?