आप कच्चे पासवर्ड का उपयोग करने के लिए अपने स्वयं के प्रमाणीकरण बैकएंड लिख सकते हैं:
from django.contrib.auth import backends
from django.contrib.auth.models import User
class RawPasswordUser(User):
class Meta:
proxy = True
def set_password(self, raw_password):
# default implementation made a hash from raw_password,
# we don't want this
self.password = raw_password
def check_password(self, raw_password):
# same here, don't make hash out of raw_password
return self.password == raw_password
class ModelBackend(backends.ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = RawPasswordUser.objects.get(username=username)
if user.check_password(password):
return user
except RawPasswordUser.DoesNotExist:
return None
def get_user(self, user_id):
try:
return RawPasswordUser.objects.get(pk=user_id)
except RawPasswordUser.DoesNotExist:
return None
सेटिंग्स फ़ाइल में:
AUTHENTICATION_BACKENDS = (
# ModelBackend from project_root/auth/backends.py
'auth.backends.ModelBackend',
)
अब जब आप authenticate
अपने विचारों में उपयोगकर्ताओं, आप RawPasswordUser
उदाहरणों मिल जाएगा। यह login_required
सजावट पर लागू होता है, request.user
प्रॉक्सी क्लास को इंगित करेगा।
विवरण के लिए documentation देखें।
डिफ़ॉल्ट उपयोगकर्ता के साथ डिफ़ॉल्ट उपयोगकर्ता मॉडल को प्रतिस्थापित करने के लिए Django 1.5+ there is also an option के लिए, लेकिन मौजूदा उपयोगकर्ताओं को रखने के लिए आपको उन्हें किसी भी तरह माइग्रेट करना होगा, this question देखें।
दरअसल आप उपयोगकर्ता पासवर्ड अपरिवर्तित रखने में सक्षम नहीं होंगे।
करके निम्न स्वरूप में डिफ़ॉल्ट Django पासवर्ड संगृहीत:
एल्गोरिथ्म $ पुनरावृत्तियों $ नमक $ हैश
जिसका मतलब है:
तुम बस पासवर्ड को पुनर्जीवित नहीं कर सकता मूल के हैंश से, क्योंकि आपके पास मूल नहीं है।
आप नमक को जानने के बिना क्लाइंट-साइड पर एक ही हैश उत्पन्न करने में सक्षम नहीं होंगे। आप इसे क्लाइंट-साइड में पास कर सकते हैं, लेकिन नमक को एक रहस्य माना जाता है, इसलिए इसे अनएन्क्रिप्टेड चैनल के माध्यम से करना मूर्ख नहीं है।
सबसे आसान समाधान है कि मैं देख रहा हूँ, वर्तमान Django व्यवहार रखने के लिए के रूप में टिप्पणी में Tadeck द्वारा सुझाव दिया गया था, क्लाइंट-साइड और बल उपयोगकर्ताओं के लिए hashing अपने पासवर्ड बदल लें जोड़ने है।
ठीक है, यह वास्तव में एक समाधान नहीं है, क्योंकि एक हमलावर पचाने वाले पासवर्ड को रोक सकता है और सीधे उनका उपयोग कर सकता है, लेकिन आपने इसे अपने प्रश्न अद्यतन का उल्लेख किया है। चूंकि आपको अधिक सुरक्षा की परवाह नहीं है, इसलिए आप जावास्क्रिप्ट में public key encryption चेकआउट भी कर सकते हैं।
एक अन्य समाधान Tadeck द्वारा प्रस्तावित OAuth की तरह सेवा, इस तरह कुछ हद तक लग सकता है जो उपयोग करने के लिए है:
def index(request):
access_token = request.REQUEST.get('token', None)
if not access_token:
return redirect('login')
# Custom authentication backend that accepts a token
# and searches for a user with that token in database.
user = authenticate(access_token)
if not user:
return redirect('login')
return render(...)
def auth(request):
''' This ajax-view has to be encrypted with SSL.'''
# Normal Django authentication.
user = authenticate(request.POST['username'], request.POST['password'])
# Authentication failed
if user is None:
return json.dumps({'error': '...'})
# generate, save and return token in json response
token = UserToken(user=user, value=generate_token())
# token.expires_at = datetime.now() + timedelta(days=1)
token.save()
return json.dumps({'token': token.value})
एक हमला अभी भी पहुंच टोकन को रोक सकता है, लेकिन यह एक बिट में अवरोध डालने की तुलना में बेहतर है पासवर्ड हैश
स्टैक ओवरफ़्लो में आपका स्वागत है। कृपया [अधिक विनम्र भाषा का उपयोग करने का प्रयास करें] (http://meta.stackexchange.com/questions/22232/are-expletives-allowed-on-se-sites/22233#22233)। – nnnnnn
धन्यवाद। शब्दों के लिए खेद है। मैं पिछले 33 घंटों से सो नहीं रहा हूं और अपने सिर को दीवार पर मार रहा हूं जो मेरी गलती के कारण नहीं है। – GhaghaSibil