Django 2.1 - Password management in Django

Django में पासवर्ड प्रबंधन




django

Django में पासवर्ड प्रबंधन

पासवर्ड प्रबंधन एक ऐसी चीज है जिसे आम तौर पर अनावश्यक रूप से पुनर्निवेशित नहीं किया जाना चाहिए, और उपयोगकर्ता पासवर्ड के प्रबंधन के लिए टूलो का एक सुरक्षित और लचीला सेट प्रदान करने के लिए Django प्रयासों का प्रयास करता है। यह दस्तावेज़ बताता है कि Django पासवर्ड कैसे संग्रहीत करता है, भंडारण हैशिंग को कैसे कॉन्फ़िगर किया जा सकता है, और कुछ उपयोगिताएँ हैशेड पासवर्ड के साथ काम करने के लिए।

यह भी देखें

भले ही उपयोगकर्ता मजबूत पासवर्ड का उपयोग कर सकते हैं, हमलावर अपने कनेक्शन पर छिपकर बात करने में सक्षम हो सकते हैं। सादे HTTP कनेक्शन पर पासवर्ड (या किसी अन्य संवेदनशील डेटा) भेजने से बचने के लिए HTTPS का उपयोग करें क्योंकि वे पासवर्ड सूँघने के लिए असुरक्षित होंगे।

कैसे Django पासवर्ड संग्रहीत करता है

Django एक लचीला पासवर्ड स्टोरेज सिस्टम प्रदान करता है और डिफ़ॉल्ट रूप से PBKDF2 का उपयोग करता है।

User ऑब्जेक्ट का password विशेषता इस प्रारूप में एक स्ट्रिंग है:

<algorithm>$<iterations>$<salt>$<hash>

वे उपयोगकर्ता के पासवर्ड को संग्रहीत करने के लिए उपयोग किए जाने वाले घटक हैं, डॉलर-साइन वर्ण द्वारा अलग किए गए हैं और इसमें शामिल हैं: हैशिंग एल्गोरिथ्म, एल्गोरिथ्म पुनरावृत्तियों (कार्य कारक) की संख्या, यादृच्छिक नमक और परिणामस्वरूप पासवर्ड हैश। एल्गोरिथ्म कई तरह से एक हैशिंग या पासवर्ड स्टोरेज एल्गोरिदम में से एक है जो Django उपयोग कर सकता है; निचे देखो। एल्गोरिथ्म हैश पर एल्गोरिथ्म चलाने की संख्या का वर्णन करता है। नमक का उपयोग किया जाने वाला यादृच्छिक बीज है और हैश एक तरफ़ा फ़ंक्शन का परिणाम है।

डिफ़ॉल्ट रूप से, Django एक SHA256 हैश के साथ PBKDF2 एल्गोरिथ्म का उपयोग करता है, जो NIST द्वारा अनुशंसित एक पासवर्ड स्ट्रेचिंग तंत्र है। यह अधिकांश उपयोगकर्ताओं के लिए पर्याप्त होना चाहिए: यह काफी सुरक्षित है, इसके लिए भारी मात्रा में कंप्यूटिंग समय की आवश्यकता होती है।

हालाँकि, अपनी आवश्यकताओं के आधार पर, आप एक अलग एल्गोरिथ्म चुन सकते हैं, या अपनी विशिष्ट सुरक्षा स्थिति से मिलान करने के लिए एक कस्टम एल्गोरिथ्म का भी उपयोग कर सकते हैं। फिर से, अधिकांश उपयोगकर्ताओं को ऐसा करने की आवश्यकता नहीं होनी चाहिए - यदि आपको यकीन नहीं है, तो आप शायद नहीं। यदि आप करते हैं, तो कृपया इस पर पढ़ें:

Django PASSWORD_HASHERS सेटिंग से परामर्श करके उपयोग करने के लिए एल्गोरिदम का चयन करता है। यह हैशिंग एल्गोरिथ्म वर्गों की एक सूची है जो इस Django स्थापना का समर्थन करता है। इस सूची में पहली प्रविष्टि (जो है, settings.PASSWORD_HASHERS[0] ) का उपयोग पासवर्डों को संग्रहीत करने के लिए किया जाएगा, और अन्य सभी प्रविष्टियाँ मान्य हैशर्स हैं जिनका उपयोग मौजूदा पासवर्डों की जाँच के लिए किया जा सकता है। इसका मतलब है कि यदि आप एक अलग एल्गोरिथ्म का उपयोग करना चाहते हैं, तो आपको सूची में सबसे पहले अपने पसंदीदा एल्गोरिदम को सूचीबद्ध करने के लिए PASSWORD_HASHERS को संशोधित करना होगा।

PASSWORD_HASHERS लिए डिफ़ॉल्ट है:

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]

इसका मतलब है कि Django सभी पासवर्ड को स्टोर करने के लिए PBKDF2 का उपयोग करेगा, लेकिन PBKDF2SHA1, argon2 , और bcrypt साथ संग्रहीत पासवर्ड की जांच करने में सहायता करेगा।

अगले कुछ खंडों में कुछ सामान्य तरीकों का वर्णन किया गया है जो उन्नत उपयोगकर्ता इस सेटिंग को संशोधित करना चाहते हैं।

Django के साथ आर्गन 2 का उपयोग करना

argon2 2015 पासवर्ड हाशिंग प्रतियोगिता का विजेता है, एक समुदाय ने अगली पीढ़ी के हैशिंग एल्गोरिदम का चयन करने के लिए खुली प्रतियोगिता का आयोजन किया। यह कस्टम हार्डवेयर पर गणना करने में आसान नहीं होने की तुलना में साधारण सीपीयू पर गणना करने के लिए डिज़ाइन किया गया है।

argon2 Django के लिए डिफ़ॉल्ट नहीं है क्योंकि इसके लिए तीसरे पक्ष के पुस्तकालय की आवश्यकता होती है। पासवर्ड हैशिंग प्रतियोगिता पैनल, हालांकि, Django द्वारा समर्थित अन्य एल्गोरिदम के बजाय आर्गन 2 के तत्काल उपयोग की सिफारिश करता है।

अपने डिफ़ॉल्ट भंडारण एल्गोरिथ्म के रूप में आर्गन 2 का उपयोग करने के लिए, निम्नलिखित करें:

  1. आर्गन 2-cffi लाइब्रेरी स्थापित करें। यह pip install django[argon2] को चलाकर किया जा सकता है, जो pip install argon2-cffi (Django के setup.py से किसी भी संस्करण की आवश्यकता के साथ) के बराबर है।
  2. Argon2PasswordHasher पहले सूचीबद्ध करने के लिए PASSWORD_HASHERS संशोधित करें। अर्थात्, आपकी सेटिंग फ़ाइल में, आप डालेंगे:

    PASSWORD_HASHERS = [
        'django.contrib.auth.hashers.Argon2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    ]
    

    यदि आपको पासवर्ड अपग्रेड करने के लिए Django की आवश्यकता है, तो इस सूची में कोई प्रविष्टि रखें या / जोड़ें।

Django के साथ bcrypt का उपयोग करना

bcrypt एक लोकप्रिय पासवर्ड भंडारण एल्गोरिथ्म है जो विशेष रूप से दीर्घकालिक पासवर्ड भंडारण के लिए डिज़ाइन किया गया है। यह Django द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट नहीं है क्योंकि इसमें तीसरे पक्ष के पुस्तकालयों के उपयोग की आवश्यकता होती है, लेकिन चूंकि बहुत से लोग इसका उपयोग करना चाहते हैं, इसलिए Django न्यूनतम प्रयास के साथ bcrypt का समर्थन करता है।

अपने डिफ़ॉल्ट भंडारण एल्गोरिथ्म के रूप में Bcrypt का उपयोग करने के लिए, निम्नलिखित करें:

  1. Bcrypt पुस्तकालय स्थापित करें। यह pip install django[bcrypt] चलाकर किया जा सकता है, जो pip install bcrypt (Django के setup.py से किसी भी संस्करण की आवश्यकता के साथ) के बराबर है।
  2. पहले BCryptSHA256PasswordHasher को सूचीबद्ध करने के लिए PASSWORD_HASHERS संशोधित करें। अर्थात्, आपकी सेटिंग फ़ाइल में, आप डालेंगे:

    PASSWORD_HASHERS = [
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.Argon2PasswordHasher',
    ]
    

    यदि आपको पासवर्ड अपग्रेड करने के लिए Django की आवश्यकता है, तो इस सूची में कोई प्रविष्टि रखें या / जोड़ें।

बस यही है - अब आपका Django इंस्टॉल डिफ़ॉल्ट स्टोरेज एल्गोरिथ्म के रूप में Bcrypt का उपयोग करेगा।

कार्य कारक बढ़ाना

PBKDF2 और bcrypt

PBKDF2 और bcrypt एल्गोरिदम हैशिंग के कई पुनरावृत्तियों या दौर का उपयोग करते हैं। यह जानबूझकर हमलावरों को धीमा कर देता है, जिससे हैशेड पासवर्ड के खिलाफ हमले कठिन हो जाते हैं। हालाँकि, जैसे-जैसे कंप्यूटिंग शक्ति बढ़ती है, पुनरावृत्तियों की संख्या में वृद्धि करने की आवश्यकता होती है। हमने एक उचित डिफ़ॉल्ट चुना है (और इसे Django के प्रत्येक रिलीज़ के साथ बढ़ाएंगे), लेकिन आप अपनी सुरक्षा आवश्यकताओं और उपलब्ध प्रसंस्करण शक्ति के आधार पर इसे ऊपर या नीचे ट्यून करना चाह सकते हैं। ऐसा करने के लिए, आप उपयुक्त एल्गोरिथ्म को उपवर्ग करेंगे और iterations मापदंडों को ओवरराइड करेंगे। उदाहरण के लिए, डिफ़ॉल्ट PBKDF2 एल्गोरिथ्म द्वारा उपयोग किए जाने वाले पुनरावृत्तियों की संख्या बढ़ाने के लिए:

  1. django.contrib.auth.hashers.PBKDF2PasswordHasher उपवर्ग बनाएँ:

    from django.contrib.auth.hashers import PBKDF2PasswordHasher
    
    class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):
        """
        A subclass of PBKDF2PasswordHasher that uses 100 times more iterations.
        """
        iterations = PBKDF2PasswordHasher.iterations * 100
    

    इसे अपने प्रोजेक्ट में कहीं सेव करें। उदाहरण के लिए, आप इसे myproject/hashers.py जैसी फ़ाइल में रख सकते हैं।

  2. PASSWORD_HASHERS में पहली प्रविष्टि के रूप में अपना नया हैशर जोड़ें:

    PASSWORD_HASHERS = [
        'myproject.hashers.MyPBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.Argon2PasswordHasher',
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    ]
    

यह है - अब आपका Django इंस्टॉल PBKDF2 का उपयोग करके पासवर्ड स्टोर करने पर अधिक पुनरावृत्तियों का उपयोग करेगा।

Argon2

आर्गन 2 में तीन विशेषताएं हैं जिन्हें अनुकूलित किया जा सकता है:

  1. time_cost हैश के भीतर पुनरावृत्तियों की संख्या को नियंत्रित करता है।
  2. memory_cost मेमोरी के आकार को नियंत्रित करता है जिसका उपयोग हैश की गणना के दौरान किया जाना चाहिए।
  3. parallelism नियंत्रित करती है कि कितने सीपीयू हैश की गणना को समानांतर किया जा सकता है।

इन विशेषताओं के डिफ़ॉल्ट मान शायद आपके लिए ठीक हैं। यदि आप यह निर्धारित करते हैं कि पासवर्ड हैश बहुत तेज़ या बहुत धीमा है, तो आप इसे निम्नानुसार ट्वीक कर सकते हैं:

  1. parallelism का चयन करें थ्रेड्स की संख्या से आप हैश की गणना कर सकते हैं।
  2. चुनें memory_cost आप क्या कर सकते हैं स्मृति के KiB हो।
  3. एक पासवर्ड लेता है समय हैशिंग समायोजित समय और माप। एक time_cost चुनें जो आपके लिए स्वीकार्य समय ले। यदि time_cost 1 पर सेट अस्वीकार्य रूप से धीमा है, तो कम memory_cost

memory_cost व्याख्या

आर्गन 2 कमांड-लाइन उपयोगिता और कुछ अन्य पुस्तकालय Django द्वारा उपयोग किए जाने वाले मान से अलग से memory_cost पैरामीटर की व्याख्या करते हैं। रूपांतरण memory_cost == 2 ** memory_cost_commandline द्वारा दिया गया है।

पासवर्ड अपग्रेड करना

जब उपयोगकर्ता लॉग इन करते हैं, यदि उनके पासवर्ड पसंदीदा एल्गोरिदम के अलावा किसी अन्य चीज के साथ संग्रहीत किए जाते हैं, तो Django स्वचालित रूप से एल्गोरिथम को पसंदीदा में अपग्रेड करेगा। इसका मतलब यह है कि उपयोगकर्ताओं को लॉग इन करते ही Django की पुरानी इंस्टॉल अपने आप अधिक सुरक्षित हो जाएगी, और इसका मतलब यह भी है कि आप नए (और बेहतर) स्टोरेज एल्गोरिदम पर स्विच कर सकते हैं क्योंकि वे आविष्कार करते हैं।

हालाँकि, Django केवल PASSWORD_HASHERS में वर्णित एल्गोरिदम का उपयोग करने वाले पासवर्ड को अपग्रेड कर सकता है, इसलिए जैसे ही आप नए सिस्टम में अपग्रेड करते हैं, आपको यह सुनिश्चित करना चाहिए कि इस सूची से प्रविष्टियां कभी भी न निकालें । यदि आप करते हैं, तो अनधिकृत एल्गोरिदम का उपयोग करने वाले उपयोगकर्ता अपग्रेड नहीं कर पाएंगे। PBKDF2 पुनरावृत्तियों या bcrypt के राउंड की संख्या में वृद्धि (या घटते) होने पर, पासवर्ड को अपडेट किया जाएगा।

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

लॉगिन की आवश्यकता के बिना पासवर्ड अपग्रेड करना

यदि आपके पास एक पुराना, कमजोर हैश जैसे एमडी 5 या एसएचए 1 के साथ एक मौजूदा डेटाबेस है, तो आप उपयोगकर्ता को लॉग इन करने के लिए अपग्रेड की प्रतीक्षा करने के बजाय उन हैश को अपग्रेड करना चाह सकते हैं (जो कि उपयोगकर्ता के नहीं होने पर कभी नहीं हो सकता है अपनी साइट पर लौटें)। इस स्थिति में, आप "लिपटे" पासवर्ड हैशर का उपयोग कर सकते हैं।

इस उदाहरण के लिए, हम PBKDF2 (SHA1 (पासवर्ड)) का उपयोग करने के लिए SHA1 हैश के एक संग्रह को माइग्रेट करेंगे और यदि उपयोगकर्ता ने लॉगिन पर सही पासवर्ड दर्ज किया है, तो जाँच के लिए संबंधित पासवर्ड हैशर जोड़ें। हम मानते हैं कि हम अंतर्निहित User मॉडल का उपयोग कर रहे हैं और हमारी परियोजना में एक accounts ऐप है। आप किसी भी एल्गोरिथ्म या कस्टम उपयोगकर्ता मॉडल के साथ काम करने के लिए पैटर्न को संशोधित कर सकते हैं।

सबसे पहले, हम कस्टम हैशर जोड़ेंगे:

from django.contrib.auth.hashers import (
    PBKDF2PasswordHasher, SHA1PasswordHasher,
)


class PBKDF2WrappedSHA1PasswordHasher(PBKDF2PasswordHasher):
    algorithm = 'pbkdf2_wrapped_sha1'

    def encode_sha1_hash(self, sha1_hash, salt, iterations=None):
        return super().encode(sha1_hash, salt, iterations)

    def encode(self, password, salt, iterations=None):
        _, _, sha1_hash = SHA1PasswordHasher().encode(password, salt).split('$', 2)
        return self.encode_sha1_hash(sha1_hash, salt, iterations)

डेटा माइग्रेशन कुछ इस तरह दिख सकता है:

from django.db import migrations

from ..hashers import PBKDF2WrappedSHA1PasswordHasher


def forwards_func(apps, schema_editor):
    User = apps.get_model('auth', 'User')
    users = User.objects.filter(password__startswith='sha1$')
    hasher = PBKDF2WrappedSHA1PasswordHasher()
    for user in users:
        algorithm, salt, sha1_hash = user.password.split('$', 2)
        user.password = hasher.encode_sha1_hash(sha1_hash, salt)
        user.save(update_fields=['password'])


class Migration(migrations.Migration):

    dependencies = [
        ('accounts', '0001_initial'),
        # replace this with the latest migration in contrib.auth
        ('auth', '####_migration_name'),
    ]

    operations = [
        migrations.RunPython(forwards_func),
    ]

विदित हो कि यह माइग्रेशन आपके हार्डवेयर की गति के आधार पर कई हजार उपयोगकर्ताओं के लिए कई मिनटों के क्रम में होगा।

अंत में, हम एक PASSWORD_HASHERS सेटिंग जोड़ेंगे:

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'accounts.hashers.PBKDF2WrappedSHA1PasswordHasher',
]

किसी भी अन्य हैशर्स को शामिल करें जो आपकी साइट इस सूची में उपयोग करती है।

हैशर्स शामिल हैं

Django में शामिल हैशर्स की पूरी सूची है:

[
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher',
    'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
]

इसी एल्गोरिथ्म के नाम हैं:

  • pbkdf2_sha256
  • pbkdf2_sha1
  • argon2
  • bcrypt_sha256
  • bcrypt
  • sha1
  • md5
  • unsalted_sha1
  • unsalted_md5
  • crypt

अपना खुद का हैशर लिखना

यदि आप अपना स्वयं का पासवर्ड हैशर लिखते हैं जिसमें कई पुनरावृत्तियों जैसे कार्य कारक शामिल हैं, तो आपको encoded पासवर्ड और डिफ़ॉल्ट कार्य में दिए गए कार्य कारक के बीच रनटाइम गैप को पाटने के लिए एक harden_runtime(self, password, encoded) पद्धति को लागू करना चाहिए। हैशर का कारक। यह एक बड़ी संख्या में पुनरावृत्तियों में एन्कोडेड पासवर्ड वाले उपयोगकर्ता के लिए लॉगिन अनुरोध के बीच अंतर के कारण एक उपयोगकर्ता गणना समय के हमले को रोकता है और एक nonexistent उपयोगकर्ता (जो डिफ़ॉल्ट हैशर की डिफ़ॉल्ट संख्या पुनरावृत्तियों को चलाता है)।

पीबीकेडीएफ 2 को उदाहरण के रूप में लें, यदि encoded में 20,000 पुनरावृत्तियों हैं और हैशर के डिफ़ॉल्ट iterations 30,000 हैं, तो विधि को PBKDF2 के 10,000 अन्य पुनरावृत्तियों के माध्यम से password चलाना चाहिए।

यदि आपके हैशर में कोई कार्य कारक नहीं है, तो विधि को नो-ऑप ( pass ) के रूप में लागू करें।

उपयोगकर्ता के पासवर्ड को मैन्युअल रूप से प्रबंधित करना

django.contrib.auth.hashers मॉड्यूल हैश पासवर्ड बनाने और मान्य करने के लिए फ़ंक्शन का एक सेट प्रदान करता है। आप उन्हें User मॉडल से स्वतंत्र रूप से उपयोग कर सकते हैं।

check_password(password, encoded) [source]

यदि आप डेटाबेस में हैश पासवर्ड के लिए सादा-पाठ पासवर्ड की तुलना करके किसी उपयोगकर्ता को मैन्युअल रूप से प्रमाणित करना चाहते हैं, तो सुविधा फ़ंक्शन check_password() उपयोग करें। यह दो तर्क लेता है: जाँच करने के लिए सादा-पाठ पासवर्ड, और डेटाबेस में उपयोगकर्ता के password फ़ील्ड के पूर्ण मूल्य के खिलाफ जाँच करने के लिए, और True यदि वे मेल खाते हैं, तो False है।

make_password(password, salt=None, hasher='default') [source]

इस एप्लिकेशन द्वारा उपयोग किए गए प्रारूप में एक हैशेड पासवर्ड बनाता है। यह एक अनिवार्य तर्क लेता है: सादा-पाठ में पासवर्ड। वैकल्पिक रूप से, आप उपयोग करने के लिए एक नमक और एक हैशिंग एल्गोरिथ्म प्रदान कर सकते हैं, यदि आप चूक का उपयोग नहीं करना चाहते हैं ( PASSWORD_HASHERS सेटिंग का पहला प्रवेश)। प्रत्येक हैशर के एल्गोरिथ्म नाम के लिए शामिल हैशर्स देखें। यदि पासवर्ड तर्क None , तो एक अनुपयोगी पासवर्ड लौटाया जाता है (एक जिसे check_password() ) द्वारा कभी स्वीकार नहीं किया जाएगा।

is_password_usable(encoded_password) [source]

यदि User.set_unusable_password() का परिणाम है, तो False रिटर्न देता है।

Django 2.1 में परिवर्तित:

पुराने संस्करणों में, यह पासवर्ड या कोई खाली स्ट्रिंग None होने पर भी False रिटर्न देता है, या यदि पासवर्ड एक हैशर का उपयोग करता है जो PASSWORD_HASHERS सेटिंग में नहीं है। यह व्यवहार बग के रूप में माना जाता है क्योंकि यह ऐसे पासवर्ड वाले उपयोगकर्ताओं को पासवर्ड रीसेट करने का अनुरोध करने से रोकता है।

पासवर्ड सत्यापन

उपयोगकर्ता अक्सर खराब पासवर्ड चुनते हैं। इस समस्या को कम करने में मदद करने के लिए, Django प्लग-इन पासवर्ड सत्यापन प्रदान करता है। आप एक ही समय में कई पासवर्ड सत्यापनकर्ताओं को कॉन्फ़िगर कर सकते हैं। कुछ सत्यापनकर्ता Django में शामिल हैं, लेकिन साथ ही साथ अपना खुद का लिखना सरल है।

प्रत्येक पासवर्ड सत्यापनकर्ता को उपयोगकर्ता को आवश्यकताओं की व्याख्या करने, दिए गए पासवर्ड को मान्य करने और यदि वह आवश्यकताओं को पूरा नहीं करता है, तो एक त्रुटि संदेश वापस करने और सेट किए गए पासवर्ड प्राप्त करने के लिए एक मदद पाठ प्रदान करना होगा। मान्यताओं में उनके व्यवहार को ठीक करने के लिए वैकल्पिक सेटिंग्स भी हो सकती हैं।

मान्यता को AUTH_PASSWORD_VALIDATORS सेटिंग द्वारा नियंत्रित किया जाता है। सेटिंग के लिए डिफ़ॉल्ट एक खाली सूची है, जिसका अर्थ है कि कोई सत्यापनकर्ता लागू नहीं है। डिफ़ॉल्ट startproject टेम्पलेट के साथ बनाई गई नई परियोजनाओं में, सत्यापनकर्ताओं का एक सरल सेट सक्षम है।

डिफ़ॉल्ट रूप से, सत्यापनकर्ताओं का उपयोग पासवर्डों को रीसेट करने या बदलने के लिए और createsuperuser और changepassword प्रबंधन कमांड में किया जाता है। Validators को मॉडल स्तर पर लागू नहीं किया जाता है, उदाहरण के लिए User.objects.create_user() और create_superuser() , क्योंकि हम मानते हैं कि डेवलपर्स, उपयोगकर्ता नहीं, उस स्तर पर Django के साथ बातचीत करते हैं और इसलिए भी कि मॉडल create_superuser() स्वचालित रूप से नहीं चलता है। मॉडल बनाने के हिस्से के रूप में।

ध्यान दें

पासवर्ड सत्यापन कई प्रकार के कमजोर पासवर्ड के उपयोग को रोक सकता है। हालांकि, यह तथ्य कि एक पासवर्ड सभी सत्यापनकर्ताओं को पास करता है, गारंटी नहीं देता कि यह एक मजबूत पासवर्ड है। ऐसे कई कारक हैं जो एक पासवर्ड को कमजोर कर सकते हैं जो कि सबसे उन्नत पासवर्ड सत्यापनकर्ताओं द्वारा भी पता लगाने योग्य नहीं हैं।

पासवर्ड सत्यापन सक्षम करना

पासवर्ड सत्यापन AUTH_PASSWORD_VALIDATORS सेटिंग में कॉन्फ़िगर किया गया है:

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 9,
        }
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

यह उदाहरण सभी चार सत्यापनकर्ताओं को सक्षम बनाता है:

  • UserAttributeSimilarityValidator , जो पासवर्ड और उपयोगकर्ता की विशेषताओं के समूह के बीच समानता की जाँच करता है।
  • MinimumLengthValidator , जो केवल यह जांचता है कि पासवर्ड न्यूनतम लंबाई से मिलता है या नहीं। यह सत्यापनकर्ता एक कस्टम विकल्प के साथ कॉन्फ़िगर किया गया है: इसे अब डिफ़ॉल्ट आठ के बजाय न्यूनतम लंबाई नौ वर्णों की आवश्यकता है।
  • CommonPasswordValidator , जो यह जांचता है कि पासवर्ड आम पासवर्ड की सूची में है या नहीं। डिफ़ॉल्ट रूप से, यह 20,000 सामान्य पासवर्डों की सम्मिलित सूची की तुलना करता है।
  • NumericPasswordValidator , जो जाँचता है कि पासवर्ड पूरी तरह से संख्यात्मक नहीं है।

UserAttributeSimilarityValidator और CommonPasswordValidator , हम केवल इस उदाहरण में डिफ़ॉल्ट सेटिंग्स का उपयोग कर रहे हैं। NumericPasswordValidator की कोई सेटिंग नहीं है।

AUTH_PASSWORD_VALIDATORS में सूचीबद्ध क्रम में मदद पाठ और पासवर्ड सत्यापनकर्ताओं की कोई भी त्रुटि हमेशा वापस आ AUTH_PASSWORD_VALIDATORS

शामिल वैध

Django में चार सत्यापनकर्ता शामिल हैं:

class MinimumLengthValidator(min_length=8) [source]

यह पुष्टि करता है कि क्या पासवर्ड न्यूनतम लंबाई से मिलता है। न्यूनतम लंबाई को min_length पैरामीटर के साथ अनुकूलित किया जा सकता है।

class UserAttributeSimilarityValidator(user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7) [source]

यह पुष्टि करता है कि पासवर्ड उपयोगकर्ता की कुछ विशेषताओं से पर्याप्त रूप से भिन्न है या नहीं।

user_attributes पैरामीटर की तुलना करने के लिए उपयोगकर्ता विशेषताओं के नामों का एक पुनरावृत्ति होना चाहिए। यदि यह तर्क प्रदान नहीं किया जाता है, तो डिफ़ॉल्ट का उपयोग किया जाता है: 'username', 'first_name', 'last_name', 'email' । जिन विशेषताओं का अस्तित्व नहीं है, उनकी उपेक्षा की जाती है।

अस्वीकृत पासवर्ड की न्यूनतम समानता को 0 से 1 के पैमाने पर max_similarity पैरामीटर के साथ सेट किया जा सकता है। 0 की सेटिंग सभी पासवर्डों को अस्वीकार करती है, जबकि 1 की सेटिंग केवल उन पासवर्डों को अस्वीकार करती है जो किसी विशेषता के मान के समान हैं।

class CommonPasswordValidator(password_list_path=DEFAULT_PASSWORD_LIST_PATH) [source]

यह पुष्टि करता है कि क्या पासवर्ड सामान्य पासवर्ड नहीं है। यह पासवर्ड को लोअरकेस में परिवर्तित करता है (केस-असंवेदनशील तुलना करने के लिए) और इसे रॉयस विलियम्स द्वारा बनाई गई 20,000 आम पासवर्ड की सूची के खिलाफ जाँचता है।

password_list_path को सामान्य पासवर्ड की कस्टम फ़ाइल के पथ पर सेट किया जा सकता है। इस फ़ाइल में प्रति पंक्ति एक लोअरकेस पासवर्ड होना चाहिए और यह सादा पाठ या gzipped हो सकता है।

Django 2.1 में परिवर्तित:

पुराने संस्करणों में, 1,000 सामान्य पासवर्ड की सूची का उपयोग किया जाता है।

class NumericPasswordValidator [source]

यह पुष्टि करता है कि क्या पासवर्ड पूरी तरह से संख्यात्मक नहीं है।

सत्यापन को एकीकृत करना

django.contrib.auth.password_validation में कुछ फ़ंक्शन हैं django.contrib.auth.password_validation आप पासवर्ड सत्यापन को एकीकृत करने के लिए अपने स्वयं के रूपों या अन्य कोड से कॉल कर सकते हैं। यह उपयोगी हो सकता है यदि आप पासवर्ड सेटिंग के लिए कस्टम फॉर्म का उपयोग करते हैं, या यदि आपके पास एपीआई कॉल है जो पासवर्ड सेट करने की अनुमति देता है, उदाहरण के लिए।

validate_password(password, user=None, password_validators=None) [source]

एक पासवर्ड मान्य करता है। यदि सभी सत्यापनकर्ता पासवर्ड को वैध पाते हैं, तो None लौटाता है। यदि एक या अधिक सत्यापनकर्ता पासवर्ड को अस्वीकार कर देते हैं, तो सत्यापनकर्ताओं से सभी त्रुटि संदेशों के साथ एक ValidationError उठाता है।

user ऑब्जेक्ट वैकल्पिक है: यदि यह प्रदान नहीं किया गया है, तो कुछ सत्यापनकर्ता कोई सत्यापन करने में सक्षम नहीं हो सकते हैं और किसी भी पासवर्ड को स्वीकार करेंगे।

password_changed(password, user=None, password_validators=None) [source]

सभी सत्यापनकर्ताओं को सूचित करता है कि पासवर्ड बदल दिया गया है। इसका उपयोग सत्यापनकर्ताओं द्वारा किया जा सकता है जैसे कि पासवर्ड का उपयोग करने से रोकता है। पासवर्ड सफलतापूर्वक बदलने के बाद इसे कॉल किया जाना चाहिए।

AbstractBaseUser के उपवर्गों के लिए, पासवर्ड फ़ील्ड को "गंदा" के रूप में चिह्नित किया जाएगा जब कॉल करने के लिए set_password() जो उपयोगकर्ता को सहेजे जाने के बाद कॉल को set_password() से चलाता है।

password_validators_help_texts(password_validators=None) [source]

सभी सत्यापनकर्ताओं की सहायता ग्रंथों की सूची लौटाता है। ये उपयोगकर्ता को पासवर्ड आवश्यकताओं की व्याख्या करते हैं।

password_validators_help_text_html(password_validators=None)

एक <ul> में सभी मदद ग्रंथों के साथ एक HTML स्ट्रिंग लौटाता है। प्रपत्रों में पासवर्ड सत्यापन जोड़ते समय यह मददगार होता है, क्योंकि आप आउटपुट को सीधे किसी फॉर्म फ़ील्ड के help_text पैरामीटर में पास कर सकते हैं।

get_password_validators(validator_config) [source]

validator_config पैरामीटर के आधार पर सत्यापनकर्ता ऑब्जेक्ट का एक सेट लौटाता है। डिफ़ॉल्ट रूप से, सभी फ़ंक्शन AUTH_PASSWORD_VALIDATORS में परिभाषित सत्यापनकर्ताओं का उपयोग करते हैं, लेकिन इस फ़ंक्शन को सत्यापनकर्ताओं के वैकल्पिक सेट के साथ कॉल करके और फिर परिणाम को अन्य कार्यों के AUTH_PASSWORD_VALIDATORS पैरामीटर में पास करके, आपके कस्टम सेट का उपयोग किया जाएगा। यह उपयोगी है जब आपके पास अधिकांश परिदृश्यों के लिए उपयोग करने के लिए सत्यापनकर्ताओं का एक विशिष्ट सेट होता है, लेकिन एक विशेष स्थिति भी होती है जिसे कस्टम सेट की आवश्यकता होती है। यदि आप हमेशा सत्यापनकर्ताओं के एक ही सेट का उपयोग करते हैं, तो इस फ़ंक्शन का उपयोग करने की कोई आवश्यकता नहीं है, क्योंकि AUTH_PASSWORD_VALIDATORS से कॉन्फ़िगरेशन डिफ़ॉल्ट रूप से उपयोग किया जाता है।

validator_config की संरचना AUTH_PASSWORD_VALIDATORS की संरचना के AUTH_PASSWORD_VALIDATORS । इस फ़ंक्शन का रिटर्न मान ऊपर सूचीबद्ध फ़ंक्शन के पासवर्ड_वैलिडेटर पैरामीटर में पारित किया जा सकता है।

ध्यान दें कि जहां पासवर्ड इन कार्यों में से एक को पारित किया गया है, यह हमेशा स्पष्ट पाठ पासवर्ड होना चाहिए - हैशेड पासवर्ड नहीं।

अपना सत्यापनकर्ता लिखना

यदि Django के अंतर्निहित सत्यापनकर्ता पर्याप्त नहीं हैं, तो आप अपना पासवर्ड सत्यापनकर्ता लिख ​​सकते हैं। मान्यवर काफी सरल वर्ग हैं। उन्हें दो तरीके लागू करने होंगे:

  • validate(self, password, user=None) : एक पासवर्ड को मान्य करें। यदि पासवर्ड मान्य है, तो None वापस न करें, या यदि पासवर्ड मान्य नहीं है, तो त्रुटि संदेश के साथ ValidationError करें। आप user के साथ None व्यवहार करने में सक्षम होना चाहिए - यदि इसका अर्थ है कि आपका सत्यापनकर्ता नहीं चल सकता है, तो बस बिना किसी त्रुटि के कोई None वापस लौटाएं
  • get_help_text() : उपयोगकर्ता को आवश्यकताओं को समझाने के लिए एक सहायता पाठ प्रदान करते हैं।

आपके सत्यापनकर्ता के लिए AUTH_PASSWORD_VALIDATORS के OPTIONS में कोई भी आइटम कंस्ट्रक्टर को दिया जाएगा। सभी कंस्ट्रक्टर तर्क में एक डिफ़ॉल्ट मान होना चाहिए।

यहां एक वैकल्पिक सेटिंग के साथ सत्यापनकर्ता का मूल उदाहरण दिया गया है:

from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _

class MinimumLengthValidator:
    def __init__(self, min_length=8):
        self.min_length = min_length

    def validate(self, password, user=None):
        if len(password) < self.min_length:
            raise ValidationError(
                _("This password must contain at least %(min_length)d characters."),
                code='password_too_short',
                params={'min_length': self.min_length},
            )

    def get_help_text(self):
        return _(
            "Your password must contain at least %(min_length)d characters."
            % {'min_length': self.min_length}
        )

आप password_changed(password, user=None ) को भी लागू कर सकते password_changed(password, user=None जिसे एक सफल पासवर्ड परिवर्तन के बाद कहा जाएगा। उदाहरण के लिए, पासवर्ड के पुन: उपयोग को रोकने के लिए इसका उपयोग किया जा सकता है। हालांकि, यदि आप उपयोगकर्ता के पिछले पासवर्डों को संग्रहीत करने का निर्णय लेते हैं, तो आपको कभी भी स्पष्ट पाठ में ऐसा नहीं करना चाहिए।