Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 22

Работа с конфиденциальными данными в памяти

26.08.2016, 12:05. Показов 2316. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть некие данные которые хранятся на диски в зашифрованном виде. Мне нужна как-то с ними работать (чтение, запись и т. п.). Если я расшифрую и загружу эти данные в string, то они будут висеть какое-то в памяти в открытом виде, что нехорошо. Как быть в такой ситуации?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2016, 12:05
Ответы с готовыми решениями:

Обмен данными блоков памяти
составить программу, которая производит обмен данными блоков памяти, хранящих 4 слова и расположенных, начиная с адресов 201FH и 205FH ...

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

Инициализация TImage данными из оперативной памяти
Привет! Не подскажите как инициализировать TImage данными из оперативной памяти (gif-файд), а потом сохранить на диск как jpg-файл? ...

28
Эксперт .NET
 Аватар для Rius
13683 / 7863 / 1702
Регистрация: 25.05.2015
Сообщений: 23,877
Записей в блоге: 14
26.08.2016, 14:21
Студворк — интернет-сервис помощи студентам
aquaMakc, расшифровываемый этим классом массив всё равно что строка. Он для другого предназначен, судя по описанию.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
26.08.2016, 14:42
Цитата Сообщение от Psilon Посмотреть сообщение
Не представляю ситуации, когда кто-то может этим воспользоваться
Еще раз.
В твоём варианте сдампить строку можно в любой момент времени пока живет объект SecureStringStream.
Сдампить строку с SecureString можно только тогда, когда происходит изменение строки.

Разницу улавливаешь? Время жизни SecureStringStream может быть таким же как и время жизни SecureString, только из SecureString данные не вытащить, а из SecureStringStream можно вытащить в любой момент.

Цитата Сообщение от Psilon Посмотреть сообщение
выделили - поработали - быстренько освободили
Ты не можешь гарантировать что SecureStringStream будет "быстренько освобождён" - в этом и есть уязвимость твоего способа, ты надеешься на то что он будет быстро освобожден, SecureString ни на что не надеется, в этом вся разница.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.08.2016, 14:53
Цитата Сообщение от NickoTin Посмотреть сообщение
Ты не можешь гарантировать что SecureStringStream будет "быстренько освобождён" - в этом и есть уязвимость твоего способа, ты надеешься на то что он будет быстро освобожден, SecureString ни на что не надеется, в этом вся разница.
SecureString точно так же надеется: "Я вам тут положу расшифрованную строку, в unmanaged heap, только удалите её как можно быстрее". Да и логично, что это именно так, потому что иначе сделать невозможно.

Цитата Сообщение от NickoTin Посмотреть сообщение
В твоём варианте сдампить строку можно в любой момент времени пока живет объект SecureStringStream.
Сдампить строку с SecureString можно только тогда, когда происходит изменение строки.
Речь же не о SecureString, а о враппере над ним? Так вот постоянная расшифровка в память будет более заметна любой тулзой анализирующей память, чем одноразовое выделение буфера. Причем суммарное время пребывания в памяти будет одинаковым и в моем, и в твоем случае, только в моем это существование будет непрерывное, а твое - между вызовами. В чем увеличение безопасности?

Единственный суровый способ это делать полностью свою имплементацию SecureString'и, из которой можно будет доставать по одному символу. Сделать это безошибочно не разбираясь досконально в криптографии, насколько мне известно - невозможно.
Цитата Сообщение от NickoTin Посмотреть сообщение
Ты не можешь гарантировать что SecureStringStream будет "быстренько освобождён" - в этом и есть уязвимость твоего способа, ты надеешься на то что он будет быстро освобожден, SecureString ни на что не надеется, в этом вся разница.
Не могу и не собираюсь, это называется Fair use. Не всегда есть возможность всегда мягко пользователя предупредить обо всех последствиях и позаботиться, чтобы все прошло успешно. За примером далеко ходить не надо - если в тяжелом приложении очень много ресурсов, которые нужно закрывать, и все они на финализаторах, то система тупо прибьет процесс до того, как он корректно завершится. Кто виноват, процесс? Ну в некотором роде, только дотнет не дает простых решений этой проблемы.
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
26.08.2016, 17:28
Цитата Сообщение от CoderSharp Посмотреть сообщение
Как быть в такой ситуации?
Использовать SecureString class, он хранит эти данные:
1. В неуправляемой памяти.
2. Зашифрованными.
Psilon, ятп NickoTin прав, поскольку вы принимаете в конструкторе SecureStringStream безопасный SecureString, получаете ссылку на plain строку и сохраняете ее.
По сути, вы сделали аналог самого SecureString, который также позволяет гарантированно уничтожать объект, но во время использования самого объекта он хранит данные в открытом виде, то есть это, скажем так, небезопасный аналог.
1
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 22
26.08.2016, 17:50  [ТС]
IamRain, Вы извините меня если я туплю. Я новичок. Вы говорите, что нужно использовать SecureString, но время от времени придется передавать данные в string. А string неизвестно сколько будет висеть в памяти.
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
26.08.2016, 17:54
CoderSharp, просто
Цитата Сообщение от CoderSharp Посмотреть сообщение
А string неизвестно сколько будет висеть в памяти.
Все верно, значит использование SecureString не имеет смысла.
0
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 22
26.08.2016, 18:09  [ТС]
IamRain, вот. Но напрямую securestring редактировать нельзя. Если правильно понимаю. Тогда выход напрашивается только один. Писать библиотеку на C/C++ и там проводить все манипуляции. Ведь только там можно гарантированно уничтожить строку.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.08.2016, 18:12
IamRain, с этим классом всегда можно написать враппер, который гарантирует очистку памяти ASAP. Если вопрос только в обертке, то это не проблема самого подохода. И как я уже сказал, не вытащив строку полностью расшифровать её все равно невозможно. Можно вытаскивать по 1 символу и потом занулять память, но принципиальной безопасности это не дает. Я потому и написал стрим, хотя по идее мог просто сделать экстеншн для MD5, который добавил бы для MD5 перегрузку, принимающую SecureString. Что-то в духе
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        string samplePass = "Hello world!";
        using (var md5 = MD5.Create())
        {
            byte[] originalHash = md5.ComputeHash(Encoding.Unicode.GetBytes(samplePass));
            Console.WriteLine(string.Concat(originalHash.Select(x => x.ToString("X2"))));
            var sec = new SecureString();
            foreach (char c in samplePass)
            {
                sec.AppendChar(c);
            }
            byte[] arr = md5.ComputeHash(sec);
            Console.WriteLine(string.Concat(arr.Select(x => x.ToString("X2"))));
        }
    }
}
 
public static class SecureStringExtension
{
    private class SecureStringStream : Stream
    {
        private IntPtr _bstr;
 
        public SecureStringStream(SecureString secureString)
        {
            _bstr = Marshal.SecureStringToBSTR(secureString);
            Length = Marshal.ReadInt32(_bstr, -4);
        }
 
        public override int Read(byte[] buffer, int offset, int count)
        {
            if (Position == Length)
                return 0;
            buffer[0] = Marshal.ReadByte(_bstr, (int)Position);
            Position++;
            return 1;
        }
 
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            if (_bstr != IntPtr.Zero)
            {
                Marshal.ZeroFreeBSTR(_bstr);
                _bstr = IntPtr.Zero;
            }
        }
 
        public override long Seek(long offset, SeekOrigin origin)
        {
            throw new NotSupportedException();
        }
 
        public override void Flush()
        {
            throw new NotSupportedException();
        }
 
        public override void SetLength(long value)
        {
            throw new NotSupportedException();
        }
 
        public override void Write(byte[] buffer, int offset, int count)
        {
            throw new NotSupportedException();
        }
 
        public override bool CanRead => true;
        public override bool CanSeek => false;
        public override bool CanWrite => false;
        public override long Length { get; }
        public override long Position { get; set; }
    }
 
    public static byte[] ComputeHash(this HashAlgorithm md5, SecureString secureString)
    {
        using (var secureStringStream = new SecureStringStream(secureString))
        {
            return md5.ComputeHash(secureStringStream);
        }
    }
}
Теперь гарантируется, что экземпляр в открытом виде проживет совсем немного. Окей, не вопрос, так стало немного безопаснее. И суммарное время нахождения в открытом виде в памяти будет меньше, чем если расшифровывать всю строку для каждого символа.

Изначально вопрос вообще касался, зачем передавать строку в С++, где она точно также хранится в памяти. Когда можно на месте всё сделать.
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
26.08.2016, 18:17
Цитата Сообщение от CoderSharp Посмотреть сообщение
Если правильно понимаю.
Неправильно.
Цитата Сообщение от CoderSharp Посмотреть сообщение
Но напрямую securestring редактировать нельзя
Почему? Вы можете использовать все методы securestring, каждый раз после изменения все данные вашей строки из unmanaged памяти повторно зашифровываются.
Отсюда:
However, the value of a SecureString object is automatically encrypted, can be modified until your application marks it as read-only
The value of an instance of SecureString is automatically encrypted when the instance is initialized or when the value is modified
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2016, 18:17

Работа с файлами(Запись,чтение,работа с данными)
Здравствуйте, никак не могу осилить файлы... Для начала вот само задание: В справочной автовокзала хранится расписание движения автобусов....

Работа с битами И Работа с символьными данными
1. Ввести 8 символов. В символе с наибольшим кодом заменить 5-й бит единицей, а в символе с наименьшим кодом 6-й бит - нулем. Вывести...

Указатели, функции и динамическое выделение памяти: вывести строки с неповторяющимися данными
Задана матрица A(n,n) ,n<=15 . Написать программу, которая находит и выводит на экран номера тех строк, элементы которых не...

Работа с данными
Задание у меня такое: Создать базу данных пациентов, это я сделала, В одной из таблиц есть поля со списками степени выраженности симптомов...

Работа с данными
Это мой код: $countries = "SELECT ex_orders.orders_status,ex_orders.customers_country, countries.countries_name,...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru