Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी का अनावरण: कोई छिपा हुआ जादू नहीं, बस पारदर्शी कोड

आपने सुना होगा (या यहां तक कि खुद भी कहा होगा) कि रेल्स / रूबी में बहुत अधिक जादू है...

  • लेकिन वह विचार कहां से आता है?
  • रेल्स जादू वास्तव में क्या है?
  • और आप उस जादू को दूर करने के लिए क्या कर सकते हैं?

यहां मेरा विचार है:

जब कुछ जादू जैसा लगता है तो ऐसा इसलिए है क्योंकि कुछ ऐसा है जो आप नहीं जानते, कुछ जानकारी गायब है।

यह एक जादू की तरकीब की तरह है, यदि आप तरकीब जानते हैं तो कोई जादू नहीं है।

रूबी का अनावरण: कोई छिपा हुआ जादू नहीं, बस पारदर्शी कोड

सॉफ्टवेयर विकास में, तरकीबों को जानना चीजें वास्तव में कैसे काम करती हैं इसकी समझ रखने के बराबर है।

आइए एक उदाहरण देखें!

यह उदाहरण BCrypt के बारे में है, एक हैशिंग एल्गोरिदम जिसका उपयोग पासवर्ड को सुरक्षित रूप से संग्रहीत करने के लिए किया जाता है। यह bcrypt जेम के माध्यम से रूबी में लागू किया गया है।

यहां BCrypt का उपयोग करके "testing" शब्द को हैश करने का तरीका बताया गया है:

require 'bcrypt' BCrypt::Password.create("testing") # "$2a$10$3o.xrISG8fqKfzKqDpgKn.3cwjFV//9C9cZ7MuK5S9sNKFBivB7YG" BCrypt::Password.create("testing") # "$2a$10$BFb/e3cWuAIyelcmkfGtE.GTifXHxig4IzVbdZs9C1zSpF/Jr6c3W" BCrypt::Password.create("testing") # "$2a$10$Q952BVgM783Y4kPvwvxwC.CS2DWUX9jQuDoE6q2R041kQY0ZWPnSe" 

ध्यान दें कि आपको हर बार एक अलग हैश मिलता है, लेकिन अगर आप MD5 (मत करो!) या SHA1 जैसी किसी चीज़ का उपयोग करते हैं तो आपको दिए गए स्ट्रिंग के लिए हमेशा समान आउटपुट मिलेगा।

BCrypt अलग तरीके से व्यवहार क्यों कर रहा है?

मैं एक सेकंड में बताऊंगा कि क्या हो रहा है, लेकिन पहले देखते हैं कि आप दो bcrypt हैश की तुलना कैसे करते हैं, एक डेटाबेस से आ रहा है और एक उपयोगकर्ता इनपुट से (जैसे फॉर्म या ऐसा कुछ)।

BCrypt::Password.new(@user.hash) == params[:password] # true 

बाएं वाला हिस्सा (BCrypt::Password.new) एक BCrypt ऑब्जेक्ट है, जो पैरामीटर के रूप में डेटाबेस में संग्रहीत हैश लेता है।

दाएं वाला हिस्सा (params[:password]) सादा-पाठ पासवर्ड है जिसे उपयोगकर्ता लॉग इन करने का प्रयास कर रहा है।

इस मामले में हम मान लेते हैं कि सही उपयोगकर्ता / पासवर्ड संयोजन का उपयोग किया जा रहा है।

तो यह true का मूल्यांकन क्यों कर रहा है?

खैर, इसे समझने के लिए आपको दो चीजें जानने की जरूरत है:

  1. BCrypt "साल्ट" नामक किसी चीज़ का उपयोग करता है, जो पूर्व-गणना हैश के खिलाफ सुरक्षा बढ़ाने के लिए उपयोग किया जाने वाला एक यादृच्छिक मान है। साल्ट हैश में ही संग्रहीत होता है।
  2. रूबी में कई चीजें जो सिंटैक्स जैसी दिखती हैं वे सिर्फ मेथड्स हैं। यह डबल इक्वल्स ऑपरेटर (==) के लिए मामला है।

यह जानकर, मैं आपको बता सकता हूं कि BCrypt अपना स्वयं का == मेथड परिभाषित करता है, जो जानता है कि उस "साल्ट" मान को कैसे निकालना है ताकि पासवर्ड की तुलना करते समय उसे ध्यान में रखा जा सके।

दूसरे शब्दों में:

BCrypt#== संग्रहीत हैश से "साल्ट" मान लेता है।

फिर यह सादा-पाठ पासवर्ड (उपयोगकर्ता इनपुट) को इस साल्ट का उपयोग करके हैश करता है ताकि दोनों हैश समान होंगे यदि पासवर्ड वैध है।

यदि आप स्रोत कोड देखें तो यह कुछ इस तरह दिखेगा:

def ==(secret) super( BCrypt::Engine.hash_secret(secret, @salt) ) end 

याद रखें कि super उसी मेथड को (इस मामले में ==) पैरेंट क्लास पर कॉल करेगा।

BCrypt::Password की पैरेंट क्लास String है।

यह सब मेथड्स के बारे में है

समझने के लिए एक महत्वपूर्ण बात यह है कि कुछ कीवर्ड्स और कुछ सिंटैक्स तत्वों (जैसे पैरेंथेसिस) के अलावा, यह सब क्लासेस और मेथड्स के बारे में है।

यदि आप जानते हैं कि आप किस क्लास के साथ काम कर रहे हैं (जिसे आप class मेथड का उपयोग करके जांच सकते हैं) तो आप हमेशा जान पाएंगे कि कौन से ऑपरेशन (मेथड्स) उपलब्ध हैं।

लेकिन कभी-कभी हमारे पास बिना ऑब्जेक्ट के सिर्फ एक मेथड कॉल होता है।

इसका अक्सर मतलब होता है कि मेथड वर्तमान क्लास में परिभाषित है, लेकिन यह हमेशा ऐसा नहीं होता।

उदाहरण:

puts 123 

puts कहां परिभाषित है? आइए पता करें:

method(:puts).owner # Kernel 

एक और चीज़ जो भ्रमित कर सकती है वह है मेटाप्रोग्रामिंग, क्योंकि मेटाप्रोग्रामिंग के साथ आप प्रोग्राम निष्पादन के दौरान मेथड्स बना, संशोधित या यहां तक कि हटा सकते हैं। ये चीजें कोड को अधिक अपारदर्शी और अस्पष्ट बनाती हैं।

आप इस भ्रम को कम कर सकते हैं यह जानकर कि कौन से मेटाप्रोग्रामिंग मेथड्स उपलब्ध हैं और वे कैसे काम करते हैं।

सारांश

आपने सीखा कि चीजें वास्तव में कैसे काम करती हैं इसकी गहरी समझ आपको किसी भी "जादू" को दूर करने, बेहतर कोड लिखने और आपको एक बेहतर डेवलपर बनाने में कैसे मदद कर सकती है।

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

  1. Ruby में Lambdas में महारत हासिल करें: बुनियादी से उन्नत तकनीकें तक Ruby में Lambdas में महारत हासिल करें: बुनियादी से उन्नत तकनीकें तक

    ब्लॉक Ruby का इतना महत्वपूर्ण हिस्सा हैं, उनके बिना भाषा की कल्पना करना कठिन है। लेकिन लैम्ब्डा? कौन लैम्ब्डा से प्यार करता है? आप वर्षों तक बिना एक का उपयोग किए जा सकते हैं। वे लगभग एक बीते युग के अवशेष लगते हैं। ...लेकिन यह पूरी तरह सच नहीं है। लैम्ब्डा की आस्तीन में कुछ दिलचस्प तरकीबें हैं एक बार

  1. रूबी के साथ इंसर्शन सॉर्ट में महारत: एक चरण-दर-चरण गाइड रूबी के साथ इंसर्शन सॉर्ट में महारत: एक चरण-दर-चरण गाइड

    नोट: यह रूबी के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर एक श्रृंखला का भाग 4 है। भाग 1 ने बबल सॉर्ट का पता लगाया, भाग 2 ने सिलेक्शन सॉर्ट का पता लगाया, और भाग 3 ने मर्ज सॉर्ट का पता लगाया। जैसा कि हम डेटा को सॉर्ट करने के लिए विभिन्न पद्धतियों का पता लगाना जारी रखते हैं, हम इंसर्शन सॉर्ट की

  1. Ruby 2.6 में 9 प्रमुख संवर्द्धन का अन्वेषण Ruby 2.6 में 9 प्रमुख संवर्द्धन का अन्वेषण

    Ruby का एक नया संस्करण नई सुविधाओं और प्रदर्शन सुधारों के साथ आ रहा है। क्या आप परिवर्तनों के साथ बने रहना चाहेंगे? आइए एक नज़र डालते हैं! अंतहीन रेंज (Endless Ranges) Ruby 2.5 और पुराने संस्करण पहले से ही अंतहीन रेंज का एक रूप (Float::INFINITY के साथ) का समर्थन करते हैं, लेकिन Ruby 2.6 इसे अगले स्त