_D4N Ответов: 2

Зашифруйте XML, чтобы люди не могли смотреть на его данные


Здравствуйте, я создал класс под названием "ClassA" и записываю его содержимое на жесткий диск в виде XML-файла, например:
static void Write(ClassA cA)
{
    var serializer = new XmlSerializer(typeof(ClassA));

    using (var stream = new FileStream(System.IO.Path.Combine("C:\\","AFile.XML"), FileMode.Create))
    {
        serializer.Serialize(stream, cA);
        stream.Close();
        stream.Dispose();
    }
}

И я прочитал его вот так:
static ClassA Load()
{
    var serializer = new XmlSerializer(typeof(ClassA));
        using (FileStream stream = new FileStream(System.IO.Path.Combine("C:\\","AFile.XML"), FileMode.Open))
        {

            var container = serializer.Deserialize(stream) as ClassA;
            stream.Close();
            stream.Dispose();
            return container;
        }
}


Проблема в том, что XML - файл - это, очевидно, обычный текст, и каждый может видеть и изменять его значения. Как я могу зашифровать весь XML-файл так, чтобы люди не могли легко манипулировать им? Я был бы рад, если бы вы помогали шаг за шагом.
Спасибо.

Что я уже пробовал:

Я попробовал это для шифрования, но он продолжал говорить "неправильная длина ключа", и я на самом деле не понял, шифрует ли он весь XML-файл или только значения. В общем, он просто не работал и продолжал говорить об ошибке.
string sKey = //I tried 128, 32 and 256 bytes of string, none worked;

 var serializer = new XmlSerializer(obj.GetType());
 var stream = new FileStream(path, FileMode.Create);

 DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
 DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
 DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

 ICryptoTransform desencrypt = DES.CreateEncryptor();

 using(CryptoStream cStream = new CryptoStream(stream, desencrypt, CryptoStreamMode.Write)){
 serializer.Serialize(cStream, obj);
 }

 stream.Close ();

Пример кода находится по ссылке ниже, другую часть (чтение, расшифровка) вы можете найти там.
Шифрование XML-файла : Unity3D[^]

phil.o

Почему бы не использовать двоичный сериализатор в первую очередь вместо XML-сериализатора, если вы не хотите, чтобы содержимое файла было читаемым человеком?

_D4N

Это хорошая идея, какой источник - видео или веб - сайт-вы считаете лучшим для изучения этого?

phil.o

Если безопасность-это ваша забота, то двоичная сериализация может обеспечить только быстрое решение, которое не будет сопротивляться определению того, кто хочет знать содержимое файла.
Хотя, если вы хотите взглянуть на него, вы можете использовать System.Runtime.Serialization.Formatters.Binary.BinaryFormatter вместо вашего XmlSerializer: Класс BinaryFormatter[^]. Связанная страница содержит пример использования.
Любезно.

F-ES Sitecore

Любой желающий может использовать средство просмотра файлов (например, блокнот), чтобы увидеть двоичный файл в виде текста, и xml будет виден.

phil.o

Не совсем так, поскольку двоичный форматер не хранит значения в виде XML; но я согласен с вашей точкой зрения и предупредил OP о ложном уровне безопасности, который он, по-видимому, обеспечивает.

2 Ответов

Рейтинг:
11

F-ES Sitecore

Используйте LegalKeySizes, чтобы узнать законный размер Вашего ключа

KeySizes[] sizes = DES.LegalKeySizes;

foreach (var s in sizes)
{
    Debug.WriteLine(s.MinSize + " - " + s.MaxSize);
}


Для DES вы увидите, что это минимум и максимум 64, то есть он должен быть 64 байта, а если вы используете символы ASCII для построения своего ключа, то 64 байта-это 8 символов, поэтому ключ должен быть длиной 8 символов. Вы также не должны использовать одни и те же байты для ключа и IV.


Рейтинг:
1

Richard MacCutchan

Видеть Шифрование Данных | Microsoft Docs[^Однако если вы беспокоитесь о защите своих данных, то XML-это не лучший выбор хранилища.