আপনি হয়তো শুনেছেন (অথবা নিজেও বলেছেন) যে রেইলস/রুবির খুব বেশি জাদু আছে…
- কিন্তু এই ধারণা কোথা থেকে আসে?
- রেইলস ম্যাজিক আসলে কি?
- এবং সেই জাদুটি দূর করতে আপনি কী করতে পারেন?
আমি যা মনে করি তা এখানে :
যখন কিছু জাদুর মত মনে হয়, কারণ এমন কিছু আছে যা আপনি জানেন না, কিছু তথ্য অনুপস্থিত থাকে।
এটি একটি জাদুর কৌশলের মতো, যদি আপনি কৌশলটি জানেন তবে কোন যাদু নেই .
সফ্টওয়্যার ডেভেলপমেন্টে, কৌশলগুলি জানা জিনিসগুলি কীভাবে কাজ করে তা বোঝার সমতুল্য .
একটি উদাহরণ দেখা যাক!
এই উদাহরণটি BCrypt
সম্পর্কে , একটি হ্যাশিং অ্যালগরিদম নিরাপদে পাসওয়ার্ড সংরক্ষণ করতে ব্যবহৃত হয়। এটি রুবিতে bcrypt
এর মাধ্যমে প্রয়োগ করা হয় মণি।
BCrypt
কীভাবে ব্যবহার করবেন তা এখানে "পরীক্ষা" শব্দটি হ্যাশ করতে:
'bcrypt'BCrypt::Password.create("testing")# "$2a$10$3o.xrISG8fqKfzKqDpgKn.3cwjFV//9C9cZ7MuK5S9sNKFBivB7YG"BCrypt::$1"$1"$2 তৈরি করা"$1 শব্দের প্রয়োজন। BFb/e3cWuAIyelcmkfGtE.GTifXHxig4IzVbdZs9C1zSpF/Jr6c3W"BCrypt::Password.create("testing")# "$2a$10$Q952BVgM783Y4kPvwvxDwDwCe02SQP04QPVJQPRENলক্ষ্য করুন কিভাবে আপনি প্রতিবার একটি ভিন্ন হ্যাশ পান, কিন্তু আপনি যদি MD5 (করবেন না!) বা SHA1 এর মতো কিছু ব্যবহার করেন তবে আপনি একটি প্রদত্ত স্ট্রিংয়ের জন্য সবসময় একই আউটপুট পাবেন।
কেন
BCrypt
অন্যরকম আচরণ করছেন?আমি এক সেকেন্ডের মধ্যে কী ঘটছে তা ব্যাখ্যা করব, তবে প্রথমে দেখা যাক আপনি কীভাবে দুটি bcrypt তুলনা করেন হ্যাশ, একটি ডাটাবেস থেকে এবং একটি ব্যবহারকারীর ইনপুট থেকে (যেমন একটি ফর্ম বা এরকম কিছু)।
BCrypt::Password.new(@user.hash) ==params[:password]# সত্যবাম দিকের অংশ (
BCrypt::Password.new
) হল একটিBCrypt
অবজেক্ট, যা ডাটাবেসে সংরক্ষিত হ্যাশকে প্যারামিটার হিসেবে নেয়।ডানদিকের অংশ (
params[:password]
) হল প্লেইন-টেক্সট পাসওয়ার্ড যা ব্যবহারকারী লগ ইন করার চেষ্টা করছে।এই ক্ষেত্রে আমরা অনুমান করি যে একটি সঠিক ব্যবহারকারী/পাসওয়ার্ড সংমিশ্রণ ব্যবহার করা হচ্ছে।
তাহলে কেন এটিকে
true
হিসেবে মূল্যায়ন করা হচ্ছে ?আচ্ছা, এটা বোঝার জন্য আপনাকে দুটি জিনিস জানতে হবে:
- BCrypt একটি "লবণ" নামক কিছু ব্যবহার করে, যা নিরাপত্তা বাড়াতে ব্যবহৃত একটি এলোমেলো মান প্রাক-গণনা করা হ্যাশের বিরুদ্ধে। লবণ হ্যাশের মধ্যেই সংরক্ষণ করা হয়।
- রুবিতে অনেক জিনিস যা সিনট্যাক্সের মতো দেখায় তা কেবল পদ্ধতি . এটি ডাবল সমান অপারেটরের ক্ষেত্রে (
==
)।এটা জেনে, তাহলে আমি আপনাকে বলতে পারি যে
BCrypt
এর নিজস্ব==
সংজ্ঞায়িত করে পদ্ধতি, যা জানে কিভাবে সেই "লবণ" মানটি বের করতে হয় যাতে পাসওয়ার্ড তুলনা করার সময় এটি বিবেচনায় নিতে পারে।অন্য কথায় :
BCrypt#==
সঞ্চিত হ্যাশ থেকে "লবণ" মান নেয়।তারপরে এটি এই লবণ ব্যবহার করে প্লেইন-টেক্সট পাসওয়ার্ড (ব্যবহারকারীর ইনপুট) হ্যাশ করে যাতে পাসওয়ার্ড বৈধ হলে উভয় হ্যাশ অভিন্ন হয়।
আপনি যদি সোর্স কোডটি দেখতে চান এটি দেখতে এরকম কিছু হবে:
def ==(গোপন) সুপার( BCrypt::Engine.hash_secret(secret, @salt) )endমনে রাখবেন যে
super
একই পদ্ধতিতে কল করবে (এই ক্ষেত্রে==
) প্যারেন্ট ক্লাসে।
BCrypt::Password
এর মূল শ্রেণী হলString
.এটি সমস্ত পদ্ধতি সম্পর্কে
একটি গুরুত্বপূর্ণ বিষয় বুঝতে হবে যে কয়েকটি কীওয়ার্ড এবং কয়েকটি সিনট্যাক্স উপাদান (যেমন বন্ধনী) ব্যতীত, এটি ক্লাস এবং পদ্ধতি সম্পর্কে।
যদি আপনি জানেন যে আপনি কোন ক্লাসে কাজ করছেন (যা আপনি
class
ব্যবহার করে চেক করতে পারেন পদ্ধতি) আপনি সর্বদা জানতে পারবেন কোন অপারেশন (পদ্ধতি) উপলব্ধ।কিন্তু কখনও কখনও আমাদের কাছে বস্তু ছাড়াই একটি পদ্ধতি কল থাকে৷
৷প্রায়শই এর অর্থ বর্তমান ক্লাসে পদ্ধতিটি সংজ্ঞায়িত করা হয়, তবে এটি সর্বদা হয় না।
উদাহরণ :
123 রাখেকোথায়
puts
সংজ্ঞায়িত? চলুন জেনে নেওয়া যাক:পদ্ধতি(:পুট) মালিক# কার্নেলআরেকটি বিষয় যা বিভ্রান্তিকর হতে পারে তা হল মেটাপ্রোগ্রামিং, কারণ মেটাপ্রোগ্রামিং এর মাধ্যমে আপনি প্রোগ্রাম এক্সিকিউশনের সময় মেথড তৈরি করতে, পরিবর্তন করতে বা অপসারণ করতে পারেন। এই জিনিসগুলি কোডটিকে আরও অস্বচ্ছ এবং অস্পষ্ট করে তোলে৷
৷কোন মেটাপ্রোগ্রামিং পদ্ধতি উপলব্ধ এবং তারা কীভাবে কাজ করে সে সম্পর্কে সচেতন হয়ে আপনি বিভ্রান্তি কমাতে পারেন।
সারাংশ
আপনি শিখেছেন যে কীভাবে জিনিসগুলি কাজ করে তার গভীর উপলব্ধি আপনাকে যে কোনও "জাদু" দূর করতে, আরও ভাল কোড লিখতে এবং আপনাকে আরও ভাল বিকাশকারী করতে সাহায্য করতে পারে৷
আপনি যদি আপনার রুবি দক্ষতা উন্নত করতে চান তবে আমার বইটি দেখুন, রুবি ডিপ ডাইভ, যা মৌলিক এবং আরও উন্নত ধারণাগুলির মধ্যে ব্যবধান পূরণ করার জন্য ডিজাইন করা হয়েছে 🙂