Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1

Как и где хранить конфиденциальные данные

26.11.2015, 18:58. Показов 2524. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане.

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

У меня имеется некое приложение, которое в ходе работы генерирует\изменяет информацию некоторую. Эту информацию необходимо сохранять на устройстве (компуктере).

Сохранение данных произвожу через XML-сериализацию (все работает, все хорошо).

Но вот одно но: Информация, которая сохраняется на устройстве, должна быть недоступна для посторонних глаз (например файлик с логинами и паролями для приложения ).

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

Точнее: У меня в XML сохраняется List, содержащий объекты с двумя свойствами (UserName, UserPassword). По закрытию приложения в XML файле можно увидеть такое:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   яяяя          NMAS.Stuff.PassContainer, Version=1.0.0.0, 
 
Culture=neutral, PublicKeyToken=null   
 
%MAS.Stuff.PassContainer.Objects.Users   
List`1+_items
 
List`1+_sizeList`1+_version  &MAS.Stuff.PassContainer.Objects.User[]   
 
                        $MAS.Stuff.PassContainer.Objects.User  
 
              
   $MAS.Stuff.PassContainer.Objects.User   
 
userNameuserPassword      test   test      

Не нужно быть хацкером, чтобы догадаться об аккаунте с данными test (логин и пароль).

Есть ли вариант сохранения данных с предотвращением "подглядывания"? (Чтобы данные нельзя было узреть или они были нечитабельны).

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2015, 18:58
Ответы с готовыми решениями:

где хранить текст файлы? или как хранить данные?
Есть прога простенкая: берет инфу из текстфайла, редактирует и записывает обратно в тхт файл. Нужно сделать так чтобы инфу не смогли читать...

Учет прихода и ухода. Как и где хранить данные
Здравствуйте. У меня такая маленькая идейка есть. Хочу написать прогу для учета прихода и ухода. Но для этого отдельно ставить БД не хочу....

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

8
 Аватар для skilllab
295 / 235 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
26.11.2015, 20:15
Ну а если создать 2 метода: первый шифрует ваш XML с помощью какого нибудь RSACryptoServiceProvider. Второй метод дешифрует. Всего-то)) Шифрованный файл уже сбрасывайте в нужное место.
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
19.12.2015, 17:26  [ТС]
skilllab, А можно по конкретнее насчет алгоритма?
Если я правильно понял, то следует сериализовать данные, потом перезаписывать файлик с помощью шифратора; а при загрузке данных - перезаписывать файл с результатами дешифратора. Верно?
0
 Аватар для skilllab
295 / 235 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
19.12.2015, 17:29
Всё верно, только шифрование и дешифрование выполняйте прямо в приложении.
К примеру: сериализуйте в XML, потом зашифруйте, всё в byte[] и в файл. При загрузке обратная последовательность. На диске шифрованный файл так пускай и лежит.
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
19.01.2016, 01:16  [ТС]
skilllab, Попробовал реализовать идею с помощью DESCryptoServiceProvider

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 #region Crypt
        byte[] keybytes = Encoding.ASCII.GetBytes("pukeyzzz");
 
        byte[] vector = Encoding.ASCII.GetBytes("vectrzzz");
        public string Encrypt(string originalString)
        {
            var cryptoProvider = new DESCryptoServiceProvider();
            var memoryStream = new MemoryStream();
 
            var cryptoStream = new CryptoStream(memoryStream,
                cryptoProvider.CreateEncryptor(keybytes, vector), CryptoStreamMode.Write);
 
            var writer = new StreamWriter(cryptoStream);
 
            writer.Write(originalString);
            writer.Flush();
 
            cryptoStream.FlushFinalBlock();
 
            writer.Flush();
 
            var text = Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
 
            memoryStream.Close();
            cryptoStream.Close();
            writer.Close();
 
            return text;
        }
 
        public string Decrypt(string cryptedString)
        {
            var cryptoProvider = new DESCryptoServiceProvider();
            var memoryStream = new MemoryStream
                    (Convert.FromBase64String(cryptedString));
 
            var cryptoStream = new CryptoStream(memoryStream,
                cryptoProvider.CreateDecryptor(keybytes, vector), CryptoStreamMode.Read);
 
            var reader = new StreamReader(cryptoStream);
 
            var text = reader.ReadToEnd();
            reader.Close();
            memoryStream.Close();
            cryptoStream.Close();
 
            return text;
        }
        #endregion
Взял пример простой.

Если я правильно понял.
Сохранение файла
1. Сериализация данных в файл
2. Чтение файла
3. Шифрование данных
4. Перезапись файла с шифрованными данными

Загрузка файла

1. Чтение шифрованных данных
2. Дешифровка
3. Запись в файл дешифрованных данных (в новый временный файл)
4. Десериализация из временного файла
5. Удаление временного файла

Если такая идея правильная, то у меня проблемы некоторые возникают.
Во время шифрование некоторые символы ошибочно шифруются\дешифруются, что потом вызывает ошибки десериализации: (Ниже исходный файл и файл, прошедший шифровку и дешифровку)
Файл
 яяяя  NMAS.Stuff.PassContainer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null %MAS.Stuff.PassContainer.Objects.Users
List`1+_items List`1+_sizeList`1+_version &MAS.Stuff.PassContainer.Objects.User[]        $MAS.Stuff.PassContainer.Objects.User 
 $MAS.Stuff.PassContainer.Objects.User userName userPassword  test test
Шифрованный файл
 ����  NMAS.Stuff.PassContainer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null %MAS.Stuff.PassContainer.Objects.Users
List`1+_items List`1+_sizeList`1+_version &MAS.Stuff.PassContainer.Objects.User[]        $MAS.Stuff.PassContainer.Objects.User 
 $MAS.Stuff.PassContainer.Objects.User userName userPassword  test test


Вот моя сериализация и десериализация:
Кликните здесь для просмотра всего текста
Serialization
C#
1
2
3
4
5
6
7
8
internal void SaveUserData(string FilePath, object ObjToSave)
        {
            var WritterStream = File.Open(FilePath, FileMode.Open);
            new BinaryFormatter().Serialize(WritterStream, ObjToSave);
 
            WritterStream.Close();
 
        }
Deserialization
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
internal T LoadUserData<T>(string Path, T Obj)
        {
            if (File.Exists(Path))
            {
                var ReaderStream = File.Open(Path, FileMode.Open);
 
                if (ReaderStream.Length > 0)
                {
                    var Formatter = new BinaryFormatter();
                    Obj = (T)Convert.ChangeType(Formatter.Deserialize(ReaderStream), typeof(T));
 
                }
 
                ReaderStream.Close();
            }
            else
            {
                File.Create(Path).Close();
            }
 
            return Obj;
 
        }
Собственно на такие методы хочу навесить грамотно шифровку (методы представил чистые, без намека на шифрование (вам не стоит видеть того ужаса)).

Добавлено через 2 минуты
Такой подход (с временным файлом) выбрал по причине того, что после дешифрования можно получить поток, где уже дешифрованные данные лежат, но BinaryFormatter ругается на то, что ему хочется получить Stream тип, а не StreamReader.

Добавлено через 7 минут
Затупил конкретно я.

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

Добавлено через 11 минут
1223
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.01.2016, 08:54
Цитата Сообщение от bodynar Посмотреть сообщение
Есть ли вариант сохранения данных с предотвращением "подглядывания"? (Чтобы данные нельзя было узреть или они были нечитабельны).
Есть. Называется Data Protection API (DPAPI):

Windows Data Protection
https://msdn.microsoft.com/en-... 95355.aspx

ProtectedData Class
https://msdn.microsoft.com/en-... .110).aspx

How to: Use Data Protection
https://msdn.microsoft.com/en-... .110).aspx

Если коротко: DPAPI - это шифрование, использующее в качестве ключа
учетные данные пользователя (пароль). Расшифровать их может только тот,
кто знает твой пароль на вход в Windows, и сделать это можно только на
том же самом компьютере, где они были зашифрованы. Сброс/смена
пароля не поможет.

Используется в Chrome, IE и других программах для защиты приватных данных от
посторонних глаз.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.01.2016, 11:18
Цитата Сообщение от bodynar Посмотреть сообщение
шифрование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public class Cryptor
    {
        private const string IV = "Cryptor1";
 
        public void Save(string path, object obj, string password)
        {
            byte[] key = Encoding.ASCII.GetBytes(password);
            byte[] vector = Encoding.ASCII.GetBytes(IV);
 
            using(var enc = new DESCryptoServiceProvider().CreateEncryptor(key, vector))
            using(var fs = new FileStream(path, FileMode.Create))
            using(var cs = new CryptoStream(fs, enc, CryptoStreamMode.Write))
                new BinaryFormatter().Serialize(cs, obj);
        }
 
        public T Load<T>(string path, string password)
        {
            byte[] key = Encoding.ASCII.GetBytes(password);
            byte[] vector = Encoding.ASCII.GetBytes(IV);
 
            using (var dec = new DESCryptoServiceProvider().CreateDecryptor(key, vector))
            using (var fs = new FileStream(path, FileMode.Open))
            using (var cs = new CryptoStream(fs, dec, CryptoStreamMode.Read))
                return (T)new BinaryFormatter().Deserialize(cs);
        }
    }
3
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
19.01.2016, 19:09  [ТС]
Storm23,
Цитата Сообщение от Storm23 Посмотреть сообщение
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
public T Load<T>(string path, string password)
          {
            byte[] key = Encoding.ASCII.GetBytes(password);
            byte[] vector = Encoding.ASCII.GetBytes(IV);
using (var dec = new DESCryptoServiceProvider().CreateDecryptor(key, vector))
            using (var fs = new FileStream(path, FileMode.Open))
            using (var cs = new CryptoStream(fs, dec, CryptoStreamMode.Read))
                 return (T)new BinaryFormatter().Deserialize(cs);
           }
А что, если файл существует, но данных в нем нету?
Попробовал таким образом:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public T Load<T>(string path, string password)
        {
            byte[] key = Encoding.ASCII.GetBytes(password);
            byte[] vector = Encoding.ASCII.GetBytes(IV);
 
            using (var dec = new DESCryptoServiceProvider().CreateDecryptor(key, vector))
            using (var fs = new FileStream(path, FileMode.Open))
            using (var cs = new CryptoStream(fs, dec, CryptoStreamMode.Read))
                if (fs.Lenght>0)
                     return (T)new BinaryFormatter().Deserialize(cs);
                else 
                     return default(T);
        }

Пишет ошибку криптографическую, хотя там её и не должно быть. Вроде как должно возвращаться null.
В моем варианте T - ObservableCollection<Account>, который допускает тип null (проверил в другом месте).
Тут же конструкция return default(T); выдает cryptographicexception , хотя почему её? Там же (в блоке else) ничего с криптографией не связано.

не могли бы вы помочь с усовершенствованием блока когда, чтобы возвращал null, если файл пустой.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.01.2016, 20:05
Цитата Сообщение от bodynar Посмотреть сообщение
А что, если файл существует, но данных в нем нету?
Вообще-то это ненормальная ситуация. Если есть файл, он должен быть в правильном формате. Пустой файл - это неправильный формат, а сам файл - битый. Поэтому вполне правильно, что метод выдает эесепшн.
Но если уж так хотите, то вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public T Load<T>(string path, string password8)
        {
            var key = Encoding.ASCII.GetBytes(password8);
            var vector = Encoding.ASCII.GetBytes(IV);
 
            using (var dec = new DESCryptoServiceProvider().CreateDecryptor(key, vector))
            using (var fs = new FileStream(path, FileMode.Open))
                if (fs.Length == 0) return default(T);
                else
                using (var cs = new CryptoStream(fs, dec, CryptoStreamMode.Read))
                    return (T)new BinaryFormatter().Deserialize(cs);
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2016, 20:05
Помогаю со студенческими работами здесь

Как и где хранить данные
Я делаю приложение для Android в Android Studio, которое хранит проекты людей. У каждого проекта есть список используемых в нём...

Где хранить и как выводить данные
Здравствуйте форумчане. Есть программа по отсылке смс клиентам. Задача такова. Нужно реализовать историю смс-рассылок. Допустим я...

Как и где хранить данные подключения к БД
Собственно сабж. Как и где Вы хранить данные подключения к DB. Используете вы какие нить средства шифрования и т.п.

Как и где лучше хранить текстовые данные
Мне нужно написать небольшую библиотеку, в которой будут храниться данные по книгам(автор, название и т.д.). В ней буду предусматривать...

Как добавлять в друзья и вообще где хранить данные?
Дорогие форумчане, я решил на своем сайте реализовать что то типо социальной сети. Встал вопрос о том как добавлять в друзья и вообще где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru