encryptie
Ormar biedt u een manier om alleen velden in uw database te versleutelen. De meegeleverde coderingsbackend maakt eenrichtingsversleuteling (HASH-backend) en tweewegsversleuteling / decodering (FERNET-backend) mogelijk.
!!!Let op: om codering te laten werken, moet u een optioneel coderingspakket installeren.
| Je kunt het handmatig `pip install cryptography` doen of met ormar door `pip install ormar[crypto]`
|
!!! Waarschuwing: door encrypt\ _ backend toe te voegen, wordt het kolomtype van de database gewijzigd in TEXT, wat moet worden weerspiegeld in db door migratie (alembic) of handmatige wijzigingen
Veldversleuteling definiëren
Om een veld te versleutelen, moet u ten minste de parameters encrypt\ _ secret en encrypt\ _ backend doorgeven.
1
2
3
4
5
6
7
8
9
10
11
12 | basis _ ormar _ config = ormar. OrmarConfig (
Metagegevens = metagegevens
Database = database
)
Klasse Filter (ormar. Model):
ormar _ config = basis _ ormar _ config kopie ()
Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
Naam: str = ormar. String (max _ length = 100,
encrypt _ secret = "geheim123",
versleutelen _ backend = ormar. VersleutelenBackends. FERNET)
|
!!!waarschuwt dat u alle veldtypen kunt versleutelen, behalve primaire\ _ sleutelkolommen en relationele reeksen (ForeignKey en ManyToMany). Controleer de backend-details voor meer informatie.
Beschikbare backend
hekje
HASH is een eenrichtings-hash (zoals een wachtwoord) die nooit wordt gedecodeerd wanneer deze wordt opgehaald
Om het in te stellen, geeft u de juiste backend-waarde door.
| ... # rest van modeldefinitie
Wachtwoord: str = ormar. String (max _ length = 128,
encrypt _ secret = "geheim123",
versleutelen _ backend = ormar. VersleutelenBackends. HASH)
|
Houd er rekening mee dat aangezien deze backend de opgeslagen waarde nooit zal decoderen, deze alleen van toepassing is op het stringveld. De gebruikte hash is een sha512 hash, dus de veldlengte moet > = 128 zijn.
Waarschuwing: in de HASH-backend kunt u filteren op de volledige waarde, maar filters zoals bevat werken niet omdat de gecodeerde waarden worden vergeleken
!!!Merk op dat de meegeleverde encrypt\ _ secret eerst zichzelf hashes en het als een salt gebruikt, dus je moet deze stap opnieuw maken om te vergelijken met de opgeslagen string. Order\ _ by werkt niet omdat het vergelijken van gecodeerde strings het onmogelijk maakt om betrouwbaar te sorteren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | Klasse Hasj (ormar. Model):
ormar _ config = basis _ ormar _ config (tabelnaam = "hashes")
Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
Naam: str = ormar. String (max _ length = 128,
coderen _ geheim = "udxc32",
versleutelen _ backend = ormar. VersleutelenBackends. HASH)
wacht op Hash (naam = 'test1') .save ()
# noteer de stappen om de opgeslagen waarde opnieuw te creëren
# u kunt ook een cryptografiepakket gebruiken in plaats van hashlib
Geheim = hashlib.sha256 ("udxc32" .encode ()) .digest ()
Geheim = base64.urlsafe _ b64encode (geheim)
hashed _ test1 = hashlib.sha512 (geheim + 'test1' .encode ()) .hexdigest ()
# volledige waardevergelijking werkt
Hash1 = wacht op Hash.objects.get (naam = 'test1')
hash1.name = = gehashte _ test1
# maar gedeeltelijke vergelijking niet (gehashte strings worden vergeleken)
Met pytest.verhogingen (NoMatch):
wacht op Filter.objects.get (name _ _ icontains = 'test')
|
Fenette
FERNET is een bidirectionele codering / decodering backend
Om het in te stellen, geeft u de juiste backend-waarde door.
| ... # rest van modeldefinitie
Jaar: int = ormar. Integer (encrypt _ secret = "secret123",
versleutelen _ backend = ormar. VersleutelenBackends. FERNET)
|
De waarde wordt gecodeerd op weg naar de database en gedecodeerd op weg naar buiten. Beschikbaar voor alle typen, omdat de retourwaarde wordt geparseerd naar het overeenkomstige Python-type.
!!! Waarschuwing Merk op dat u in de FERNET-backend de mogelijkheid om te filteren volledig verliest omdat een deel van de gecodeerde waarde een tijdstempel is. Hetzelfde geldt voor order\ _ by omdat de gecodeerde strings worden vergeleken, dus u kunt niet betrouwbaar sorteren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | Klasse Filter (ormar. Model):
ormar _ config = basis _ ormar _ config kopie ()
Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
Naam: str = ormar. String (max _ length = 100,
coderen _ geheim = "asd123",
versleutelen _ backend = ormar. VersleutelenBackends. FERNET)
Afwachten Filter (naam = 'test1') .save ()
Afwachten Filter (naam = 'test1') .save ()
# waarden zijn correct versleuteld en later gedecodeerd
Filters = wachten op Filter.objects.all ()
Filters bevestigen [0]. name = = filters [1]. naam = = 'test1'
# maar je kunt helemaal niet filteren omdat een deel van de fernet-hash een tijdstempel is
# wat betekent dat zelfs als je dezelfde string 2 keer codeert, het anders zal zijn
Met pytest.verhogingen (NoMatch):
wacht op Filter.objects.get (naam = 'test1')
|
aangepaste backend
Als u andere soorten encryptie (bijv. AES) wilt ondersteunen, kunt u uw eigen Encryption Backend aanbieden.
Om de backend in te stellen, hoeft u alleen maar de ormar.fields. EncryptBackend-klasse te subklassen en de vereiste backend op te geven.
Een voorbeeld van een virtuele backend (die niets doet) kan er als volgt uitzien:
| Klasse DummyBackend (ofmar.fields. EncryptBackend):
Def _ initialize _ backend (zelf, geheime _ sleutel: bytes) - > Geen:
Pas voor
Defs versleutelen (zelf, waarde: Elke) - > str:
Waarde teruggeven
Def decoderen (zelf, waarde: Elke) - > str:
Waarde teruggeven
|
Om deze backend te gebruiken, stelt u encrypt\ _ backend in op CUSTOM en geeft u uw backend als parameter op via encrypt\ _ custom\ _ backend.
| Klasse Filter (ormar. Model):
ormar _ config = basis _ ormar _ config kopie ()
Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
Naam: str = ormar. String (max _ length = 100,
encrypt _ secret = "geheim123",
encrypt _ backend = ormar. VersleutelenBackends. AANGEPAST,
encrypt _ custom _ backend=DummyBackend
)
|