Django मॉडल में पासवर्ड फ़ील्ड



django-models django-admin (4)

मैं एक मॉडल बनाने की कोशिश कर रहा हूं जहां मैं अन्य अनुप्रयोगों के लिए उपयोगकर्ता नाम और पासवर्ड स्टोर कर सकता हूं। मैं Django में पासवर्ड फ़ील्ड कैसे सेट कर सकता हूं ताकि यह व्यवस्थापक में सादा पाठ में न हो? अग्रिम में धन्यवाद।

https://src-bin.com


Answer #1

आपकी सबसे अच्छी शर्त (मुझे पता है) django कोड में कोड में खोदना है, और देखें कि यह कैसे किया जाता है। जैसा कि मुझे याद है, वे नमकीन हैश उत्पन्न करते हैं ताकि सादा पाठ मूल्य कहीं भी संग्रहीत न हों, बल्कि हश और नमक हैं।

यदि आप django स्थापना में जाते हैं, और हैश और नमक जैसे शब्दों के लिए चारों ओर पोक करते हैं, तो आपको इसे बहुत जल्दी मिलना चाहिए। अस्पष्ट उत्तर के लिए खेद है, लेकिन शायद यह आपको सही रास्ते पर स्थापित करेगा।


Answer #2

दुर्भाग्य से इस प्रश्न का कोई आसान जवाब नहीं है क्योंकि यह उन अनुप्रयोगों पर निर्भर करता है जिनके खिलाफ आप प्रमाणीकरण करने का प्रयास कर रहे हैं और यह भी निर्भर करता है कि आप पासवर्ड फ़ील्ड कितनी सुरक्षित हैं।

यदि आपका Django एप्लिकेशन किसी अन्य एप्लिकेशन के विरुद्ध प्रमाणित करने के लिए पासवर्ड का उपयोग करेगा जिसके लिए एक सादे टेक्स्ट पासवर्ड भेजा जाना आवश्यक है, तो आपके विकल्प हैं:

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

यदि आप Django के बिल्टिन उपयोगकर्ता मॉडल का उपयोग कर रहे हैं तो आप Django उपयोगकर्ता पासवर्ड को मास्टर पासवर्ड के रूप में उपयोग कर सकते हैं। इसका मतलब है कि आपको उस मास्टर पासवर्ड को स्मृति में रखना होगा जो आपके लिए कुछ परिचालन मुश्किल कर सकता है, जैसे कि सर्वर को पुनरारंभ करना या लोड-संतुलित अनावश्यक सर्वर चलाना।

पासवर्ड संग्रहीत करने के लिए वैकल्पिक

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

उदाहरण के लिए, फेसबुक इस मॉडल का समर्थन करता है और उनके बारे में व्यापक दस्तावेज है कि यह कैसे काम करता है:

फेसबुक डेवलपर: एक्सेस टोकन और प्रकार

एक बार जब आप [OAuth 2.0] (http://tools.ietf.org/html/draft-ietf-oauth-v2- 12) का उपयोग करके फेसबुक से जुड़ने में कामयाब हो जाते हैं तो आपको शायद अन्य अनुप्रयोगों के लिंक जोड़ने में आसानी होगी एक ही प्रोटोकॉल।


Answer #3

यदि आपको एक परिवर्तनीय पासवर्ड फ़ील्ड की आवश्यकता है, तो आप इस तरह कुछ उपयोग कर सकते हैं:

from django.db import models
from django.core.exceptions import ValidationError
from django.conf import settings

from os import urandom
from base64 import b64encode, b64decode
from Crypto.Cipher import ARC4
from django import forms



PREFIX = u'\u2620'


class EncryptedCharField(models.CharField): 
    __metaclass__ = models.SubfieldBase

    SALT_SIZE = 8

    def __init__(self, *args, **kwargs):
        self.widget = forms.TextInput       
        super(EncryptedCharField, self).__init__(*args, **kwargs)

    def get_internal_type(self):
        return 'TextField'    

    def to_python(self, value):
        if not value:
            return None
        if isinstance(value, basestring):
            if value.startswith(PREFIX):
                return self.decrypt(value)
            else:
                return value
        else:
            raise ValidationError(u'Failed to encrypt %s.' % value)

    def get_db_prep_value(self, value, connection, prepared=False):
        return self.encrypt(value)        

    def value_to_string(self, instance):
        encriptado = getattr(instance, self.name)
        return self.decrypt(encriptado) if encriptado else None

    @staticmethod
    def encrypt(plaintext):
        plaintext = unicode(plaintext)
        salt = urandom(EncryptedCharField.SALT_SIZE)
        arc4 = ARC4.new(salt + settings.SECRET_KEY)
        plaintext = u"%3d%s%s" % (len(plaintext), plaintext, b64encode(urandom(256-len(plaintext))))
        return PREFIX + u"%s$%s" % (b64encode(salt), b64encode(arc4.encrypt(plaintext.encode('utf-8-sig'))))

    @staticmethod
    def decrypt(ciphertext):
        salt, ciphertext = map(b64decode, ciphertext[1:].split('$'))
        arc4 = ARC4.new(salt + settings.SECRET_KEY)
        plaintext = arc4.decrypt(ciphertext).decode('utf-8-sig')
        return plaintext[3:3+int(plaintext[:3].strip())]

एन्क्रिप्शन भाग https://djangosnippets.org/snippets/1330/ पर स्निपेट पर आधारित है, मैंने इसे अभी एक फील्ड मॉडल में बदल दिया है, यूटीएफ -8 समर्थन जोड़ा है और Django के to_python के मूर्ख उपयोग के लिए वर्कअराउंड के रूप में एक उपसर्ग जोड़ा है ( )


Answer #4

जैसा कि @mlissner suggested ऑथ का suggestedauth.User मॉडल देखने के लिए एक अच्छी जगह है। यदि आप स्रोत कोड की जांच करते हैं तो आप देखेंगे कि password फ़ील्ड एक CharField फ़ील्ड है।

password = models.CharField(_('password'), max_length=128, help_text=_("Use 
'[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))

User मॉडल में एक set_password विधि भी है।

def set_password(self, raw_password):
    import random
    algo = 'sha1'
    salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
    hsh = get_hexdigest(algo, salt, raw_password)
    self.password = '%s$%s$%s' % (algo, salt, hsh)

आप पासवर्ड बनाने और इसे सहेजने के बारे में इस विधि से कुछ सुराग ले सकते हैं।





django-admin