Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Django, шифрование средствами СУБД, Как реализовать шифрование даных Мусклом 
V
    Опции темы
MastaK
Дата 6.12.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 16.10.2006

Репутация: нет
Всего: нет



Необходимо реализовать шифрование данных средствами СУБД (в данном случае MySQL). В джанго запросы выполняются через ОРМ и доступ непосредственно к синтаксису запроса (на сколько я понял) нет. Возможно ли это? Может существует какой-либо хук или ещё чего то?

ЗЫ Использование своих запросов без ОРМ не приемлемо.
PM MAIL ICQ   Вверх
Daevaorn
Дата 6.12.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 3
Всего: 70



Цитата(MastaK @  6.12.2010,  12:45 Найти цитируемый пост)
Необходимо реализовать шифрование данных средствами СУБД (в данном случае MySQL).

А как это выглядит?
PM MAIL WWW   Вверх
MastaK
Дата 6.12.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 16.10.2006

Репутация: нет
Всего: нет



Код

INSERT INTO t VALUES (1,AES_ENCRYPT('text',Qpassword)); 


PM MAIL ICQ   Вверх
MastaK
  Дата 6.12.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 16.10.2006

Репутация: нет
Всего: нет



Решение есть, может кому то пригодится. Для прозрачного шифрования средствами СУБД:
Код

class Employee(models.Model):
   social_security_number = models.CharField(max_length=32)

   def _get_ssn(self):
       cursor = connection.cursor()
       cursor.execute("SELECT AES_DECRYPT(UNHEX(social_security_number), %s) as ssn FROM tablename WHERE id=%s", [settings.SECRET_KEY, self.id])
       return cursor.fetchone()[0]

   def _set_ssn(self, ssn_value):
       cursor = connection.cursor()
       cursor.execute("SELECT HEX(AES_ENCRYPT(%s, %s)) as ssn", [ssn_value, settings.SECRET_KEY])
       self.social_security_number = cursor.fetchone()[0]

   ssn = property(_get_ssn, _set_ssn)


Результат работы этого скрипта:
Код

>>> from foo.bar.models import Employee
>>> p=Employee.objects.create(ssn='123-45-6789')
>>> p.ssn
'123-45-6789'

Код

mysql> select * from foo_employee;
+----+----------------------------------+
| id | social_security_number           |
+----+----------------------------------+
| 31 | 41DF2D946C9186BEF77DD3307B85CC8C |
+----+----------------------------------+
1 row in set (0.00 sec)


Добавлено через 2 минуты и 13 секунд
Средствами питона
Код

from django.db import models
from Crypto.Cipher import Blowfish
from django.conf import settings
import binascii

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    social_security_number = models.CharField(max_length=32)

    def _get_ssn(self):
        enc_obj = Blowfish.new( settings.SECRET_KEY )
        return u"%s" % enc_obj.decrypt( binascii.a2b_hex(self.social_security_number) ).rstrip()

    def _set_ssn(self, ssn_value):
        enc_obj = Blowfish.new( settings.SECRET_KEY )
        repeat = 8 - (len( ssn_value ) % 8)
        ssn_value = ssn_value + " " * repeat
        self.social_security_number = binascii.b2a_hex(enc_obj.encrypt( ssn_value ))

    ssn = property(_get_ssn, _set_ssn)

.....

# testing
>>> Person.objects.all().delete()
>>> p = Person.objects.create(first_name='Billy', last_name='Barou', ssn='123-12-1234')
>>> p.ssn
u'123-12-1234'

Код

$ mysql -e "SELECT * FROM django_sandbox.field_encryption_person"
#+----+------------+-----------+----------------------------------+
#| id | first_name | last_name | social_security_number           |
#+----+------------+-----------+----------------------------------+
#|  3 | Billy      | Barou     | 94ec660c832c95b31500618a5ffee60f | 
#+----+------------+-----------+----------------------------------+


Это сообщение отредактировал(а) MastaK - 6.12.2010, 21:41
PM MAIL ICQ   Вверх
duh386
Дата 21.1.2013, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.10.2011

Репутация: нет
Всего: нет



Хм, а как будет работать такое решение со всякими ORM-фильтрами, сортировкой, exclude и т.д.? Что то мне кажется оно применимо только в виде:
Код

emp = Employee()
emp.ssn = 'abc'
emp.save()


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Веб-разработка и фреймворки | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.