Vorname wird nur verschlüsselt angezeigt.
Verfasst: Donnerstag 11. Dezember 2025, 20:11
Hallo liebes Forum,
ich drehe mich irgend wie im Kreis. Egal was ich probiere egal was ich mache immer nur verschlüsselt.
Vielleicht kann mir ja jemand weiter helfen, danke.
Also das Verschlüssel und Endschlüsseln an sich funktioniert.
Es scheint als wenn Django hier was verschluckt, aber ich komme nicht drauf.
Auf der postgre Datenbank ist die Spalte "iv" ein bytea
Mein model.py:
meine fields.py:
meine views.py:
Bei "print(tp.vorname)" wird der verschlüsselte Wert angezeigt und nicht z.b. "Tim".
Das gleiche auch in der html:
ich drehe mich irgend wie im Kreis. Egal was ich probiere egal was ich mache immer nur verschlüsselt.
Vielleicht kann mir ja jemand weiter helfen, danke.
Also das Verschlüssel und Endschlüsseln an sich funktioniert.
Es scheint als wenn Django hier was verschluckt, aber ich komme nicht drauf.
Auf der postgre Datenbank ist die Spalte "iv" ein bytea
Mein model.py:
Code: Alles auswählen
class Testperson(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_column="id")
vorname = EncryptedCharField(max_length=512, db_column="vorname", iv_field="iv")
nachname = EncryptedCharField(max_length=512, db_column="nachname", iv_field="iv")
iv = models.BinaryField(null=False, blank=True, db_column="iv")
Code: Alles auswählen
# core/fields.py
import os
from django.db import models
from core.crypto import encrypt_value, decrypt_value
class EncryptedCharField(models.CharField):
"""
CharField, das automatisch verschlüsselt/entschlüsselt.
IV wird pro Zeile aus einer BinaryField-Spalte geholt.
"""
def __init__(self, *args, iv_field="iv", **kwargs):
self.iv_field = iv_field
super().__init__(*args, **kwargs)
def _get_iv(self, instance):
iv = getattr(instance, self.iv_field, None)
if isinstance(iv, memoryview):
iv = iv.tobytes()
if iv is None or len(iv) != 16:
raise ValueError(f"IV fehlt oder ist ungültig für {self.attname}")
return iv
def _create_iv_if_missing(self, instance):
iv = getattr(instance, self.iv_field, None)
if not iv or len(iv) != 16:
iv = os.urandom(16)
setattr(instance, self.iv_field, iv)
return iv
# Verschlüsseln beim Speichern
def pre_save(self, instance, add):
value = instance.__dict__.get(self.attname)
if value is None:
return value
iv = self._create_iv_if_missing(instance)
encrypted = encrypt_value(value, iv)
instance.__dict__[self.attname] = encrypted
return encrypted
# Vom DB-Wert in das Feld laden (unverändert)
def from_db_value(self, value, expression, connection):
return value
# Zugriff auf das Feld: automatisch entschlüsseln
def __get__(self, instance, owner):
if instance is None:
return self
encrypted_value = instance.__dict__.get(self.attname)
if encrypted_value is None:
return None
try:
iv = self._get_iv(instance)
# nur hex entschlüsseln, andere Werte direkt zurückgeben
int(encrypted_value, 16)
return decrypt_value(encrypted_value, iv)
except (ValueError, AttributeError):
return encrypted_value
# Setzen des Wertes: automatisch verschlüsseln
def __set__(self, instance, value):
iv = self._create_iv_if_missing(instance)
encrypted = encrypt_value(value, iv)
instance.__dict__[self.attname] = encrypted
Code: Alles auswählen
@Testperson_required
def dashboard(request):
user_id = request.session.get("user_id")
tp = Testperson.objects.get(id=user_id)
print(tp.vorname)
return render(request, "core/dashboard.html", {
"benutzer": tp
})
Das gleiche auch in der html:
Code: Alles auswählen
<strong>Willkommen, {{ benutzer.vorname }} {{ benutzer.nachname }}!</strong>