টোকেন জেনারেটর

আপনার ব্রাউজারে ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী র্যান্ডম টোকেন, API কী, সিক্রেট এবং ননস জেনারেট করুন। দৈর্ঘ্য, ক্যারেক্টার সেট এবং কতগুলো তৈরি করবেন তা বেছে নিন।

র্যান্ডম, অপ্রত্যাশিত টোকেন। সমস্ত র্যান্ডমনেস ব্রাউজারের crypto.getRandomValues থেকে আসে, একই উৎস যা ব্রাউজারগুলো TLS কী-র জন্য ব্যবহার করে। আপনার ডিভাইস থেকে কিছুই বের হয় না।

কী একটি টোকেনকে ব্যবহারের জন্য নিরাপদ করে

র্যান্ডম মানে অপ্রত্যাশিত নয়

বেশিরভাগ ভাষায় দুটি খুব ভিন্ন র্যান্ডম নম্বর জেনারেটর থাকে। Math.random(), rand() এবং অনুরূপগুলো ক্লকের মতো সস্তা কিছু থেকে সিড করা দ্রুত ছদ্ম-র্যান্ডম জেনারেটর। প্লেলিস্ট শাফল করার জন্য এগুলো ঠিক আছে কিন্তু টোকেনের জন্য বিপর্যয়কর, কারণ একজন আক্রমণকারী কয়েকটি আউটপুট পর্যবেক্ষণ করে প্রায়ই অভ্যন্তরীণ অবস্থা পুনরুদ্ধার করতে পারে এবং জেনারেটরটি কখনো নির্গত করবে এমন প্রতিটি মান পুনরুৎপাদন করতে পারে।

একটি ক্রিপ্টোগ্রাফিকভাবে নিরাপদ জেনারেটর এমনভাবে নির্মিত যাতে অতীতের আউটপুট দেখা ভবিষ্যতের আউটপুট সম্পর্কে কিছুই জানায় না। ব্রাউজারে এটি crypto.getRandomValues(), যা অপারেটিং সিস্টেমের এনট্রপি পুল থেকে অঙ্কন করে। এই টুল শুধুমাত্র এটি ব্যবহার করে। আপনি যদি নিজের কোডে টোকেন জেনারেট করেন, সমতুল্যগুলো হলো Python-এ secrets, Go-তে crypto/rand এবং Java-তে java.security.SecureRandom - সাধারণ random মডিউল বা Math.random() কখনোই নয়।

মডুলো বায়াস এড়ানো

ভালো র্যান্ডম বাইট থাকা কাজের মাত্র অর্ধেক। একটি অক্ষর বেছে নেওয়ার নিষ্পাপ উপায় হলো bytes[i] % alphabet.length, যা যখনই বর্ণমালার আকার 256 কে সমানভাবে ভাগ করে না তখন নীরবে ফলাফলকে পক্ষপাতদুষ্ট করে। 62-অক্ষরের বর্ণমালায়, প্রথম 8 অক্ষর বাকিগুলোর চেয়ে সামান্য বেশি আসে - একটি ছোট পক্ষপাত, কিন্তু এটি প্রকৃত এনট্রপি হ্রাস করে এবং সম্পূর্ণরূপে এড়ানো যায়।

সমাধান হলো রিজেকশন স্যাম্পলিং: অসম্পূর্ণ চূড়ান্ত ব্লকে পড়া যেকোনো বাইট বাতিল করুন এবং আবার অঙ্কন করুন। এই টুলটি তা করে, তাই নির্বাচিত বর্ণমালার প্রতিটি অক্ষর সমানভাবে সম্ভাব্য।

দৈর্ঘ্য নির্বাচন

এনট্রপি হলো log2(alphabet_size) * length বিট। একটি 62-অক্ষরের বর্ণমালা প্রতি অক্ষরে প্রায় 5.95 বিট দেয়, তাই একটি 22-অক্ষরের টোকেন প্রায় 131 বিট বহন করে - ব্রুট ফোর্সের বাইরে আরামে। প্রকৃত অ্যাক্সেস রক্ষাকারী যেকোনো কিছুর জন্য, 128 বিট সাধারণ ন্যূনতম; প্রায় 64 বিটের নিচে একটি দ্রুত এন্ডপয়েন্টসহ একজন দৃঢ়প্রতিজ্ঞ আক্রমণকারী একটি বাস্তব উদ্বেগ হয়ে ওঠে।

বর্ণমালার পছন্দ বেশিরভাগ ক্ষেত্রে টোকেনটি কোথায় ভ্রমণ করবে তার উপর নির্ভর করে। Base64url এবং hex URL, ফাইলনেম এবং হেডার অক্ষতভাবে টিকে থাকে। দ্ব্যর্থহীন-বর্ণমালা 0/O এবং 1/l/I-এর মতো অক্ষর বাদ দেয় এবং মানব দ্বারা উচ্চস্বরে পড়া বা স্ক্রিন থেকে পুনরায় টাইপ করা যেকোনো কিছুর জন্য এটি ব্যবহার করা মূল্যবান।

ওপেন-সোর্স নোট: ব্রাউজার-নেটিভ crypto.getRandomValues API দিয়ে বাস্তবায়িত। কোনো থার্ড-পার্টি লাইব্রেরি নেই।

সচরাচর জিজ্ঞাসিত প্রশ্ন

টোকেন কি আমার ডিভাইসে জেনারেট হয়?
হ্যাঁ, সম্পূর্ণরূপে আপনার ব্রাউজারে crypto.getRandomValues() ব্যবহার করে। সার্ভারে কিছুই পাঠানো হয় না এবং কিছুই লগ হয় না, তাই আপনি যে মানটি দেখেন তা কেবল আপনার কাছেই পরিচিত।
একটি টোকেনের দৈর্ঘ্য কত হওয়া উচিত?
অ্যাক্সেস রক্ষাকারী যেকোনো কিছুর জন্য, কমপক্ষে 128 বিট এনট্রপি লক্ষ্য করুন: 62-অক্ষরের বর্ণমালায় 22 অক্ষর, অথবা 32 হেক্স অক্ষর। অ-নিরাপত্তা শনাক্তকারীর জন্য ছোট মান যথেষ্ট।
এর জন্য Math.random() ব্যবহার করব না কেন?
এটি ক্লকের মতো সস্তা কিছু থেকে সিড করা একটি দ্রুত ছদ্ম-র্যান্ডম জেনারেটর। মাত্র কয়েকটি আউটপুট পর্যবেক্ষণ করে এর অবস্থা পুনরুদ্ধার করা এবং প্রতিটি ভবিষ্যত মান পূর্বাভাস দেওয়া যথেষ্ট হতে পারে।
দ্ব্যর্থহীন-অক্ষর বিকল্পটি কীসের জন্য?
এটি 0/O এবং 1/l/I সরিয়ে দেয় যাতে টোকেনটি উচ্চস্বরে পড়া, কাগজে লেখা বা স্ক্রিন থেকে পুনরায় টাইপ করার সময় প্রতিলিপি ত্রুটি ছাড়াই টিকে থাকে।
আমি কি এটি পাসওয়ার্ড রিসেট লিংকের জন্য ব্যবহার করতে পারি?
হ্যাঁ, তবে শর্ত হলো আপনি টোকেনের শুধুমাত্র একটি হ্যাশ সংরক্ষণ করেন, একটি সংক্ষিপ্ত মেয়াদ সেট করেন এবং একবার ব্যবহারের পরে এটি বাতিল করেন। এখানকার র্যান্ডমনেস উপযুক্ত; লাইফসাইকেল আপনার অ্যাপ্লিকেশনের কাজ।
একই টোকেন কি কখনো ফিরে আসতে পারে?
128 বিট এনট্রপিতে পুনরাবৃত্তি জ্যোতির্বিদ্যাগতভাবে অসম্ভাব্য, কিন্তু টুলটি কোনো ইতিহাস রাখে না, তাই এটি আপনার পক্ষে প্রজন্ম জুড়ে স্বতন্ত্রতা যাচাই করতে পারে না।