Com encriptar una Base de Dades amb Django

Enviat per Victor Gonzalez el Dj, 28/09/2017 - 09:38
Django image

Introducció

Els sistemes informàtics actuals guarden molta informació privada o sensible que s’ha de protegir. Hi ha diverses formes de fer-ho, com per exemple, afegir contrasenyes  o pins abans d’accedir a la informació. En canvi, això pot no ser suficient, i és que en cas que s’aconsegueixi saber la contrasenya o el pin, es pot veure tota la informació.
Per això, en aquest article, s’explicarà una forma d’encriptar una Base de Dades (amb el web framework Django) perquè en cas que s’aconsegueixi accedir a la informació, no es pugui comprendre. 

Instal·lació

El primer pas és instal·lar la llibreria a l’entorn virtual de Python amb la següent comanda:

pip install django-encrypted-model-fields

A continuació s’ha d’afegir ‘encrypted_model_fields’ a les aplicacions instal·lades del settings.py de Django:

INSTALLED_APPS = [
     …, 
     'encrypted_model_fields'
] 

Aquesta aplicació utilitza una clau per a encriptar i desencriptar les dades. Per a generar claus vàlides, la llibreria proporciona una comanda al manage.py de Django. La comanda és la següent:

./manage.py generate_encryption_key 

Aquesta comanda mostrarà la clau per el terminal. S’ha d’afegir al settings.py com es mostra a continuació:

FIELD_ENCRYPTION_KEY = 'clau_privada'

Tutorial

Un cop finalitzada la instal·lació és hora de crear els models que es transformaran en taules a la Base de Dades. Seguint l’exemple proposat per Manuel Alba en el seu article Django API REST, farem una base de dades de jugadors i equips de futbol.

Com hi haurà un camp que l’encriptarem s’ha d’incloure la llibreria al models.py:

 from encrypted_model_fields import fields

Uns possibles models són els següents, on per a cada equip es guarda el seu nom i l’estadi i per a cada jugador, el seu nom, DNI, edat i per a quin equip juguen.

class Team(models.Model): 
Name = models.CharField(max_length=50) 
Stadium = models.CharField(max_length=50) 

class Player(models.Model): 
Name = models.CharField(max_length=50) 
IdentityCard = fields.EncryptedCharField(max_length=50) 
Age = models.IntegerField() 
Team = models.ForeignKey(Team, null=True)

Com es pot observar, els camps sense encriptar utilitzen la llibreria ‘models’ de Django i el DNI utilitza un camp encriptat de la llibreria que hem instal·lat.

Quan ja s’han dissenyat els models és hora de migrar-los a la BD, amb Django es necessiten dos passos. El primer, genera un fitxer amb els canvis que s’han de fer a la BD respecte a els canvis fets als models, i el segon, efectua aquests canvis. Les instruccions són les següents:

python manage.py makemigrations
python manage.py migrate

Resultats

Un cop feta la migració, podem observar com es creen dues taules a la BD.

A continuació es mostra un exemple de la BD amb dos equips i dos jugadors on es pot apreciar que el DNI està encriptat:

En canvi, quan estem programant amb Django no es nota la diferència entre un camp encriptat i un normal, com a mostra el següent codi en una consola de Python:

from app.models import Player
players = Player.objects.all()
for player in players:
print(player.Name + ':' + player.IdentityCard)
Messi::12345678a
Cristiano::12345678b 

Per acabar

Podeu ampliar la informació a la documentació oficial de Django https://docs.djangoproject.com/en/1.11/  i  al github de la llibreria https://github.com/lanshark/django-encrypted-model-fields.

Segueix-nos a

Els nostres articles del bloc d'inLab FIB

         
         

inLab FIB incorpora esCert

Icona ESCERT

inLab és membre de