2012-03-26 16 views
10

से पासवर्ड माइग्रेट करें मैं वर्तमान उपयोगकर्ताओं सहित ड्रूपल 7 से Django 1.4 तक एक साइट माइग्रेट कर रहा हूं। मैं Drupal द्वारा धोखे गए पासवर्ड के साथ कैसे काम कर सकता हूं?ड्रूपल 7 से Django

this के अनुसार, Drupal 7 (वे एक स्ट्रिंग "$ एस $ 'के साथ शुरू के रूप में जमा हो जाती है) का उपयोग कर SHA-512 पासवर्ड हैश।

डीजेगो 1.4 में अब SHA-256 के डिफ़ॉल्ट के साथ पासवर्ड संग्रहीत करने के लिए options है, लेकिन मुझे SHA-512 के लिए कोई विकल्प नहीं मिल रहा है। जबकि this app SHA2 एल्गोरिदम के उपयोग की अनुमति देने के लिए प्रतीत होता है, मुझे यकीन नहीं है कि यह Django 1.4 के साथ संगत है (1.4 के रूप में एक लचीला पासवर्ड हैशर है)।

ऐसा करने का सबसे आसान तरीका क्या है?

ईटीए: मैंने एक पासवर्ड हैशर बनाया है जो ड्रूपल के एल्गोरिदम की नकल करता है और माइग्रेशन को आसान बनाता है। चूंकि मैंने पहले से ही एक जवाब स्वीकार कर लिया है, मैं अस्वीकार्य नहीं होगा, लेकिन भविष्य में Django प्रवासन के लिए ड्रूपल करना चाहता हूं, कोड Django snippets पर और GitHub gist पर संग्रहीत किया गया है।

+0

मैं उपयोगकर्ताओं को ड्रापल 7 ऐप से एक Django 1.8 ऐप में माइग्रेट करने का प्रयास कर रहा हूं जो स्टॉर्मपाथ का उपयोग करता है। (Http://drupal.stackexchange.com/questions/176008/getting-password-hashes-and-salts-from-drupal-7 के अनुसार)। मैं जो भी अटक गया हूं वह है कि ड्रूपल ऐप से पासवर्ड हैश और लवण कैसे प्राप्त करें। क्या आप इसके साथ मदद कर सकते हैं? – Daniel

उत्तर

5

मुझे ड्रूपल बहुत अच्छी तरह से नहीं पता, लेकिन मुझे लगता है कि पासवर्ड संग्रहित हैं। यदि ऐसा है, तो आपको पासवर्ड कॉपी करना होगा (मेरा मतलब है, उन्हें अपरिवर्तित प्रतिलिपि बनाएँ) और आपको उसी सुरक्षा नमक के साथ ड्रूपल के बिल्कुल उसी तरीके से, Django के पासवर्ड को बदलने का तरीका बदलना होगा।

मुझे वास्तव में यह नहीं पता कि यह कैसे करना है, लेकिन पासवर्ड के लिए तर्क उपयोगकर्ता ऑब्जेक्ट में निहित है। उदाहरण के लिए। User.set_password() फ़ंक्शन (वर्णित here) make_password फ़ंक्शन का उपयोग करता है।

मुझे लगता है कि थोड़ा सा शोध आपको इसे बदलने का तरीका मिलेगा, लेकिन महत्वपूर्ण बात यह है कि याद रखना चाहिए कि कार्य बराबर होना चाहिए! यानी:

drupal_hash (x) == django_hash (x) अनुमत पासवर्ड सेट में प्रत्येक एक्स के लिए।

संपादित करें:

एक गहरी नज़र Django get_hasher समारोह के साथ कार्य है मिल लेना। अब 1.4 संस्करण में यह निर्दिष्ट करने का एक तरीका है कि Django उस फ़ंक्शन का चयन कैसे करेगा। इस पर एक नज़र डालें: https://docs.djangoproject.com/en/dev/topics/auth/#how-django-stores-passwords

अंत में, अपना स्वयं का फ़ंक्शन बनाने के लिए, आप यह देख सकते हैं कि यह MD5PasswordHasher पर कैसे किया जाता है। यह वास्तव में सरल लगता है। आप sha-512 एल्गोरिदम उत्पन्न करने के लिए hashlib python library का उपयोग कर सकते हैं।

एनकोड विधि को बदलने के लिए इसी तरह somthing की आवश्यकता होगी:

def encode(self, password, salt): 
    assert password 
    assert salt and '$' not in salt 
    hash = hashlib.sha512(salt + password).hexdigest() 
    return "%s$%s$%s" % (self.algorithm, salt, hash) 
+0

यह वही समस्या है जो मेरे पास है: मुझे Django में SHA-512 हैशिंग का उपयोग करने का कोई तरीका नहीं मिला है, जो ड्रूपल 7 की हैशिंग विधि –

+0

प्रतीत होता है, मैंने अपना जवाब अपडेट किया, उम्मीद है कि इससे मदद मिलती है। – santiagobasulto

+0

यह करता है! लेकिन जैसा कि @ अलास्दीर कहते हैं, मुझे यकीन नहीं है कि संग्रहीत पासवर्ड से नमक निकालने के लिए कैसे ... –

1

आप BasePasswordHasher की अपनी खुद की उपवर्ग बनाना और अपने PASSWORD_HASHERS सेटिंग में जोड़कर इस लागू करने के लिए सक्षम होना चाहिए।

पायथन का हैशिब sha512 लागू करता है।

page David linked to in the question बताते हैं कि कैसे पुनरावृत्तियों की संख्या (Drupal 7 के लिए 16,385) हैश में एन्कोड किया गया है, लेकिन यह कैसे नमक प्राप्त करने के लिए मेरे लिए स्पष्ट नहीं है।

संपादित करें: @ सैंटियागो के जवाब पर टिप्पणी में, डेविड कहते हैं, "नमक भंडारित ड्रूपल स्ट्रिंग में 12 वें के माध्यम से 5 वें चरित्र है"।

+1

ड्रूपल में नमक settings.php फ़ाइल में संग्रहीत किया जाता है। – mirzu

+1

इसे हल किया गया- कोड मेरे प्रश्न में ऊपर पोस्ट किया गया है :-) –

+0

अच्छा एक डेविड। अपना समाधान पोस्ट करने के लिए धन्यवाद। – Alasdair

2

धन्यवाद, डेविड रॉबिन्सन, आपके कोड के लिए। वह मेरा दिन बना दिया! ऐसा लगता है कि ऐसा कोई दोष है, हालांकि: यदि ड्रूपल ने 'सी' का उपयोग नहीं करने का फैसला किया लेकिन पुनरावृत्तियों की संख्या के लिए 'डी', तो यह विफल हो गया। मैं कक्षा परिभाषा थोड़ा तय:

class DrupalPasswordHasher(BasePasswordHasher): 
    algorithm = "S" 
    iter_code = 'C' 
    salt_length = 8 

    def encode(self, password, salt, iter_code=None): 
     """The Drupal 7 method of encoding passwords""" 
     if iter_code == None: 
      iterations = 2 ** _ITOA64.index(self.iter_code) 
     else: 
      iterations = 2 ** _ITOA64.index(iter_code) 
     hash = hashlib.sha512(salt + password).digest() 

     for i in range(iterations): 
      hash = hashlib.sha512(hash + password).digest() 

     l = len(hash) 

     output = '' 
     i = 0 

     while i < l: 
      value = ord(hash[i]) 
      i = i + 1 

      output += _ITOA64[value & 0x3f] 
      if i < l: 
       value |= ord(hash[i]) << 8 

      output += _ITOA64[(value >> 6) & 0x3f] 
      if i >= l: 
       break 
      i += 1 

      if i < l: 
       value |= ord(hash[i]) << 16 

      output += _ITOA64[(value >> 12) & 0x3f] 
      if i >= l: 
       break 
      i += 1 

      output += _ITOA64[(value >> 18) & 0x3f] 

     longhashed = "%s$%s%s%s" % (self.algorithm, iter_code, 
            salt, output) 
     return longhashed[:54] 

    def verify(self, password, encoded): 
     hash = encoded.split("$")[1] 
     iter_code = hash[0] 
     salt = hash[1:1 + self.salt_length] 
     return encoded == self.encode(password, salt, iter_code) 
+0

खुशी है कि यह मदद कर सकता है, करस्टन! मुझे लगता है कि मैं आपके कोड को अलग करने के बारे में उलझन में हूं: क्या इसे मूल पंक्ति 'पुनरावृत्तियों = 2 ** _ITOA64.index (हैश [0]) द्वारा नियंत्रित नहीं किया गया था? बीटीडब्लू, मैं अब गिटहब गिस्ट के रूप में कोड को बनाए रख रहा हूं, विवरण के लिए उत्तर देखें। (मैंने इसे अभी आपके संस्करण में संपादित किया है)। –

+0

(तुलना के लिए, [यहां] (https://gist.github.com/2344345/2f9f79fccef285ff4282ac640cf8cfb56fb069fd) मूल कोड है) –

+0

इसका पुनरीक्षण, मैं सहमत हूं। हो सकता है कि यह सिर्फ एक पठनीयता-मुद्दा था जो मुझे 'भ्रम' के साथ 'सी' और '2 ** _ITOA64.index ('C') के साथ भ्रमित कर रहा था, और फिर मैंने हल किया कि' iter_code' बनाकर प्रभावी रूप से एक महत्वपूर्ण चरित्र, और 'पुनरावृत्तियों' दो पूर्णांक की शक्ति। अब मैं देखता हूं कि कोड कोड की कम लाइनों के साथ मैं इसे हासिल कर सकता था। वैसे भी, कोड का बड़ा टुकड़ा, आपकी मदद के लिए धन्यवाद! –

0

यहाँ, अजगर 3 के लिए डेविड की उत्कृष्ट जवाब के लिए एक अद्यतन है, क्योंकि hashlib नहीं रह तार स्वीकार करता है। इसके अलावा, इसमें अजीब "यू $ एस $ *" हैश के लिए समर्थन शामिल है, जो स्पष्ट रूप से एक अद्यतन से हैं और मुझे अपने ड्रोपल डेटाबेस में उनमें से एक गुच्छा मिला।

https://gist.github.com/skulegirl/bec420b5272b87d9e4dbd39e947062fc

और एक बोनस के रूप में, यहाँ कोड है कि मैं में उपयोगकर्ता डेटा के अपने xml फ़ाइल आयात करने के लिए प्रयोग किया जाता है। (मैं सिर्फ उन मेज पर एक प्रश्न करने के बाद एक एसक्यूएल निर्यात के माध्यम से xml फ़ाइल बनाया।)

import xml.etree.ElementTree as ET 
from django.contrib.auth.models import User 

tree = ET.parse('/PATH/TO/Users.xml') 
root = tree.getroot() 

for row in root: 
    user_dict = {} 
    for field in row: 
     user_dict[field.attrib['name']] = field.text 
    user = User.objects.create_user(user_dict['name'], user_dict['mail']) 
    if user_dict['pass'][0] == '$': 
     user_dict['pass'] = user_dict['pass'][1:] 
    user.password = user_dict['pass'] 
    user.save() 
संबंधित मुद्दे