2013-05-28 2 views
0

Я должен хранить некоторую конфиденциальную информацию в своей базе данных, используя Django.Как хранить конфиденциальную информацию, которая должна использоваться для разных пользователей?

У меня есть модель Client, и у каждого клиента есть куча SocialAccounts (twitter, fb и т. Д.) С URL-адресом, клиентом и паролем.

Учитывая, что ВСЕ пользователи, принадлежащие к группе «Администратор», должны иметь возможность видеть пароли. Каков безопасный способ хранения этих паролей в базе данных?

+2

Посмотрите на: https://github.com/felixsan/django-encrypted-fields – Brandon

+1

@Brandon сделайте это ответом. Это хороший подход – karthikr

ответ

2

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

+0

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

+0

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

0

Почему вы не пытаетесь зашифровать требуемое поле с помощью соленого хэш-метода?

from hashlib import sha512 
salt = "thisissecret" 
password = sha512("client password" + salt).hexdigest() 

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

Надеюсь, это полезно.

+0

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

+0

Я бы сделал какую-то трюк, создаю другую группу пользователей и использую имя группы в качестве соли, затем выбираю имя группы пользователей, если этот пользователь находится в этой конкретной группе пользователей, тогда должна быть возможность просмотра пароля (как и в хром сохраненный пароль) .. его будет немного запутанным, но это должно сделать для вас работу. – abhishekgarg

6

Так видимо Джанго-расширения имеет two fields for this very purpose:

  • EncryptedCharField - CharField, который прозрачно шифрует свое значение, как она идет в и из базы данных. Шифрование обрабатывается Keyczar. Чтобы использовать это поле, вы должны установить Keyczar, чтобы сгенерировал первичный ключ шифрования и установил параметры. KEYS_DIR установил для полный путь к вашей директории ключей.
  • EncryptedTextField - CharField, который прозрачно шифрует свое значение по мере его поступления и выхода из базы данных. Шифрование обрабатывается Keyczar. Чтобы использовать это поле, вы должны установить Keyczar, чтобы сгенерировал первичный ключ шифрования и установил параметры. KEYS_DIR установил для полный путь к вашей директории ключей.

Поэтому в основном я должен был установить (1) keyczar и его зависимостей для Python:

pip install https://keyczar.googlecode.com/files/python-keyczar-0.71c.tar.gz 
pip install pycrypto 
pip install pyasn1 

(если у вас нет еще, ... установить Джанго-расширений тоже)

(2) создать каталог, в котором вы будете хранить свои ключи и создать ключи:.

mkdir keys 
python path/to/keyczart.py create --location='keys' --purpose='crypt' --name='whatever_name' 
python path/to/keyczart.py addkey --location='keys' --status='primary' 

(3) Добавьте каталог в свои settings.py в ENCRYPTED_FIELD_KEYS_DIR.

и, наконец, (4) добавить EncryptedCharField или EncrytedTextField к модели:

from django_extensions.db.fields.encrypted import EncryptedCharField 

class SocialAccount(models.Model): 
    platform = models.ForeignKey(SocialPlatformType, 
           related_name='platforms') 
    url = models.URLField('Account url', unique=True, 
          null=True, blank=True) 
    password = EncryptedCharField(null=True, blank=True, max_length=255) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    def __unicode__(self): 
     return self.url 

Я надеюсь, что кто-то считает, что это полезно.

+0

С сентября 2017 года библиотека 'keyczar' не поддерживает Python3. И я отказался быстро исправить свою вилку для этого. – baldr

Смежные вопросы