आपने सुना होगा (या खुद भी कहा होगा) कि रेल / रूबी में बहुत अधिक जादू है…
- लेकिन यह विचार आता कहां से है?
- रेल का जादू वास्तव में क्या है?
- और उस जादू को दूर करने के लिए आप क्या कर सकते हैं?
मेरे विचार से यह है :
जब कोई चीज़ जादू की तरह लगती है तो ऐसा इसलिए होता है क्योंकि कुछ ऐसा है जिसे आप नहीं जानते हैं, कुछ जानकारी गायब है।
यह एक जादू की चाल की तरह है, यदि आप चाल जानते हैं तो कोई जादू नहीं है ।
सॉफ्टवेयर विकास में, ट्रिक्स जानना यह समझने के बराबर है कि चीजें वास्तव में कैसे काम करती हैं ।
आइए एक उदाहरण देखें!
यह उदाहरण 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
का मूल्यांकन क्यों कर रहा है? ?खैर, इसे समझने के लिए आपको दो बातें जानने की जरूरत है:
- BCrypt "नमक" नामक किसी चीज़ का उपयोग करता है, जो सुरक्षा बढ़ाने के लिए उपयोग किया जाने वाला एक यादृच्छिक मान है पूर्व-गणना हैश के खिलाफ। नमक हैश में ही जमा हो जाता है।
- रूबी में सिंटैक्स की तरह दिखने वाली कई चीजें सिर्फ तरीके हैं . डबल बराबर ऑपरेटर के लिए यह मामला है (
==
)।यह जानकर, मैं आपको बता सकता हूं कि
BCrypt
अपने स्वयं के==
. को परिभाषित करता है विधि, जो जानता है कि उस "नमक" मान को कैसे निकालना है ताकि पासवर्ड की तुलना करते समय इसे ध्यान में रखा जा सके।दूसरे शब्दों में :
BCrypt#==
संग्रहित हैश से "नमक" मान लेता है।फिर यह इस नमक का उपयोग करके सादा-पाठ पासवर्ड (उपयोगकर्ता इनपुट) हैश करता है ताकि पासवर्ड मान्य होने पर दोनों हैश समान हो जाएं।
यदि आप स्रोत कोड को देखें यह कुछ इस तरह दिखेगा:
def ==(secret) super(BCrypt::Engine.hash_secret(secret, @salt) )endयाद रखें कि
super
उसी विधि को कॉल करेगा (इस मामले में==
) मूल वर्ग पर।
BCrypt::Password
. का मूल वर्गString
है ।यह सभी विधियों के बारे में है
समझने वाली एक महत्वपूर्ण बात यह है कि कुछ कीवर्ड और कुछ सिंटैक्स तत्वों (जैसे कोष्ठक) के अलावा, यह सभी कक्षाओं और विधियों के बारे में है।
यदि आप जानते हैं कि आप किस वर्ग के साथ काम कर रहे हैं (जिसे आप
class
. का उपयोग करके देख सकते हैं विधि) आप हमेशा यह जान पाएंगे कि कौन से ऑपरेशन (तरीके) उपलब्ध हैं।लेकिन कभी-कभी हमारे पास बिना किसी ऑब्जेक्ट के सिर्फ एक मेथड कॉल होता है।
इसका अक्सर अर्थ यह होता है कि विधि को वर्तमान वर्ग में परिभाषित किया गया है, लेकिन हमेशा ऐसा नहीं होता है।
उदाहरण :
123 डालता है
puts
कहां है परिभाषित? आइए जानें:विधि(:पुट्स).स्वामी# कर्नेलएक और चीज जो भ्रामक हो सकती है वह है मेटाप्रोग्रामिंग, क्योंकि मेटाप्रोग्रामिंग से आप प्रोग्राम निष्पादन के दौरान विधियों को बना सकते हैं, संशोधित कर सकते हैं या हटा भी सकते हैं। ये चीजें कोड को अधिक अपारदर्शी और अस्पष्ट बनाती हैं।
मेटाप्रोग्रामिंग के कौन से तरीके उपलब्ध हैं और वे कैसे काम करते हैं, इसके बारे में जागरूक होकर आप भ्रम को कम कर सकते हैं।
सारांश
आपने सीखा कि कैसे चीजों के काम करने की गहरी समझ आपको किसी भी "जादू" को दूर करने में मदद कर सकती है, बेहतर कोड लिख सकती है और आपको एक बेहतर डेवलपर बना सकती है।
यदि आप अपने रूबी कौशल में सुधार करना चाहते हैं, तो मेरी पुस्तक रूबी डीप डाइव देखें, जिसे बुनियादी सिद्धांतों और अधिक उन्नत अवधारणाओं के बीच की खाई को पाटने के लिए डिज़ाइन किया गया है 🙂