Шифрование поля django (не пароля)
У меня есть сайт электронной коммерции, сделанный на django, и я хочу хранить детали заказов. Поля должны содержать id, купленную вещь, количество, общую цену и т.д. Сейчас они хранятся только в виде обычного текста, поэтому я хочу сделать их более безопасными. Хеширование не подходит, потому что я хочу иметь возможность читать данные. Я думал о шифровании, но есть ли другой способ? Если нет, то у меня есть несколько вопросов, Как безопасно зашифровать и расшифровать данные? Где и как хранить ключ шифрования? Будет ли только один главный ключ?
Любая помощь приветствуется!
Вот мое решение для шифрования полей модели Django вы должны создать класс EncodedChar и использовать его следующим образом:
from utils.char_encoder import EncodedChar
password = EncodedChar(null=False, blank=False, max_length=256, verbose_name=_('Merchant Password'))
и мой файл utils.char_encoder будет иметь вид:
from django.db import models
import base64
import os
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from django.conf import settings
class EncodedChar(models.CharField):
salt = bytes(settings.SECURE_STRING_SALT, 'utf-8')
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=100000,
)
key = base64.urlsafe_b64encode(kdf.derive(bytes(settings.SECRET_KEY,'utf-8')))
f = Fernet(key)
def decrypt_value(self, value):
value = str(self.f.decrypt(bytes(value, 'cp1252')), encoding='utf-8')
return value
def get_prep_value(self, value):
value = str(self.f.encrypt(bytes(value, 'utf-8')), 'cp1252')
return value
Как вы видите, я использую криптографию для кодирования и декодирования поля CharField, а PBKDF2HMAC - это тот же алгоритм хэширования, который используется в Django для хэширования пароля. Вы можете использовать любой другой алгоритм в зависимости от ваших требований.