У меня есть приложение, в котором я извлекаю ключ шифрования c, имеющийся на диске, и использую его для шифрования данных. Ключ шифрования извлекается с диска при запуске программы и сохраняется в виде массива байтов в переменной частного класса. Сразу после извлечения ключа с диска при запуске программы ProtectedMemory.Protect()
используется для защиты ключа. Ключ не защищен ProtectedMemory.Unprotect()
каждый раз, когда его нужно использовать, и снова защищается после использования.
Части, которые заставили меня задуматься об эффективности этой схемы, происходят в тех случаях, когда ключ извлекается с диска, и каждый раз, когда необходимо использовать ключ, поскольку уязвимость, которую можно легко использовать, создается в течение 2 ключевых моментов цикла выполнения программы: когда программа только что завершила загрузку ключа с диска и не вызвала метод Protect()
и когда ключ не защищен для использования во время шифрования.
class ApplicationClass {
private byte[] encKey;
public ApplicationClass() {
// Fetches the encryption key first
encKey = StorageInt.FetchKey(); // Fetches and returns the encrypted key from the disk
// A gaping vulnerability here as the key is just loaded in memory and is not protected
ProtectedMemory.Protect(encKey, MemoryProtectionScope.SameProcess);
// Other initialization instructions follows
}
private byte[] ApplySymmEnc(byte[] plaintext) {
Aes aes = Aes.Create();
byte[] iv = new byte[128];
RNGCryptoServiceProvider randomBytesGenerator = new RNGCryptoServiceProvider();
randomBytesGenerator.GetNonZeroBytes(iv);
randomBytesGenerator.Dispose();
ProtectedMemory.Unprotect(encKey, MemoryProtectionScope.SameProcess);
// Another gaping vulnerability here!
ICryptoTransform encryptor = aes.CreateEncryptor(encKey, iv);
ProtectedMemory.Protect(encKey, MemoryProtectionScope.SameProcess); // Protect the key right after it is used for encryption
// Instructions for encryption follows
}
}
Заранее спасибо.
РЕДАКТИРОВАТЬ: Что касается причины, по которой не заботится о безопасности ключа при нахождении на диске, ключ существует на диске в достаточно защищенной обфусцированной форме, которая расшифровывается функцией StorageInt.FetchKey()
при извлечении.