Россия
Филиал Ростовского государственного университета путей сообщения в г. Воронеже
Россия
В статье рассматривается вопрос построения защищенного хранилища данных на языке программирования C#. Изложены основные методы защиты данных, включая криптографию, аутентификацию и авторизацию, а также физическую защиту сервера. Приведены рекомендации по проектированию защищенного хранилища, включая архитектурные решения и управление доступом. Рассмотрена реализация на C# с использованием криптографических библиотек, хэширования паролей и шифрования секретной информации. Представлены примеры тестовых сценариев и оценка безопасности.
Защищенное хранилище, C#, криптография, аутентификация, авторизация, физическая защита, проектирование, доступ, шифрование, тестирование, безопасность
Проблема сохранности данных возникает из-за угроз, которым они подвергаются в цифровом окружении. Их условно можно определить, как потенциальные угрозы, такие как кибератаки, хакерские атаки, вирусы, программное обеспечение-вредоносное ПО так и физические повреждения, которые могут привести к потере, утечке или повреждению данных. Защищенное хранилище данных позволяет предотвратить и решить проблемы сохранности данных и представляет собой специальное место или инфраструктуру, где данные могут быть сохранены и защищены от несанкционированного доступа и повреждений. Защищенные хранилища обеспечивают различные меры безопасности, такие как шифрование данных, контроль доступа, механизмы аутентификации и мониторинг, чтобы предотвратить несанкционированный доступ или использование данных.
Защищенное хранилище данных имеет следующие характеристики [2], [5]:
-
- конфиденциальность - обеспечивают конфиденциальность данных, предотвращая несанкционированный доступ или утечку информации;
- целостность - гарантируют целостность данных, предотвращая их повреждение или изменение несанкционированными лицами;
- доступность - обеспечивают доступ к данным только авторизованным пользователям, предотвращая потерю или недоступность информации;
- восстановление данных - в случае потери или повреждения данных защищенное хранилище позволяет восстановить информацию из резервных копий или архивов;
- соответствие законодательству - помогают организациям соблюдать требования законодательного регулирования и юридические нормы в отношении обработки и хранения данных.
Все указанные аспекты делают защищенное хранилище данных необходимым для обеспечения сохранности информации и предотвращения потенциальных угроз ее безопасности.
Для реализации программных методов защиты используются способы защиты [3], [4], [6].
-
- криптографические алгоритмы - используются для шифрования данных и защиты их от несанкционированного доступа, преобразуют данные в нечитаемую форму, которую могут расшифровать только те, у кого есть соответствующий ключ доступа;
- аутентификация и авторизация - это процессы проверки легитимности пользователей и предоставления им соответствующих прав доступа;
- физическая защита сервера - направлена на защиту аппаратного обеспечения и физического местоположения сервера. она ограничивает несанкционированный доступ к серверам и предотвращает потенциальные физические угрозы.
При разработке специального программного обеспечения с использованием языка программироания C# можно использовать следующие программные методы.
Пример 1. Защита данных с использованием криптографических библиотек.
Для этого у языка программирования C# есть специальные криптографические библиотеки и используются классы из пространства имен System.Security.Cryptography. Ниже приведен пример шифрования и расшифрования строки с использованием алгоритма AES:
using System;
using System.IO;
using System.Security.Cryptography;
public static class CryptoExample
{
private static readonly byte[] Key = new byte[32] { 0x2A, 0x5C, 0x82, 0x47, 0xC9, 0xE3, 0x9F, 0x81, 0xCD, 0xAE, 0x53, 0x7F, 0x3C, 0x24, 0x92, 0x16, 0xE6, 0x01, 0x4B, 0x7D, 0xF2, 0xA5, 0xD6, 0x98, 0xC1, 0x8B, 0x55, 0x63, 0x74, 0x29, 0xBB, 0x64 };
private static readonly byte[] IV = new byte[16] { 0x42, 0xA7, 0x3E, 0xAF, 0x08, 0xE4, 0xD5, 0xF1, 0xC7, 0x72, 0x9B, 0x6D, 0x58, 0x93, 0x02, 0x34 };
public static byte[] EncryptString(string plainText)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
return msEncrypt.ToArray();
}
}
}
}
public static string DecryptString(byte[] cipherText)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
}
}
public static void Main()
{
string plainText = "Hello, world!";
byte[] cipherText = EncryptString(plainText);
string decryptedText = DecryptString(cipherText);
Console.WriteLine("Original: {0}", plainText);
Console.WriteLine("Encrypted: {0}", Convert.ToBase64String(cipherText));
Console.WriteLine("Decrypted: {0}", decryptedText);
}
}
Выполнение кода выше приведет к зашифрованию строки "Hello, world!" с использованием алгоритма AES и выводу зашифрованного текста, а затем к расшифровке и выводу исходного текста.
Пример 2. Хэширование паролей и секретных данных.
Хэширование паролей и секретных данных - это распространенная практика для защиты данных от несанкционированного доступа. Ниже приведен пример хэширования пароля с использованием алгоритма SHA256:
using System;
using System.Security.Cryptography;
public static class HashingExample
{
public static string HashPassword(string password)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
return Convert.ToBase64String(bytes);
}
}
public static bool VerifyPassword(string password, string hashedPassword)
{
string hashedInput = HashPassword(password);
return (hashedInput == hashedPassword);
}
public static void Main()
{
string password = "myPassword123";
string hashedPassword = HashPassword(password);
Console.WriteLine("Original password: {0}", password);
Console.WriteLine("Hashed password: {0}", hashedPassword);
bool isPasswordValid = VerifyPassword(password, hashedPassword);
Console.WriteLine("Password is valid: {0}", isPasswordValid);
}
}
Выполнение кода выше приводит к хэшированию пароля "myPassword123" с использованием алгоритма SHA256 и выводу захэшированного значения. Затем происходит проверка валидности пароля, используя функцию VerifyPassword.
Пример 3. Работа с шифрованными контейнерами данных.
Шифрованные контейнеры данных позволяют защитить целые наборы данных, сохраняя их в зашифрованном виде и обеспечивая доступ только авторизованным пользователям. В C# можно использовать класс ProtectedData из пространства имен System.Security.Cryptography для работы с шифрованными контейнерами данных. Ниже приведен пример сохранения и чтения шифрованных данных:
using System;
using System.IO;
using System.Security.Cryptography;
public static class ProtectedDataExample
{
public static byte[] ProtectData(byte[] data)
{
return ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);
}
public static byte[] UnprotectData(byte[] protectedData)
{
return ProtectedData.Unprotect(protectedData, null, DataProtectionScope.CurrentUser);
}
public static void Main()
{
string originalData = "Sensitive information";
byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(originalData);
byte[] protectedData = ProtectData(dataBytes);
Console.WriteLine("Protected data: {0}", Convert.ToBase64String(protectedData));
byte[] decryptedData = UnprotectData(protectedData);
string decryptedText = System.Text.Encoding.UTF8.GetString(decryptedData);
Console.WriteLine("Decrypted data: {0}", decryptedText);
}
}
Выполнение приведенного кода приведет к защите данных "Sensitive information", используя функцию ProtectData, и выводу зашифрованных данных. Затем эти данные расшифровываются с помощью функции UnprotectData, и результат выводится на экран.
Обратим внимание, что в каждом из этих примеров показан основной принцип работы соответствующих функций и методов. В реальных системах защиты данных обычно требуется принять дополнительные меры, такие как сохранение ключей безопасности в безопасном хранилище, управление доступом и т.д.
Для оценки защищенности данных, реализованных на языке программирования C# с использованием криптографических библиотек, хэширования паролей и секретных данных, а также работы с шифрованными контейнерами данных, можно провести следующие тестовые сценарии [1], [7], [8]:
- Тестирование хэширования паролей:
- создание пользователя с паролем;
- хэширование пароля и сохранение его в базе данных;
- аутентификация пользователя с введенным паролем;
- сравнение хэша введенного пароля с сохраненным хэшем.
- Тестирование шифрования и дешифрования данных:
- шифрование некоторых секретных данных с использованием симметричного ключа;
- сохранение зашифрованных данных в файл или базу данных;
- дешифрование данных с помощью правильного ключа;
- проверка правильности дешифрованных данных.
- Тестирование работоспособности криптографических библиотек:
- генерация случайного ключа шифрования;
- шифрование и расшифрование каких-либо данных с использованием библиотеки;
- проверка правильности расшифрованных данных.
- Тестирование обработки ошибок и исключений:
- попытка использования неправильного пароля для расшифровки данных;
- попытка дешифрования данных без доступа к необходимым ключам;
- проверка обработки исключений и корректности сообщений об ошибках.
- Тестирование работы с шифрованными контейнерами данных:
- создание шифрованного контейнера данных и добавление в него некоторых элементов;
- чтение данных из контейнера и проверка корректности расшифрованных данных;
- редактирование и удаление элементов из контейнера;
- проверка сохранения изменений в контейнере и корректности работы со шифрованными данными.
Анализ результатов тестирования включает в себя оценку успешности выполнения каждого тестового сценария, выявление потенциальных уязвимостей защищенности данных и производительности криптоопераций. Также важно учесть возможные ошибки в реализации и принять меры для их устранения.
Построение защищенного хранилища на языке программирования C# является важной задачей для обеспечения безопасности данных. Реализация описанных принципов и методов поможет предотвратить утечку и несанкционированный доступ к конфиденциальной информации. При разработке такого хранилища необходимо учитывать современные требования безопасности и следовать рекомендациям по обеспечению защиты данных.
1. Маракуева, Н. В. Защищенное файловое хранилище / Н. В. Маракуева // Информационное пространство в аспекте гуманитарных и технических наук - 2015: Материалы IV междисциплинарной межвузовской конференции студентов, магистрантов и аспирантов, Барнаул, 25 ноября 2015 года / Ответственный за выпуск А.В. Черенкова. – Барнаул: ООО "Алтай-Циклон", 2015. – С. 36-39. – EDN VXULYP.
2. Маракуева, Н. В. Защищенное облачное хранилище предприятия / Н. В. Маракуева // Проблемы правовой и технической защиты информации: Сборник научных статей, Барнаул, 24 мая 2017 года / ФГБОУ ВПО «Алтайский государственный университет». Том Выпуск V. – Барнаул: Алтайский государственный университет, 2017. – С. 45-50. – EDN ZTOXWB.
3. Садков, А. А. Разработка многопользовательского защищенного хранилища данных / А. А. Садков // Молодой исследователь: вызовы и перспективы: Сборник статей по материалам LXI международной научно-практической конференции. Том 8 (61): Общество с ограниченной ответственностью "Интернаука", 2018. – С. 146-148. – EDN YTJELU.
4. Кочин, В. П. Разработка образовательного защищенного облачного хранилища данных, интегрированного в инфраструктуру образовательного учреждения / В. П. Кочин, А. В. Жерело // Вестник компьютерных и информационных технологий. – 2022. – Т. 19, № 6(216). – С. 21-28. – DOIhttps://doi.org/10.14489/vkit.2022.06.pp.021-028. – EDN TNVYJK.
5. Бакуменко, В. В. Использование общедоступных облачных хранилищ данных в качестве криптоконтейнеров для защищенного хранения информации в распределенных компьютерных системах / В. В. Бакуменко, С. С. Куликов // Управление информационными рисками и обеспечение безопасности инфокоммуникационных систем. – 2020. – Т. 18, № 1. – С. 72-85. – EDN MBSZEP.
6. Зольников, К.В. Математическая модель оценки показателей надежности сложных программно-технических комплексов / К.В. Зольников, Д.М. Уткин, Ю.А. Чевычелов // Моделирование систем и процессов. – 2018. – Т. 11, № 1. – С. 21-26.
7. Зольников, В.К. Моделирование и анализ производительности алгоритмов балансировки нагрузки облачных вычислений / В.К. Зольников, О.В. Оксюта, Н.Ф. Даюб // Моделирование систем и процессов. – 2020. – Т. 13, № 1. – С. 32-39.
8. Зольников К.В. Система управления распределением работ при проектировании сложных технических систем / Новикова Т.П., Зольников К.В., Кулай А.Ю., Струков И.И. // В сборнике: Информационные технологии в управлении и моделировании мехатронных систем. материалы 1-й научно-практической международной конференции. 2017. С. 199-204.