2010-02-18 11 views
5

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

इसके लिए, मुझे किसी प्रकार का एन्क्रिप्शन फ़ंक्शन चाहिए जो एक संख्या (या एक स्ट्रिंग) का उपभोग करता है जो कि मेरे चुने हुए आइटम की प्राथमिक कुंजी है जो उपयोगकर्ता खाते से जुड़ा हुआ है, कुछ प्रकार के बीज का उपभोग करता है और एन्क्रिप्शन कोड उत्पन्न करता है जिसे किसी अन्य पृष्ठ पर डिक्रिप्ट किया जाएगा।

तो यह

my_items_pk = 36 #primary key of an item 
seed = "rsdjk324j23423j4j2" #some string for crypting 
encrypted_string = encrypt(my_items_pk,seed) 
#generates some crypted string such as "dsaj2j213jasas452k41k" 
and at another page: 
decrypt_input = encrypt(decypt,seed) 
print decrypt_input 
#gives 36 

की तरह कुछ मैं अपने "बीज" कुछ प्राथमिक चर के (कुछ वर्ग नहीं) इस उद्देश्य के लिए (यानी कुछ संख्या या स्ट्रिंग) तरह बनना चाहता हूँ।

मैं इसे पाइथन और डीजेंगो के तहत कैसे प्राप्त कर सकता हूं?

+0

आप क्यों नहीं बस इस बात के लिए' session' का उपयोग नहीं करते – voyager

+0

मुझे लगता है कि आपका मतलब उपयोगकर्ता लेख की जांच करना है, हां, मैं वास्तव में उन्हें उपयोगकर्ता भी दूंगा लेकिन मैं भी उपयोगकर्ताओं को आइटम पिक्स नहीं दिखाना चाहता हूं और इसके बजाय उन्हें क्रिप्ट करना चाहता हूं। – Hellnar

उत्तर

8

कोई एन्क्रिप्शन एल्गोरिदम नहीं है, प्रति से, पायथन में बनाया गया है। हालांकि, आप Python Cryptography Toolkit (PyCrypt) को देखना चाहेंगे। मैंने केवल इसके साथ tinkered है, लेकिन यह Python के दस्तावेज में cryptographic services पर संदर्भित है। यहाँ कैसे आप PyCrypt का उपयोग कर एईएस के साथ एक स्ट्रिंग एन्क्रिप्ट सकता है की एक उदाहरण है:

from Crypto.Cipher import AES 
from urllib import quote 

# Note that for AES the key length must be either 16, 24, or 32 bytes 
encryption_obj = AES.new('abcdefghijklmnop') 
plain = "Testing" 

# The plaintext must be a multiple of 16 bytes (for AES), so here we pad it 
# with spaces if necessary. 
mismatch = len(plain) % 16 
if mismatch != 0: 
    padding = (16 - mismatch) * ' ' 
    plain += padding 

ciph = encryption_obj.encrypt(plain) 

# Finally, to make the encrypted string safe to use in a URL we quote it 
quoted_ciph = quote(ciph) 

आप तो शायद GET अनुरोध के भाग के रूप में अपने URL के इस भाग होगा,।

डिक्रिप्ट करने के लिए, बस प्रक्रिया को उलट दें; यह सोचते हैं कि encryption_obj ऊपर के रूप में बनाया गया है, और है कि आप यूआरएल के प्रासंगिक भाग लिया गया गया है, इस लिए यह करना होगा: एक सरल विधि प्राथमिक हैश करने के लिए होगा:

from urllib import unquote 

# We've already created encryption_object as shown above 

ciph = unquote(quoted_ciph) 
plain = encryption_obj.decrypt(ciph) 

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

(। आप इस मार्ग से जाने के लिए चाहते हैं, बाहर अंतर्निर्मित संग्रहालय में hashlib जांच) उदाहरण के लिए, आप इस models.py में परिभाषित की तरह कुछ होगा:

class Pk_lookup(models.Model): 
    # since we're using sha256, set the max_length of this field to 32 
    hashed_pk = models.CharField(primary_key=True, max_length=32) 
    key = models.IntegerField() 

और तुम ' डी निम्नलिखित में से कुछ का उपयोग करके हैश उत्पन्न करता है:

import hashlib 
import Pk_lookup 

hash = hashlib.sha256() 
hash.update(str(pk)) # pk has been defined previously 
pk_digest = hash.digest() 

lookup = Pk_lookup(hashed_pk=pk_digest,key=pk) 
lookup.save() 

ध्यान दें कि आपको इस संस्करण को भी उद्धृत करना होगा; यदि आप चाहें, तो digest के बजाय hexdigest() का उपयोग कर सकते हैं (आपको परिणामी स्ट्रिंग को उद्धृत करने की आवश्यकता नहीं है), लेकिन आपको फ़ील्ड की लंबाई 64 तक समायोजित करना होगा।

+0

धन्यवाद मिर्च! – Hellnar

+0

मैंने आपकी विधि की कोशिश की और उद्धृत स्ट्रिंग को जोड़ा यूआरएल करने के लिए। लेकिन django विफल रहा। विवरण इस धागे पर देखा जा सकता है: http://stackoverflow.com/questions/8685139/django-cant-have-quoted-characters-in-urls –

0

Django के लिए अभी इसकी विशेषताएं हैं। https://docs.djangoproject.com/en/dev/topics/signing/

देखें कि पेज का हवाला देते हुए:

"Django पर हस्ताक्षर करने के मूल्यों के लिए दोनों एक निम्न स्तर एपीआई और स्थापित करने और हस्ताक्षर किए कुकीज़, वेब अनुप्रयोगों में हस्ताक्षर करने की सबसे आम उपयोग में से एक को पढ़ने के लिए एक उच्च स्तरीय एपीआई प्रदान करता है ।उपयोगकर्ताओं को, जो उनके पासवर्ड खो दिया है करने के लिए भेजने के लिए

  • जनरेट कर रहा है "अपने खाते को पुनर्प्राप्त" URL:

    आप निम्न के लिए उपयोगी पर हस्ताक्षर मिल सकता है।

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