ডেটাবেজে পাসওয়ার্ড সংরক্ষণ – ১

ডেটাবেজে নিরাপদভাবে পাসওয়ার্ড সংরক্ষণ করা।

একবার একটা ওয়েবসাইটে ভুল পাসওয়ার্ড দিয়েছিলাম। সঙ্গে সঙ্গে পাসওয়ার্ড যে ভুল, সেই এরর মেসেজ স্ক্রিনে চলে আসল – “Hi subeen, your given password doesn’t match with the correct password a1b2c3. Please try again!”. ওই ওয়েবসাইটের প্রোগ্রামার আসলেই অনেক পরোপকারী (এর মানে হচ্ছে হেল্পফুল)। তো সবাই আবার ব্যবহারকারীর জন্য এত বেশি চিন্তা করে না। কয়েকবছর আগে বাংলাদেশের অন্যতম জনপ্রিয় ইকমার্স ওয়েবসাইটে (যেখান থেকে সবাই বই কিনে) পাসওয়ার্ড ভুলে যাওয়ায় সেটা রিসেট করতে দিই। তখন ইমেইলে ওরা সঠিক পাসওয়ার্ড পাঠিয়ে দেয়। কী চমৎকার, আমার আর কষ্ট করে নতুন পাসওয়ার্ড দিতে হলো না। বুঝা গেল যে তাদের প্রোগ্রামাররাও বেশ ভালো মানুষ, ব্যবহারকারীদের বেশি কষ্ট দিতে চান না। কিন্তু একটা কথা আছে, বেশি ভালো ভালো না। এজন্যই আজকের এই আর্টিকেল।

ডেটাবেজে আসলে পাসওয়ার্ড কখনও সরাসরি সংরক্ষণ করতে হয় না। করলে কী সমস্যা? অনেকেই একই পাসওয়ার্ড বিভিন্ন জায়গায় ব্যবহার করে। এখন কেউ যদি ডেটাবেজে প্রবেশ করে একজনের পাসওয়ার্ড জেনে যায়, তাহলে তার একাউন্ট হ্যাক হয়ে গেলো। আবার ওই ব্যক্তির অন্যান্য ওয়েবসাইটের একাউন্টেও ওই পাসওয়ার্ড দিয়ে ঢুকে যাওয়ার সম্ভাবনা প্রবল, যদি সে অন্য জায়গায়ও একই পাসওয়ার্ড ব্যবহার করে। তাই ডেটাবেজে কখনো সরাসরি পাসওয়ার্ড সেভ করতে হয় না। তাহলে উপায় কী?

ডেটাবেজে পাসওয়ার্ড সেভ করার জন্য সাধারণত পাসওয়ার্ডকে একটি হ্যাশ ফাংশনের মাধ্যমে পরিবর্তন করে তারপরে সেভ করতে হয়। এতে করে কেউ ডেটাবেজে একসেস পেয়ে গেলেও আসল পাসওয়ার্ড জানতে পারবে না। তাহলে একাউন্ট তৈরির সময় পাসওয়ার্ড সেভ করার অ্যালগরিদমটি কীরকম হবে?

  • ধরি অ্যাকাউন্ট তৈরি করার সময় কেউ তার ইউজারনেম u এবং পাসওয়ার্ড p দিল। u ও p এখানে স্ট্রিং।
  • ব্যাকএন্ডে, p-কে একটি হ্যাশ ফাংশনের মাধ্যমে আরেকটি স্ট্রিং hp-তে রূপান্তর করা হলো। এমন হ্যাশ ফাংশন ব্যবহার করতে হবে যেন, hp জানলে কেউ সেটি থেকে p বের করতে না পারে।
  • ডেটাবেজে ইউজারনেম u এবং পাসওয়ার্ড hp সেভ করা হলো।

এখন ধরা যাক একাউন্ট তৈরি করা হয়ে গেছে। লগিন করার সময় কীভাবে পাসওয়ার্ড পরীক্ষা করতে হবে?

  • লগিন করার সময় ইউজারনেম u এবং পাসওয়ার্ড p দেওয়া হলো।
  • একাউন্ট তৈরির সময় পাসওয়ার্ডের জন্য যেই হ্যাশ অ্যালগরিদম ব্যবহার করা হয়েছিল, একই অ্যালগরিদম ব্যবহার করে p-কে p1-এ রূপান্তর করতে হবে।
  • ডেটাবেজে কুয়েরি চালিয়ে ইউজারনেম u-এর সাথে পাসওয়ার্ড যেটি আছে, সেটি বের করে আনা হলো। ধরা যাক, সেটি হচ্ছে p2.
  • p1 ও p2 স্ট্রিংদুটি যদি সমান হয়, তাহলে পাসওয়ার্ড সঠিক।

এখন কথা হচ্ছে, আমরা কীরকম হ্যাশিং অ্যালগরিদম ব্যবহার করবো? হ্যাশিংয়ের জন্য বিভিন্ন রকম অ্যালগরিদম রয়েছে, এর মধ্যে কিছু অ্যালগরিদম অনেক শক্তিশালী, আবার কিছু হচ্ছে অপেক্ষাকৃত দুর্বল। তাই বিষয়টি জেনেশুনে ব্যবহার করতে হবে। আরেকটি গুরুত্বপূর্ণ বিষয় হচ্ছে, বিভিন্ন প্রোগ্রামিং ভাষায় হ্যাশিংয়ের জন্য লাইব্রেরি থাকে এবং সেখানে বিভিন্ন অ্যালগরিদম ইমপ্লিমেন্ট করে দেওয়া থাকে। তাই নিজে নতুন করে ইমপ্লিমেন্ট না করে লাইব্রেরি ফাংশন ব্যবহার করতে হবে, তাহলে বাগ থাকার সম্ভাবনা অনেক কমে যাবে।

এই লেখায় আমি ডেটাবেজে পাসওয়ার্ড সংরক্ষণ করার যেই ধারণা দিলাম, এটি হচ্ছে মূল ধারণা। তবে এর সঙ্গে কিছু জিনিস সংযোগ করে বিষয়টি আরো নিরাপদ করা যায়। পরবর্তী কোনো সময়ে সেই বিষয়ে সংক্ষিপ্ত আলোচনা করার ইচ্ছা রইল।

লিনাক্স সার্ভারে পাসওয়ার্ড ছাড়া লগইন

আমরা অনেকেই ssh টুল ব্যবহার করে রিমোট লিনাক্স সার্ভারে লগইন করি এবং প্রতিবারই পাসওয়ার্ড দেওয়া লাগে। এই পাসওয়ার্ড দেওয়ার ঝামেলাটা সহজেই এড়ানো যায়। এতে যেই কম্পিউটার থেকে লগিন করা হয়, সেখানে কি (key) তৈরি করে সার্ভারে সেটা দিয়ে দিতে হয়।

Monitor_padlock

এর জন্য নিচের ধাপগুলো অনুসরন করতে হবে :

১) প্রথম কাজ হচ্ছে একজোড়া পাবলিক-প্রাইভেট কি জোড়া (key pair) তৈরি করা। তার জন্য নিচের কমান্ড দিতে হবে :

ssh-keygen -t rsa

এর আউটপুট হবে এমন :
Generating public/private rsa key pair.
Enter file in which to save the key (/home/name/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/name/.ssh/id_rsa.
Your public key has been saved in /home/name/.ssh/id_rsa.pub.
The key fingerprint is:
08:3c:1a:b5:f1:e0:19:13:c5:f4:38:45:ea:e0:1d:91 name@name
The key’s randomart image is:
+–[ RSA 2048]—-+
|    B=+oo        |
|   + OE*         |
|  . O * .        |
|   + * +         |
|  . . + S        |
|                 |
|                 |
|                 |
|                 |
+—————–+

এখানে দুটি কি তৈরি হল। একটি হচ্ছে id_rsa – এটি প্রাইভেট কি (private key), আরেকটি হচ্ছে id_rsa.pub এটি পাবলিক কি (public key)।

২) এখন id_rsa.pub ফাইলটি সার্ভারে কপি করতে হবে (এর জন্য scp কমান্ড ব্যবহার করা যেতে পারে, বা অন্য উপায়েও করা যেতে পারে)।

৩) এবারে ফাইলটি সার্ভারের ~/.ssh/authorized_keys ফাইলে যুক্ত করে দিতে হবে, এই কমান্ড দিয়ে :
cat id_rsa.pub >> /home/name/.ssh/authorized_keys

৪) তারপরে এই কমান্ড দিতে হবে : chmod 600 /home/name/.ssh/authorized_keys (অপশনাল, মানে এই স্টেপ ফলো না করলেও চলে)।

এখন ssh কমান্ড দিয়ে পাসওয়ার্ড ছাড়াই সার্ভারে ঢোকা যাবে! তবে যেই কম্পিউটার থেকে কাজটি করা হয়েছে, মানে যেই কম্পিউটারের পাবলিক কি সার্ভারে কপি করা হয়েছে, সেই কম্পিউটার থেকেই পাসওয়ার্ড ছাড়া সার্ভারে লগিন করা যাবে। অন্য কম্পিউটার থেকে পাসওয়ার্ড লাগবে। আবার চাইলে সার্ভারের নিরাপত্তা বাড়ানোর জন্য পাসওয়ার্ড বেজড লগিন (password based authentication) বন্ধ করে দেওয়া যায়, তাতে যেসব কম্পিউটারের কি সার্ভারের কাছে আছে, কেবল সেসব কম্পিউটার থেকেই সার্ভারে লগিন করা যাবে।