我正在网站上工作,用户可以上传文件。我想加密这些文件,以防有某种安全漏洞被授予访问权限。
当用户想要下载他们的文件时,我直接解密到HTTP(S)输出流。
文件放在光盘上,每个文件的记录都插入到网站数据库中,附带一些额外的数据(文件名,大小,文件路径,IV等)。
我对如何使用加密只有基本的了解,因此有一些问题。
我使用Rfc2898DeriveBytes
生成加密密钥的字节。可以使用这个课程吗?据我所知它使用的SHA1可能不再安全吗?
现在我为每次加密使用相同的密码和盐,但每次都是随机的。我是否也应该随机化盐并将其与IV一起保存在数据库中?这会增加安全性吗?
我应该使用消息验证码(MAC)吗?加密文件本身只存储并且从不传输,因此我不知道是否有必要。
我真的不知道如何最好地存储加密密码。我不想将它包含在我的网站DLL中,因此我可能会将其放在服务器上的某个文件夹中,而不是在我的网站文件夹中。我怎么可能这样做?
这是我的加密代码。有明显的安全漏洞吗?
const int bufferSize = 1024 * 128;
Guid guid = Guid.NewGuid();
string encryptedFilePath = Path.Combine(FILE_PATH, guid.ToString());
byte[] rgbIV;
using (Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes("PASSWORD HERE", Encoding.ASCII.GetBytes("SALT HERE")))
{
byte[] rgbKey = deriveBytes.GetBytes(256 / 8);
using (FileStream decryptedFileStream = File.OpenRead(decryptedFilePath))
using (FileStream encryptedFileStream = File.OpenWrite(encryptedFilePath))
using (RijndaelManaged algorithm = new RijndaelManaged() { KeySize = 256, BlockSize = 128, Mode = CipherMode.CBC, Padding = PaddingMode.ISO10126 })
{
algorithm.GenerateIV();
rgbIV = algorithm.IV;
using (ICryptoTransform encryptor = algorithm.CreateEncryptor(rgbKey, rgbIV))
using (CryptoStream cryptoStream = new CryptoStream(encryptedFileStream, encryptor, CryptoStreamMode.Write))
{
int read;
byte[] buffer = new byte[bufferSize];
while ((read = decryptedFileStream.Read(buffer, 0, bufferSize)) > 0)
cryptoStream.Write(buffer, 0, read);
cryptoStream.FlushFinalBlock();
}
}
}
答案 0 :(得分:2)
我使用Rfc2898DeriveBytes生成加密密钥的字节。可以使用这个课程吗?据我所知它使用的SHA1可能不再安全吗?
最近SHA-1的有效破坏确实只影响了PBKDF2(Rfc2898DeriveBytes
后面的算法)不需要的碰撞阻力。请参阅:Is PBKDF2-HMAC-SHA1 really broken?
现在我为每次加密使用相同的密码和盐,但每次都是随机的。我是否也应该随机化盐并将其与IV一起保存在数据库中?这会增加安全性吗?
也许它会提供额外的安全性,但除非你添加一个bug,否则它确实会受到伤害。资料来源:Need for salt with IV
我应该使用消息验证码(MAC)吗?加密文件本身只存储并且从不传输,因此我不知道是否有必要。
通常,存储系统具有防止和修复数据损坏的检查和过程。如果你没有这个,那么MAC是检查数据是否被破坏的好方法,即使这并不是恶意发生的。
如果最终用户应该接收数据,他们可以自己检查MAC并确保没有人改变密文。
我真的不知道如何最好地存储加密密码。我不想将它包含在我的网站DLL中,因此我可能会将其放在服务器上的某个文件夹中,而不是在我的网站文件夹中。我怎么可能这样做?
据我了解,您实际上想要保留加密/解密密钥。您可以做的任何事情都是真正的混淆,并没有提供任何实际的安全性。攻击者可能只使用与常用代码相同的数据存储连接。充其量,攻击者会稍微放慢速度。最糟糕的是,他们甚至没有注意到数据是加密的,因为解密是透明的。
最好确保攻击者无法进入。通过OWASP前10名并尝试遵循建议。然后你可以用Nikto进行一些安全扫描或聘请专业的渗透测试员。
这是我的加密代码。有明显的安全漏洞吗?
使用PaddingMode.ISO10126
似乎不是一个好主意。你应该使用PKCS#7填充。资料来源:Why was ISO10126 Padding Withdrawn?
答案 1 :(得分:2)
import os
# specify the command prompt command you need to be run
command = 'netsh advfirewall firewall add rule name="BlockAIM" protocol=TCP dir=out remoteport=23 action=block'
# assign variable to the command
output = os.popen2(command)
# To get output call output.read()
基本上是推荐NIST的PBKDF2。
如果您将盐随机化(一个良好的安全措施),它将为解密提供顶级服务。一种常见的方法是使用salt和IV为加密数据添加前缀。
是的,您应该使用Mac而非加密数据以及上述任何前置信息。
为了提供有关保护加密密钥的建议,请参阅有关如何使用加密的更多信息。
使用PKCS#7填充,由于历史原因,有时该选项名为PKCS#5。