विषय पर बढ़ें

एन्क्रिप्शन

mar आपको अपने डेटाबेस में केवल फ़ील्ड एन्क्रिप्ट करने का एक तरीका प्रदान करता है। प्रदान किया गया एन्क्रिप्शन बैकएंड एक-तरफ़ा एन्क्रिप्शन के लिए अनुमति देता है (HASH backend) साथ ही दो-तरफ़ा एन्क्रिप्शन / डिक्रिप्शन (FERNET backend).

!!!चेतावनी, कृपया ध्यान दें कि काम करने के लिए एन्क्रिप्शन के लिए क्रमबद्ध करना में, आपको एक वैकल्पिक एन्क्रिप्शन पैकेज स्थापित करने की आवश्यकता है।

1
आप इसे मैन्युअल रूप से कर सकते हैं `pip install cryptography` या ormar के साथ `pip install ormar[crypto]`

!!! चेतावनी: एन्क्रिप्ट \ _ बैकएंड जोड़ने से डेटाबेस कॉलम प्रकार TEमें बदल जाता है, जिसे माइग्रेशन (एलेम्बिक) या मैनुअल परिवर्तनों के माध्यम से db में परिलक्षित करने की आवश्यकता होती है

क्षेत्र एन्क्रिप्शन परिभाषित करें

किसी फ़ील्ड को एन्क्रिप्ट करने के लिए, आपको कम से कम एन्क्रिप्ट \ _ गुप्त और एन्क्रिप्ट \ _ बैकएंड मापदंडों को पास करना होगा।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
base_ormar_config = ormar। marConfig (
    मेटाडेटा = मेटाडेटा
    डेटाबेस = डेटाबेस
)

कक्षा फ़िल्टर (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100,
                             एन्क्रिप्ट _ गुप्त = "secret123",
                             एन्क्रिप्ट _ बैकएंड = ormar। EncryptBackends। FERNET)

!!!चेतावनी आप प्राथमिक \ _ कुंजी स्तंभों और संबंधपरक श्रृंखला (ForeignKey and ManyToMany) को छोड़कर सभी फ़ील्ड प्रकारों को एन्क्रिप्ट कर सकते हैं। अधिक जानकारी के लिए बैकएंड विवरण देखें।

उपलब्ध बैकएंड

हैश

HASH एक तरफ़ा हैश है (like a password) पुनर्प्राप्त होने पर इसे कभी डिक्रिप्ट नहीं किया जाता है

इसे सेट करने के लिए, उपयुक्त बैकएंड मान पास करें।

1
2
3
4
... # बाकी नमूना परिभाषा
पासवर्ड: str = ormar। स्ट्रिंग (max_length=128,
                         एन्क्रिप्ट _ गुप्त = "secret123",
                         एन्क्रिप्ट _ बैकएंड = ormar। EncryptBackends। HASH)

कृपया ध्यान दें कि चूंकि यह बैकएंड कभी भी संग्रहीत मान को डिक्रिप्ट नहीं करेगा, यह केवल स्ट्रिंग फ़ील्ड पर लागू होता है। उपयोग किया गया हैश एक sha512 हैश है, इसलिए फ़ील्ड की लंबाई> = 128 होनी चाहिए।

चेतावनी: HASH बैकएंड में, आप पूर्ण मान से फ़िल्टर कर सकते हैं, लेकिन इसमें शामिल फ़िल्टर काम नहीं करेंगे क्योंकि एन्क्रिप्टेड मानों की तुलना की जाती है

!!!ध्यान दें कि प्रदान किया गया एन्क्रिप्ट \ _ गुप्त पहले खुद को हैश करता है और इसे नमक के रूप में उपयोग करता है, इसलिए आपको संग्रहीत स्ट्रिंग के साथ तुलना करने के लिए क्रमबद्ध करना में इस चरण को फिर से बनाने की आवश्यकता है। ऑर्डर \ _ by काम नहीं करेगा क्योंकि एन्क्रिप्टेड स्ट्रिंग्स की तुलना करना आपके लिए मज़बूती से सॉर्ट करना असंभव बनाता है।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
क्लास हैश (ormar. Model):
    ormar_config = आधार_ormar_config (tablename = "hashes")

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 128,
                             एन्क्रिप्ट _ गुप्त = "udxc32",
                             एन्क्रिप्ट _ बैकएंड = ormar। EncryptBackends। HASH)


हैश का इंतजार करें (name = 'test1').सहेजें ()

# संग्रहीत मान को फिर से बनाने के लिए चरणों पर ध्यान दें
# आप हैशलिब के बजाय क्रिप्टोग्राफी पैकेज का भी उपयोग कर सकते हैं
गुप्त = hashlib.sha256 ("udxc32" .encode ()).पचाना ()
गुप्त = base64.urlsafe_b64encode (secret)
hashed_test1 = hashlib.sha512 (secret + 'test1'.encode ()).hex()

# पूर्ण मूल्य तुलना कार्य करता है
1 = .का इंतजार करें (name = 'test1')
hash1.name करें

# लेकिन आंशिक तुलना नहीं करता है (हैशेड स्ट्रिंग्स की तुलना की जाती है)
py.के साथ (NoMatch):
    फ़िल्टर का इंतजार करें। (name__icontains = 'test')

फेनेट

FERNET एक दो-तरफ़ा एन्क्रिप्शन / डिक्रिप्शन बैकएंड है

इसे सेट करने के लिए, उपयुक्त बैकएंड मान पास करें।

1
2
3
... # बाकी नमूना परिभाषा
वर्ष: int = ormar। पूर्णांक (encript_secret = "secret123",
                          एन्क्रिप्ट _ बैकएंड = ormar। EncryptBackends। FERNET)

मान डेटाबेस के लिए अपने रास्ते पर एन्क्रिप्ट किया गया है और इसके रास्ते पर डिक्रिप्ट किया गया है। सभी प्रकार के लिए उपलब्ध है, क्योंकि रिटर्न मान संबंधित पायथन प्रकार के लिए पार्स किया गया है।

!!! चेतावनी ध्यान दें कि FERNET बैकएंड में, आप पूरी तरह से फ़िल्टरिंग की संभावना खो देते हैं क्योंकि एन्क्रिप्टेड मान का हिस्सा टाइमस्टैम्प है। वही क्रमबद्ध करना के लिए जाता है क्योंकि एन्क्रिप्टेड स्ट्रिंग्स की तुलना की जाती है, इसलिए आप मज़बूती से सॉर्ट नहीं कर सकते।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
कक्षा फ़िल्टर (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100,
                             एन्क्रिप्ट _ गुप्त = "asd123",
                             एन्क्रिप्ट _ बैकएंड = ormar। EncryptBackends। FERNET)

प्रतीक्षा फ़िल्टर (name = 'test1').सहेजें ()
प्रतीक्षा फ़िल्टर (name = 'test1').सहेजें ()

#values ठीक से एन्क्रिप्ट किए गए हैं और बाद में डिक्रिप्ट किए गए हैं
फ़िल्टर = फ़िल्टर का इंतजार करें।
फ़िल्टर डालें [0]। नाम = = फ़िल्टर [1] । नाम = = 'test1'

# लेकिन आप बिल्कुल भी फ़िल्टर नहीं कर सकते क्योंकि फर्नेट हैश का हिस्सा एक टाइमस्टैम्प है
# जो माध्य कि भले ही आप एक ही स्ट्रिंग को 2 बार एन्क्रिप्ट करें यह अलग होगा
py.के साथ (NoMatch):
    फ़िल्टर का इंतजार करें (name = 'test1')

कस्टम बैकएंड

यदि आप अन्य प्रकार के एन्क्रिप्शन का समर्थन करना चाहते हैं (i.e. AES), आप अपना स्वयं का एन्क्रिप्शन बैकएंड प्रदान कर सकते हैं।

बैकएंड सेट करने के लिए, आपको बस ormar.ds को उपवर्ग करना होगा। Entend वर्ग और आवश्यक बैकएंड प्रदान करें।

एक उदाहरण वर्चुअल बैकएंड (which does nothing) mइस तरह देखो:

1
2
3
4
5
6
7
8
9
क्लास डमीबैकेंड (ormar.fields. EncryptBackend):
    Def_initialize_backend (self, secret_key: bytes) -> कोई नहीं:
        पास

    एन्क्रिप्ट को परिभाषित करता है (self, value: Any) - > str:
        वापसी मान

    डिफ डिक्रिप्ट (self, value: Any) - > str:
        वापसी मान

इस बैकएंड का उपयोग करने के लिए, CUSTOM पर \ _ बैकएंड सेट करें और एन्क्रिप्ट \ _ कस्टम \ _ बैकएंड के माध्यम से एक पैरामीटर के रूप में अपना बैकएंड प्रदान करें।

1
2
3
4
5
6
7
8
9
कक्षा फ़िल्टर (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100,
                             एन्क्रिप्ट _ गुप्त = "secret123",
                             एन्क्रिप्ट _ बैकएंड = ormar। EncryptBackends। कस्टम,
                             एन्क्रिप्ट _ कस्टम _ backend=DummyBackend
                             )