Пометить данные как чувствительные в Python - PullRequest
20 голосов
/ 11 июня 2009

Мне нужно на короткое время сохранить пароль пользователя в памяти. Как я могу сделать так, чтобы такая информация не была случайно раскрыта в coredumps или tracebacks? Есть ли способ пометить значение как «чувствительное», чтобы оно нигде не сохранялось отладчиком?

Ответы [ 4 ]

33 голосов
/ 12 июня 2009

Редактировать

Я сделал решение, которое использует ctypes (которое в свою очередь использует C) для обнуления памяти.

import sys
import ctypes

def zerome(string):
    location = id(string) + 20
    size     = sys.getsizeof(string) - 20

    memset =  ctypes.cdll.msvcrt.memset
    # For Linux, use the following. Change the 6 to whatever it is on your computer.
    # memset =  ctypes.CDLL("libc.so.6").memset

    print "Clearing 0x%08x size %i bytes" % (location, size)

    memset(location, 0, size)

Я не даю никаких гарантий безопасности этого кода. Он протестирован для работы на x86 и CPython 2.6.2. Более длинная запись здесь .

Расшифровка и шифрование в Python не будут работать. Строки и целые числа интернированы и постоянны, что означает, что вы оставляете беспорядок информации о паролях везде.

Хеширование является стандартным ответом, хотя, конечно, открытый текст в конечном итоге нужно где-то обрабатывать.

Правильным решением является выполнение чувствительных процессов в виде модуля C.

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

5 голосов
/ 03 февраля 2013

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

def paranoid_add_character_to_list(ch, l):
  """Copy l, adding a new character, ch.  Erase l.  Return the result."""
  new_list = []
  for i in range(len(l)):
    new_list.append(0)
  new_list.append(ch)
  for i in range(len(l)):
    new_list[i] = l[i]
    l[i] = 0
  return new_list

Источник: http://www.ibm.com/developerworks/library/s-data.html

  • Автор: Джон Виега (viega@list.org) является соавтором Building Secure. Программное обеспечение (Addison-Wesley, 2001) и Java Enterprise Architecture (O'Reilly and Associates, 2001). Джон является автором более 50 технические публикации, прежде всего в области безопасности программного обеспечения. Он также написал Mailman, Менеджер списков рассылки GNU и ITS4, инструмент для поиска уязвимостей в коде C и C ++.
2 голосов
/ 11 июня 2009
  • XOR с одноразовым блокнотом, хранящимся отдельно
  • всегда храните соленый хеш, а не сам пароль

или, если вы очень параноидальны в отношении дампов, храните уникальный случайный ключ в другом месте, например, я другой поток, в реестре, на вашем сервере и т. д.

2 голосов
/ 11 июня 2009

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

...