Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Веб-разработка и фреймворки > Django, шифрование средствами СУБД


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

ЗЫ Использование своих запросов без ОРМ не приемлемо.

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

А как это выглядит?

Автор: MastaK 6.12.2010, 11:56
Код

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


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

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 | 
#+----+------------+-----------+----------------------------------+

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

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)