Насколько безопасны ресурсы в .NET? - PullRequest
6 голосов
/ 10 марта 2010

Насколько сложно будет извлечь встроенные ресурсы из приложения .NET, вне самого приложения?Даже если ресурсы сжаты и тривиально зашифрованы, насколько сложно получить их с помощью инструмента?(Меня не интересует защита данных как таковых, только методы поиска самого ресурса)


РЕДАКТИРОВАТЬ:

Я думаю, что мой вопрос был неправильно понятменьше о шифровании и больше о поиске, кроме рефлектора, что еще можно использовать?

Ответы [ 5 ]

8 голосов
/ 10 марта 2010

Получить ресурсы из скомпилированной библиотеки .NET DLL с помощью таких инструментов, как .NET Reflector или .NET Resourcer .

, довольно просто.
6 голосов
/ 10 марта 2010

Если вы зашифруете ресурсы с помощью ключа, который встроен в приложение, тогда будет легко получить ключ и, следовательно, ресурсы, с небольшим количеством обратного инжиниринга.

Если вы зашифруете их с помощью безопасного алгоритма и попросите пользователя ввести пароль, то без пароля будет невозможно извлечь ресурсы. Но я думаю, это не то, что вы хотите. Я полагаю, вы хотите запретить пользователю использовать ваши ресурсы вне приложения?

Если это так, краткий ответ: ресурсы в .NET не защищены.

3 голосов
/ 10 марта 2010

Вот небольшой код для извлечения ресурсов из сборок. Вы сами решаете, насколько это просто и безопасно ...

class Program
{
    static void Main(string[] args)
    {
        var assemblies = from file in args
                         let assembly = TryLoad(file)
                         where assembly != null
                         from rName in assembly.GetManifestResourceNames()
                         select new { assembly, rName };

        foreach (var item in assemblies)
            using (var rs = item.assembly
                                .GetManifestResourceStream(item.rName))
                SaveTo(rs, item.rName);

    }

    static void SaveTo(Stream stream, string name)
    {
        var buffer = new byte[32*1024];
        var bufferLen = 1;
        using (var fs = new FileStream(name, FileMode.Create))
            while (bufferLen > 0)
                if ((bufferLen = stream.Read(buffer, 0, buffer.Length)) > 0)
                    fs.Write(buffer, 0, bufferLen);
    }

    static Assembly TryLoad(string filename)
    {
        if (string.IsNullOrEmpty(filename) ||
            !File.Exists(filename))
            return null;
        try
        {
            var fullName = Path.GetFullPath(filename);
            return Assembly.LoadFile(fullName);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            return null;
        }
    }
}
2 голосов
/ 10 марта 2010

Проблема не столько в ресурсах .NET, сколько в безопасности в целом. Вы можете перефразировать вопрос как «мое клиентское приложение хранит секреты, которые я не хочу перепроектировать», и не менять намерения.

Что находится в ваших файлах ресурсов, и почему это необходимо защитить? Рассматривали ли вы дизайн, в котором вы не храните эти секреты на клиенте вообще? Если вы рассчитываете сохранить секретность на стороне клиента, я думаю, вы будете разочарованы.

2 голосов
/ 10 марта 2010

Если я покажу вам сейф с миллионом долларов, то уйдите, и в конце концов вы попадете в этот сейф. Нет технологии, которая защитит эти деньги, ваш единственный настоящий барьер - время.

То же самое для программного обеспечения. Единственный способ защитить ресурсы - не размещать их там, где кто-то может, если у них есть достаточно времени, добраться до них. Самый эффективный вариант, который я знаю, - это хранение критических ресурсов на сервере, которым вы управляете.

Конечно, многие ошибаются. Так или иначе, они позволяют временно копировать защищенный ресурс на компьютер пользователя. На каком этапе игра проиграна. Это означает, что вы можете действительно защищать только ресурсы, которые имеют временный клон. Например, маркер безопасности, срок действия которого истекает, или результаты расчета, которые не показывают, как был выполнен расчет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...