Je travaille sur un site web où les utilisateurs peuvent télécharger des fichiers. Je souhaite crypter ces fichiers, au cas où il y aurait une faille de sécurité lors de l'accès à ces fichiers.
Lorsque l'utilisateur souhaite télécharger ses fichiers, je décrypte directement le flux de sortie HTTP(S).
Les fichiers sont placés sur un disque et un enregistrement pour chacun d'eux est inséré dans la base de données du site web avec quelques données supplémentaires (nom du fichier, taille, chemin d'accès, IV, etc.).
Je n'ai qu'une compréhension de base de l'utilisation du cryptage et j'ai donc quelques questions à poser.
J'utilise Rfc2898DeriveBytes
pour générer les octets de la clé de cryptage. Est-il possible d'utiliser cette classe ? Pour autant que je sache, elle utilise SHA1, qui pourrait ne plus être sûr ?
Pour l'instant, j'utilise le même mot de passe et le même sel pour chaque cryptage, mais un IV aléatoire à chaque fois. Devrais-je également randomiser le sel et le conserver dans la base de données avec l'IV ? Cela apportera-t-il une sécurité supplémentaire ?
Dois-je utiliser un code d'authentification des messages (MAC) ? Les fichiers cryptés eux-mêmes sont uniquement stockés et ne sont jamais transférés, je ne sais donc pas si c'est nécessaire.
Je ne sais pas vraiment comment stocker au mieux le mot de passe de cryptage. Je ne veux pas l'inclure dans la DLL de mon site web, donc je le mettrai probablement dans un fichier sur le serveur, quelque part en dehors du dossier de mon site web. Comment pourrais-je faire autrement ?
Il s'agit de mon code de cryptage. Y a-t-il des failles de sécurité évidentes ?
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();
}
}
}