Author: tamal.a.chowdhury@gmail.com

  • Hashing

    প্রোগ্রামিং এ Hashing হলো অনেকটা আলু ভর্তা বানানোর মতো। কোন ডেটা, পাসওয়ার্ড, বা ফাইলকে হ্যাশ করে তার একটি ভর্তা বানানো হয়।

    উদাহরণ-

    “1234” -> 81dc9bdb52d04dc20036dbd8313ed055

    ১) Hashing একটি one-way অপারেশন। একটি আলুকে একবার ভর্তা বানালে সেটা যেমন আবার আগের আলুর রূপে ফেরত আসে না (Practically) ঠিক তেমনি কোন ডেটাকে একবার Hash এ কনভার্ট করলে সেটা আগের রূপে ফেরত আনা যায় না।

    আমরা যখন কোন সফটওয়্যার বানাই, তখন ইউজারের পাসওয়ার্ড এই রকম plaintext (যেমন 1234) এ সেভ করে রাখলে সেই ডেটাবেজ নিয়ে নাড়াচাড়া করা অনেক বিপদজনক হয়ে পরে। যেকোন সময় ডেটা লিক, বা হ্যাকার যদি ডেটা চুরি করে ফেলে তাহলে সব ইউজারের পাসওয়ার্ড ফাঁস হয়ে যাবে।

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

    ২) Hashing algorithm গুলো deterministic হয়ে থাকে। এর মানে হলো, একটি ডেটাকে কোন একটি algorithm দিয়ে hash করলে সব সময় একই ভ্যালু বের হবে।

    অর্থাৎ 1234 –এই পাসওয়ার্ডটিকে MD5 হ্যাশিং এলগোরিদম দিয়ে হ্যাশ করলে সবসময় এর ভ্যালু এটাই বের হবে- 81dc9bdb52d04dc20036dbd8313ed055

    আমাকে কখনোই ইউজারের পাসওয়ার্ড 1234 সেভ করে রিস্ক নিতে হবে না। সে যখন আবার এই পাসওয়ার্ড এন্টার করবে, আমি আবার হ্যাশ করে আমার ডেটাবেজে সেভ করা হ্যাশের সাথে মিলিয়ে দেখবো। দুটি হ্যাশ মিলে গেলেই বুঝবো তার পাসওয়ার্ড সঠিক।

    কিন্তু এখানে একটি বড় রকমের ঝুঁকি আছে।

    যদি দুইজন ইউজার একই পাসওয়ার্ড সেট করে, তাহলে তাদের দুইজনের হ্যাশ সেইম হবে তাই না?

    1234 এর মত দশ লক্ষ কমন পাসওয়ার্ড আছে যেগুলো হ্যাকাররা আগে থেকে হ্যাশ করে একটি ডেটাবেজ বানিয়ে রেখেছে।

    এখন হ্যাকার যদি একটি ডেটাবেজ চুরি করে ফেলে, তখন তার জাস্ট এই হ্যাশ গুলো মিলিয়ে দেখলেই হবে। যদি কোন হ্যাশ ভ্যালু 81dc9bdb52d04dc20036dbd8313ed055 হয়, তার মানে এর পাসওয়ার্ড হলো 1234

    ৩) দুজন ইউজার যদি একই পাসওয়ার্ড সেট করে, তাহলে যেন তাদের হ্যাশ ভ্যালু একই না হয়ে যায়, তাই এখানে Salt ইউজ করা হয়। দুটি একই রকম আলুতে যদি দুই পরিমাণ লবণ দেওয়া হয়, তাহলে দুটি ভর্তাই আলাদা হবে। এখান আমার প্রোগ্রাম প্রথম ইউজারের ডেটা নিবে, তারপর সেই ডেটাকে হ্যাশ না করে, একটি random salt জেনারেট করে সেখানে এড করবে। এইবার সেই ডেটা আর salt একসাথে হ্যাশ করবে। ফলাফল দুইজন যদি একই পাসওয়ার্ড 1234 সাবমিট করে, তাদের salt ভ্যালু আলাদা হবার কারণে হ্যাশটিও আলাদা হবে।

    এই salt ভ্যালুটি ডাটাবেজ হ্যাশের সাথে সেভ করে রাখা হয়। হ্যাকার যদি salt সহ হ্যাশগুলো চুরি করে ফেলে তারপরেও তার প্রত্যেকটি পাসওয়ার্ড ক্র্যাক করার জন্য আলাদা করে খাটতে হবে।

    ৪) এই হ্যাশিংকে আরেকধাপে সিকিউর করার জন্য pepper বা মরিচ ইউজ করা হয়। আলু ভর্তায় লবণ দিলাম, এবার যদি আমার পছন্দের কাচা মরিচ এড করি, তাহলে এমন এক ইউনিক ভর্তা হবে, যেটা অন্য কোন ভর্তার সাথে মিলবে না।

    এই pepper আরেকটি পাসওয়ার্ড বা সিক্রেট কোড যা আমার প্রোগ্রামের কনফিগারেশনে সেভ করা থাকে। এবার যখন ইউজার নতুন পাসওয়ার্ড সেট করবে তখন এভাবে হ্যাশ জেনারেট হবে-

    ইউজারের টাইপ করা পাসওয়ার্ড + Random Salt + Developer Pepper
    = Hash value

    এর সুবিধা হলো, হ্যাকার যদি salt সহ ডেটাবেজ চুরি করে ফেলে, তাহলেও সে pepper পাচ্ছে না। যার ফলে পাসওয়ার্ড ক্র্যাক করা আরো কঠিন হয়ে যাবে।

    কয়েকটি জনপ্রিয় হ্যাশিং এলগোরিদম-

    MD5
    SHA1
    SHA256

    সতর্কতাঃ- নতুন লার্নারদের বোঝার সুবিধার জন্য এখানে MD5 হ্যাশিং এলগোরিদম এর কথা উল্লেখ করেছি। প্র্যাকটিকালি MD5 দিয়ে কোন পাসওয়ার্ড বা সেনসেটিভ ডেটা সিকিউর করা আর রেকমেন্ডেড না কারণ ২০০০ সালের দিকেই এই এলগরিদমটি ক্র্যাক করে ফেলা হয়েছে।

    পাসওয়ার্ড হ্যাশ করার জন্য বর্তমানে যেসব এলগোরিদম ইউজ হয় সেগুলো হলো-

    bcrypt
    scrypt

  • প্রোগ্রামিং এর জন্য কোন কম্পিউটার ভালো?

    প্রোগ্রামিং করতে হলে তোমার একটা কম্পিউটার লাগবে। তোমার প্রথম কম্পিউটার দিয়েই তুমি কোডিং শিখবে, প্র্যাকটিস করবে, আর সফটওয়্যার বানাবে। এখন তোমার কাছে দুইটা অপশন আছেঃ ১) ডেস্কটপ কম্পিউটার, ২) ল্যাপটপ কম্পিউটার।

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

    এই লেখাটা যারা পড়ছো, আমি ধারনা করছি তুমি মাত্রই শুরু করছো আর তুমি যেকোন একটা অপশন এখন নিতে পারবে। তাহলে চলো ডেস্কটপ আর ল্যাপটপ দুইটার ব্যাপারেই আলোচনা করিঃ

    ডেস্কটপ কম্পিউটারে কোডিং

    ডেস্কটপ কম্পিউটার মানে তোমার টেবিলের মধ্যে এই পিসিটা সেটাপ করা থাকে। এর আলাদা মনিটর, মাউস, কী-বোর্ড থাকবে। ডেস্কটপে তুমি তোমার সুবিধা মত মাউস, কী-বোর্ড, মনিটর, এমন কি সিপিইউ কেসিং পাল্টাতে পারবে।

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

    আমার সবচেয়ে ভালো যে জিনিসটা লাগে সেটা হলো বড় স্ক্রিনে কাজ করা। আমার মনিটরটা ২২ ইঞ্চি। আমি চাইলে আরো বড় মনিটর, বা একাধিক মনিটরও কানেক্ট করতে পারবো।

    ডেস্কটপে কাজ করতে হলে তোমার সেই একটা ডেস্কে বসেই কাজ করতে হবে। তার মানে যেই রুম আর টেবিলে তোমার মূল ডেস্কটপটা সেটাপ করা আছে, সেখানে বসেই তোমাকে কাজ করতে হবে।

    বাংলাদেশের অনেক এলাকায় লোডশেডিং একটা সমস্যা। ঘন ঘন লোডশেডিং হলে কিন্তু পিসি অফ হয়ে যাবে। বর্তমানে পিসির পাওয়ার ব্যাকাপ হিসেবে একটা UPS ডিভাইস আমরা কিনে নেই। বেসিক ইউ পি এস গুলো মাত্র ১০-১৫ মিনিট পিসির পাওয়ার ব্যাকাপ দেয়। এই অল্প সময়ে তুমি যাস্ট তোমার কাজটা সেভ করে রেখে দিতে পারো, আর কিছু না। এর চেয়েও বেশি ব্যাকাপ চাইলে তোমাকে তোমার পিসি তোমার বাসার IPS এর সাথে কানেক্ট করে রাখতে হবে। তাই যদি তোমার এখানে সব সময় কারেন্ট আসা-যাওয়া করে, তাহলে ডেস্কটপে কাজ করলে তোমার প্রোডাক্টিভিটির ব্যাপক হ্যাম্পার হবে।

    যদি কারেন্টের ব্যাকাপটা তুমি ম্যানেজ করতে পারো, বা তোমার এখানে লোডশেডিং কোন সমস্যা না, তাহলে ডেস্কটপ কম্পিউটার, প্রোগ্রামিং করার জন্য সবচেয়ে বেস্ট অপশন হবে।

    এখন চলো ল্যাপটপের কথা বলিঃ

    ল্যাপটপ কম্পিউটারে কোডিং

    ল্যাপটপে কাজ করার সবচেয়ে বড় সুবিধা হলো, এটা পোর্টেবল। যেখানে সেখানে নিয়ে, শুয়ে বসে তুমি কিছু না কিছু কাজ করতে পারবে। তোমার যদি সব সময় বিভিন্ন যায়গায় ট্রাভেল করতে হয়, যেমন বাসা, অফিস, কলেজ, কফি শপ, তাহলে ল্যাপটপ তোমার জন্য বেস্ট হবে।

    ল্যাপটপের বিল্ট ইন ব্যাটারিতে পাওয়ার ব্যাকাপ থাকে তাই কারেন্ট চলে গেলেও এক ঘন্টা অনায়াসেই প্রোগ্রামিং করে ফেলতে পারবে। বর্তমানের প্রায় সব ল্যাপটপই ৩-৪ ঘন্টার ব্যাটারি ব্যাকপের দাবি করে। তাই একবার ফুল চার্জ দিয়ে তুমি একটা কোডিং সেশন চালিয়ে দিতে পারবে।

    পোর্টেবল হওয়া সত্বেও এর কিছু অসুবিধাও আছে। ল্যাপটপ অনেক দিন ব্যাবহার করার পরে এর ব্যাটারি ব্যাকাপ কমে যায়। যার ফলে সব সময় তোমাকে পাওয়ার ক্যাবল নিয়ে ঘুরতে হবে। নতুন একটা ব্যাটারি কিনলেও দেখা যায় এটা অরিজিনাল ব্যাটারির মত এত টেকসই হয় না।

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

    ল্যাপটপে কাজ করলে টাইপিং আর ট্র্যাকপ্যাড ইউজ করা অনেকের জন্য ঝামেলা হতে পারে। যার জন্য প্রায়ই অনেকে ল্যাপটপের সাথে আলাদা মাউস আর কী-বোর্ড ইউজ করে। আমি এখন ল্যাপটপের সাথে আলাদা মাউস ইউজ করি।

    ফাইনালি, ল্যাপটপের ছোট স্ক্রিন কোডিং এর জন্য অসুবিধা হতে পারে, কিন্তু আমার অভিজ্ঞতা বলে যে এই ছোট স্ক্রিনে কাজ করতে করতে অভ্যাস হয়ে যায়।

    ল্যাপটপ যদিও যেখানে সেখানে নিয়ে শুয়ে বসে কাজ করা যায়, কিন্তু আমি সাজেস্ট করবো ল্যাপটপও তুমি একটা চেয়ার টেবিলে বসে ইউজ করো। কোন একটা ডেডিকেটেট চেয়ার টেবিলে কাজ করলে আরো মনোযোগ দিয়ে কাজ করা যায়।

    এখন যখন তুমি ডেস্কটপ ল্যাপটপ দুইটারই সুবিধা অসুবিধা জেনে গেছো, চলো দেখা যাক প্রোগ্রামিং এর জন্য কেমন কনফিগারেশনের পিসি তোমার দরকারঃ

    প্রোগ্রামিং এর জন্য কেমন কনফিগারেশন লাগবে?

    গত ২-৩ বছরে বের হয়েছে, এমন যেকোন কনফিগারেশনের ল্যাপটপ বা ডেস্কটপেই প্রোগ্রামিং করা যাবে। আমরা যদি আরেকটু ডিটেইলস এ যাইঃ

    প্রসেসর/সিপিইউ

    Intel, আর AMD Ryzen বর্তমানের ভালো প্রসেসর। তুমি যখন প্রোগামিং প্রোজেক্ট রান করবে, এই প্রসেসরের পাওয়ারই নির্ভর করবে কোডটা কত তারাতারি প্রসেস হবে। তাই যত ভালো স্পিডের প্রসেসর নিবে, তত ফাস্ট তোমার পিসি চলবে।

    এই দুই প্রোসেসর কোম্পানীর জেনারেশন আছে, যত পরের জেনারেশন, তত ভালো এই প্রসেসরটা কাজ করবে। যেমন ইন্টেলের এখন ১২ তম জেনারেশন চলছে। তার মানে ১২ জেনারেশনের প্রসেসর, স্বাভাবিক ভাবেই, ১১ তম জেনারেশনের চেয়ে ভালো হবে।

    কিন্তু,

    এর মধ্যে আরেকটা ভেরিয়েশন আছেঃ

    ইন্টেলের তিন চারটা সিরিজের প্রসেসর আছেঃ Core i3, Core i5, Core i7 ইত্যাদি। এক একটা কোর, আরো বেশি পাওয়ারফুল। তাই তোমার বাজেট অনুযায়ী একটা Core সিরিজের প্রসেসর নিবে।

    অন্য দিকে তুমি যদি AMD Ryzen এর প্রসেসর নাও, তাহলে Ryzen 5 বা Ryzen 7 সিরিজের টা নিবে।

    র‍্যাম

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

    বর্তমানে তুমি টার্গেট রাখবে ১৬ জিবির বেশি DDR4 র‍্যাম নিতে। ১৬ জিবি না পারলে অন্তত ৮ জিবির নিচে ডেস্কটপ বা ল্যাপটপ নিও না।

    DDR4 হলো র‍্যাম এর ৪র্থ জেনারেশন। অবশ্যই DDR4 র‍্যামগুলো তার আগের জেনারেশন DDR3, আর DDR2 এর চেয়ে বেটার। এই জিনিসটাও মাথায় রাখবে।

    একটা প্রোগ্রামিং কম্পিউটার বানাতে প্রসেসর আর র‍্যামই সবচেয়ে বেশি গুরুত্বপূর্ন। বাকি সব জিনিসগুলো তোমার পছন্দ অনুয়ায়ী নিয়ে নিবে।

    কত বাজেটের পিসি বা ল্যাপটপ কিনবো?

    ১৬ জিবি র‍্যাম আর লেটেস্ট প্রসেসর এর একটা নতুন পিসি বা ল্যাপটপ এর জন্য বর্তমান বাজারে তোমাকে ৫০-৬০,০০০ টাকা খরচ করতে হবে।

    এখানে স্টারটেক থেকে একটা লেটেস্ট ল্যাপটপ দেখালামঃ

    এখানে আরেকটা প্রি-কনফিগারেশন করা পিসি দিলামঃ

    আমার সাজেস্ট করা কনফিগারেশন অনুযায়ী নতুন একটা ডেস্কটপ বা ল্যাপটপ এর জন্য আনুমানিক ৫০-৬০ হাজার টাকা লাগবে। কিন্তু যদি তুমি আরো ঘাটাঘাটি করো, আর নিজের জন্য কাস্টমাইজ একটা ডেস্কটপ বানাও তাহলে হয়তো আরো কিছু টাকা সেভ করতে পারবে।

    সেকেন্ড হ্যান্ড ল্যাপটপ বা ডেস্কটপ এর ব্যাপারে

    তুমি যদি অভিজ্ঞ পিসি/ল্যাপটপ ইউজার না হয়ে থাকো তাহলে সেকেন্ড হ্যান্ড বা রিফারবিশ ল্যাপটপ না নেওয়াই ভালো। এখন যদি তোমার বাজেট একদমই কম থাকে, তাহলে তুমি একদম নতুন 3rd, 4th জেনারেশনের একটা ডেস্কটপ বানিয়ে নিতে পারবে।

    পুরনো ডেস্কটপ সাধারনত পুরনো ল্যাপটপের চেয়ে বেশি টেকসই হয়। তাই যদি সেকেন্ড হ্যান্ড নিতে হয় তাহলে পুরনো একটা ডেস্কটপ নিও।

    এখন যেহেতু তুমি পিসির একটা ভালো ধারনা পেয়ে গেছো, আগামী কয়েক সপ্তাহ আরো রিসার্চ করে একটা পিসি বা ল্যাপটপ নিয়ে নাও।