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

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

একবার একটা ওয়েবসাইটে ভুল পাসওয়ার্ড দিয়েছিলাম। সঙ্গে সঙ্গে পাসওয়ার্ড যে ভুল, সেই এরর মেসেজ স্ক্রিনে চলে আসল – “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 স্ট্রিংদুটি যদি সমান হয়, তাহলে পাসওয়ার্ড সঠিক।

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

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

পাইথন দিয়ে এপিআই ব্যবহার – ২য় পর্ব

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

আমরা পাইথন প্রোগ্রাম থেকেই temperature নামে একটি টেবিল তৈরি করবো। এই টেবিলের প্রথম কলাম হবে একটি id নামক একটি ইন্টিজার। এটিকে আমরা প্রাইমারি কি, নট নাল এবং অটো-ইনক্রিমেন্ট হিসেবে উল্লেখ করে দিবো। যারা এই কথাটির অর্থ বুঝতে পারে নাই, তাদের চিন্তার কিছু নাই। এই কথার অর্থ না বুঝলেও লেখাটি পড়তে ও প্রোগ্রাম করতে কোনো সমস্যা হবে না। টেবিলে আমরা তাপমাত্রা ও বাতাসের আর্দ্রতা ছাড়াও তারিখ ও সময় সংরক্ষণ করব। 

পাইথন দিয়ে কিভাবে এসকিউলাইট ব্যবহার করতে হয়, সেটি জানা যাবে এখানে – https://docs.python.org/3/library/sqlite3.html। এখন টেবিল তৈরি করার জন্য আমরা এই কোড ব্যবহার করতে পারি –

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS temperature (id INTEGER PRIMARY KEY AUTOINCREMENT, temp REAL, humidity REAL, datetime TEXT)''')

আর বর্তমান তারিখ ও সময় বের করার জন্য এরকম কোড লিখব –

import datetime
current_time = datetime.datetime.now()

তাহলে আমার পুরো প্রোগ্রামটি দাঁড়াবে এরকম –

import requests
import json
import sqlite3
import datetime

conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS temperature (id INTEGER PRIMARY KEY AUTOINCREMENT, temp REAL, humidity REAL, datetime TEXT)''')

BASE_URL = "http://api.openweathermap.org/data/2.5/weather"

payload = {"id": "1337179", "APPID": "your api key"}

r = requests.get(BASE_URL, params=payload)
result = r.json()

temperature = result["main"]["temp"]
humidity = result["main"]["humidity"]

current_time = datetime.datetime.now()

c.execute('INSERT INTO temperature (temp, humidity, datetime) VALUES(?, ?, ?)', (temperature, humidity, current_time))

conn.commit()
conn.close()

এখন ওপরের প্রোগ্রামটি রান করলে ডেটাবেজে তাপমাত্রার তথ্য সংরক্ষিত হবে। আমরা টার্মিনাল থেকে বিষয়টি পরীক্ষা করতে পারি। যেই ফোল্ডার বা ডিরেক্টরি থেকে আমরা weather_info.py ফাইলটি রান করেছি, টার্মিনাল থেকে সেখানে গিয়ে আমরা এসকিউলাইট চালু করে তারপর টেবিলের ডেটা দেখতে পারি।

$ sqlite3 example.db
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> select * from temperature;
1|292.18|56.0|2019-07-29 23:35:32.797251

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

এসকিউলাইট – সহজ ডেটাবেজ

সহজ ডেটাবেজ এসকিউলাইট!

এসকিউলাইট (SQLite) হচ্ছে একটি রিলেশনাল ডেটাবেজ। সেই সঙ্গে এটি ফ্রি ও ওপেন সোর্স। ২০০০ সালে ডক্টর রিচার্ড হিপ এটি তৈরি করেন। এসকিউলাইট তৈরিতে সি প্রোগ্রামিং ভাষা ব্যবহার করা হয়েছে।

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

এসকিউলাইট হচ্ছে পৃথিবীর সবচেয়ে বহুল ব্যবহৃত ডেটাবেজ সফটওয়্যার – ওদের ওয়েবসাইটে এমনটিই দাবি করা হয়েছে। তার পেছনে অবশ্য একটি যুক্তি আছে, পৃথিবীর সকল অ্যন্ড্রয়েড ফোন, আইফোন, ম্যাক অপারেটিং সিস্টেম, উইন্ডোজ ১০ – সবগুলোতেই এসকিউলাইট ইনস্টল করা থাকে। আবার পিএইচপি, পাইথন – এরকম জনপ্রিয় প্রোগ্রামিং ভাষা ইনস্টল করলেও এদের সঙ্গে এসকিউলাইট ইনস্টল হয়ে যায়। এছাড়াও আরো অনেক অ্যাপ্লিকেশনে এসকিউলাইট ব্যবহার করা হয়।

এসকিউলাইটের সবচেয়ে বড় সুবিধা হচ্ছে এটির ব্যবহার বেশ সহজ-সরল আর ইনস্টল করাও খুব সহজ। এটি ক্লায়েন্ট-সার্ভার আর্কিটেকচারে তৈরি করা হয় নি, তাই সফটওয়্যারের সঙ্গে এটি দিয়ে দেওয়া যায় সহজেই।

এসকিউলাইটে রিলেশনাল ডেটাবেজের প্রায় সকল বৈশিষ্ট্যই রয়েছে এবং এসকিউএল (Structured Query Language)-এর অধিকাংশ জিনিসই এখানে ব্যবহার করা হয়েছে। তাই এটি ব্যবহার করার পর কেউ যদি অন্য ডেটাবেজের ব্যবহার শিখতে চায়, তখন তার বিপদে পড়তে হবে না।

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

এসকিউলাইট ব্যবহার করতে হলে যে টার্মিনালে (কমান্ড লাইনে) ব্যবহার করতে হবে, এমন কোনো কথা নেই। অনেক ডেস্কটপ অ্যাপ্লিকেশন দিয়ে এটি ব্যবহার করা যায় (যেমন – https://sqlitebrowser.org/)।

ডেটাবেজ শেখার সময়, “মশা মারতে কামান দাগার” মতো ওরাকল বা বিশাল কোনো ডেটাবেজ সফটওয়্যার ব্যবহার না করে এসকিউলাইট ব্যবহার করলেই ডেটাবেজ শেখাটা সহজ ও কার্যকর হবে। পরবর্তী সময়ে প্রফেশনাল কাজে অন্য কিছু শেখার দরকার পড়লে সেসময় শিখে নেওয়া যাবে।