Lewati ke isi

enkripsi

Ormar memberi Anda cara untuk mengenkripsi hanya bidang dalam database Anda. Backend enkripsi yang disediakan memungkinkan enkripsi satu arah (HASH backend) serta enkripsi / dekripsi dua arah (FERNET backend).

!!!Peringatan, harap dicatat bahwa agar enkripsi berfungsi, Anda perlu menginstal paket enkripsi opsional.

1
Anda dapat melakukannya secara manual `pip install cryptography` Atau dengan ormar oleh `pip install ormar[crypto]`

!!! Peringatan: Menambahkan enkripsi\ _ backend mengubah jenis kolom database menjadi TEXT, yang perlu tercermin dalam db melalui migrasi (alembic) atau perubahan manual

Tentukan enkripsi bidang

Untuk mengenkripsi suatu bidang, Anda harus lulus setidaknya parameter enkripsi\ _ rahasia dan enkripsi\ _ backend.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
base _ ormar _ config = ormar. OrmarConfig (
    Metadata = metadata
    Basis data = basis data
)

Filter Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100,
                             enkripsi _ secret = "secret123,"
                             Enkripsi _ backend = ormar. Enkripsi Backends. FERNET)

!!!memperingatkan bahwa Anda dapat mengenkripsi semua jenis bidang kecuali kolom\ _ kunci utama dan seri relasional (ForeignKey dan ManyToMany). Periksa detail backend untuk informasi lebih lanjut.

Dukungan yang tersedia

hash

HASH adalah hash satu arah (seperti kata sandi) yang tidak pernah didekripsi saat diambil

Untuk mengaturnya, berikan nilai backend yang sesuai.

1
2
3
4
... # sisa definisi model
Kata sandi: str = ormar. String (max _ length = 128,
                         enkripsi _ secret = "secret123,"
                         Enkripsi _ backend = ormar. EncryptBackends. HASH)

Harap dicatat bahwa karena backend ini tidak akan pernah mendekripsi nilai yang tersimpan, itu hanya berlaku untuk bidang string. Hash yang digunakan adalah hash sha512, jadi panjang field harus > = 128.

Peringatan: Dalam backend HASH, Anda dapat memfilter dengan nilai penuh, tetapi filter seperti mengandung tidak akan berfungsi karena nilai terenkripsi dibandingkan

!!!Perhatikan bahwa enkripsi\ _ rahasia pertama hashes sendiri dan menggunakannya sebagai garam, jadi Anda perlu membuat ulang langkah ini untuk membandingkan dengan string yang disimpan. Order\ _ by tidak akan berfungsi karena membandingkan string terenkripsi membuat Anda tidak mungkin menyortir dengan andal.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Kelas Hash (ormar. Model):
    ormar _ config = base _ ormar _ config (tablename = "hashes")

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 128,
                             enkripsi _ secret = "udxc32,"
                             Enkripsi _ backend = ormar. EncryptBackends. HASH)


Menunggu Hash (nama = 'test1').simpan ()

# perhatikan langkah-langkah untuk membuat ulang nilai yang tersimpan
# Anda juga dapat menggunakan paket kriptografi alih-alih hashlib
Rahasia = hashlib.sha256 ("udxc32" .encode ()).digest ()
Rahasia = base64.urlsafe _ b64encode (rahasia)
hashed _ test1 = hashlib.sha512 (secret + 'test1' .encode ()).hexdigest ()

# kerja perbandingan nilai penuh
Hash1 = menunggu Hash.objeks.get (nama = 'test1')
Tegaskan hash1.name = = hashed _ test1

# tetapi perbandingan parsial tidak (string hashed dibandingkan)
Dengan pytest.raises (NoMatch):
    await Filter.objeks.get (nama _ _ icontains = 'tes')

Fenette

FERNET adalah backend enkripsi / dekripsi dua arah

Untuk mengaturnya, berikan nilai backend yang sesuai.

1
2
3
... # sisa definisi model
Tahun: int = ormar. Integer (enkripsi _ secret = "secret123,"
                          Enkripsi _ backend = ormar. Enkripsi Backends. FERNET)

Nilai dienkripsi dalam perjalanan ke database dan didekripsi dalam perjalanan keluar. Tersedia untuk semua jenis, karena nilai pengembalian diurai ke jenis Python yang sesuai.

!!! Peringatan Perhatikan bahwa di backend FERNET, Anda benar-benar kehilangan kemungkinan penyaringan karena bagian dari nilai terenkripsi adalah stempel waktu. Hal yang sama berlaku untuk pesanan\ _ by karena string terenkripsi dibandingkan, jadi Anda tidak dapat mengurutkan dengan andal.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Filter Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100,
                             enkripsi _ secret = "asd123,"
                             Enkripsi _ backend = ormar. Enkripsi Backends. FERNET)

Menunggu Filter (nama = 'test1').simpan ()
Menunggu Filter (nama = 'test1').simpan ()

# nilai dienkripsi dengan benar dan kemudian didekripsi
Filter = menunggu Filter. Objek. Semua ()
Tegaskan filter [0]. nama = = filter [1]. nama = = 'test1'

# tetapi Anda tidak dapat memfilter sama sekali karena bagian dari hash fernet adalah stempel waktu
# yang berarti bahwa bahkan jika Anda mengenkripsi string yang sama 2 kali itu akan berbeda
Dengan pytest.raises (NoMatch):
    Menunggu Filter.objeks.get (nama = 'test1')

backend kustom

Jika Anda ingin mendukung jenis enkripsi lain (yaitu AES), Anda dapat menyediakan Backend Enkripsi Anda sendiri.

Untuk mengatur backend, yang perlu Anda lakukan hanyalah subkelas ormar.fields. kelas EncryptBackend dan memberikan backend yang diperlukan.

Contoh backend virtual (yang tidak melakukan apa-apa) mungkin terlihat seperti ini:

1
2
3
4
5
6
7
8
9
Kelas DummyBackend (ormar.fields. EncryptBackend):
    Def _ initialize _ backend (diri, secret _ key: bytes) - > Tidak ada:
        Lulus

    Defs enkripsi (diri, nilai: Any) - > str:
        Nilai pengembalian

    Def mendekripsi (diri, nilai: Apa saja) - > str:
        Nilai pengembalian

Untuk menggunakan backend ini, setel enkripsi\ _ backend ke CUSTOM dan berikan backend Anda sebagai parameter melalui enkripsi\ _ custom\ _ backend.

1
2
3
4
5
6
7
8
9
Filter Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100,
                             enkripsi _ secret = "secret123,"
                             enkripsi _ backend = ormar. Enkripsi Backends. KUSTOM,
                             Enkripsi _ kustom _ backend=DummyBackend
                             )