Как лучше всего хранить секретную информацию в памяти в Python?

Итак, проблема в том, что у меня есть некоторые секреты (ключи TOTP / HOTP), которые должны последовательно использоваться моей программой, но я не хочу, чтобы дамп памяти просто отображал их все. Я говорю о простых людях, чьи компьютеры могут быть скомпрометированы вредоносными программами.

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

Может быть, я смогу усложнить задачу, разделив этот ключ на несколько переменных?

Что ж, я не специалист по безопасности, и мой вопрос к тем, кто сталкивался с подобными проблемами раньше: как лучше всего хранить секретную информацию в памяти? Законно ли мое беспокойство или это параноик, и все программы просто сохраняют свои пароли в памяти?

Голосующие против: Подскажите, пожалуйста, как улучшить этот вопрос.

The Quantum Physicist 26.03.2018 16:58

Точно так же обоснованное предположение: я полагаю, это параноик.

Dschoni 26.03.2018 17:00

Вы можете найти больше опыта на Информационная безопасность SE (например, этот связанный вопрос).

jdehesa 26.03.2018 17:04

@jdehesa Спасибо. Я прочитаю это, и если здесь никто не может помочь, я подумаю об этом.

The Quantum Physicist 26.03.2018 17:05

Здесь вы должны подумать о векторе атаки. Какие вредоносные программы могут найти все интерпретаторы Python из памяти, просмотреть все живые объекты Python, чтобы увидеть, какие из них являются строками, просмотреть хранилище каждой строки и надежно угадать, какие из них являются значимыми секретами, но не могли просто сделать то же самое? с сетевыми отправками или вызовами в криптографическую библиотеку или чем-то еще, что вы делаете с ключами после их расшифровки?

abarnert 26.03.2018 17:06

@abarnert Хороший вопрос. Я делаю программу, которая может использовать эти ключи. Библиотека, использующая эти ключи, использует их только по вызову и не сохраняет следов в памяти. Таким образом, злоумышленник, который видит дамп памяти и знает, что моя программа существует, будет искать мою программу и может ее найти. Вот о чем я думаю.

The Quantum Physicist 26.03.2018 17:10

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

abarnert 26.03.2018 17:11

@abarnert Понятно. Так что изменение параметров шифрования в памяти то и дело помогает. Я буду нацеливаться на это. К сожалению, невозможно не полагаться на то, что эта информация остается в памяти для TOTP. Токен генерируется каждые 30 секунд, и для этого нужен ключ.

The Quantum Physicist 26.03.2018 17:14

Итак, вы вызываете библиотеку с этими ключами. Вам нужно расшифровать ключи, после чего они будут в памяти, и, что более важно, вы должны передать их в библиотеку. Предполагая, что библиотека находится на C, а не на Python, и вы используете привязку ABI к ней, например ctypes, очевидный способ сломать это - подключить dlsym или FindProcAddress и посмотреть, какие строки вы передаете в экспорт этой библиотеки, а не смотреть на каждая строка в памяти.

abarnert 26.03.2018 17:16

@abarnert Я так понимаю, что это невозможно защитить, пока задействован ctypes ...

The Quantum Physicist 26.03.2018 17:18

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

abarnert 26.03.2018 17:27

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

abarnert 26.03.2018 17:32

@abarnert Может ли программа на C++, которая полностью статически связана с одним исполняемым файлом, решить все проблемы, о которых вы можете подумать?

The Quantum Physicist 27.03.2018 10:51

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

abarnert 27.03.2018 19:11

Я могу придумать случай, когда одноразовое решение имеет смысл: иногда вы хотите иметь возможность доказать, что вы использовали «отраслевой» уровень защиты по юридическим причинам, когда кто-то делает взломал его. Может быть, вы хотите защитить себя от судебных исков со стороны клиента, или подать в суд на начинающего конкурента, или обеспечить соблюдение какого-либо морально сомнительного, но юридически действительного положения DMCA против пиратов, или что-то еще. Но тогда вы просто узнаете, что такое «отраслевой стандарт», что, вероятно, означает покупку готового обфускатора и использование его в точности так, как задокументировано, - но спросите юриста.

abarnert 27.03.2018 19:16

@abarnert Спасибо за помощь и совет :-)

The Quantum Physicist 27.03.2018 19:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
16
316
0

Другие вопросы по теме