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ó.
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.