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

रूबी में कोई जादू नहीं है

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

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

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

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

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

रूबी में कोई जादू नहीं है

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

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

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

यहां BCrypt का उपयोग करने का तरीका बताया गया है "परीक्षण" शब्द को हैश करने के लिए:

'bcrypt'BCrypt::Password.create("testing")# "$2a$10$3o.xrISG8fqKfzKqDpgKn.3cwjFV//9C9cZ7MuK5S9sNKFBivB7YG"BCrypt::Password.create("a$10")# की आवश्यकता है# BFb/e3cWuAIyelcmkfGtE.GTifXHxig4IzVbdZs9C1zSpF/Jr6c3W"BCrypt::Password.create("testing")# "$2a$10$Q952BVgM783Y4kPvwvxwC.Pre>DoE6DWUXR04k"Yz2DWUXR04k 

ध्यान दें कि आप हर बार एक अलग हैश कैसे प्राप्त करते हैं, लेकिन यदि आप MD5 (नहीं!)

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 . का उपयोग करके देख सकते हैं विधि) आप हमेशा यह जान पाएंगे कि कौन से ऑपरेशन (तरीके) उपलब्ध हैं।

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

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

उदाहरण :

123 डालता है

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

विधि(:पुट्स).स्वामी# कर्नेल

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

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

सारांश

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

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


  1. रूबी में लैम्ब्डा का उपयोग करना

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

  1. रूबी में इंसर्शन सॉर्ट को समझना

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

  1. रूबी में 9 नई सुविधाएँ 2.6

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