আমি একটি উত্তর পোস্ট করতে যাচ্ছি কারণ বিদ্যমান কয়েকটি উত্তর নিকটে থাকলেও এর একটি রয়েছে:
- আপনার চেয়ে ছোট চরিত্রের স্থান যাতে ব্রুট-জোর করা সহজ হয় বা একই এনট্রপির জন্য পাসওয়ার্ডটি দীর্ঘতর হতে হবে
- একটি আরএনজি যা ক্রিপ্টোগ্রাফিকভাবে নিরাপদ হিসাবে বিবেচিত হয় না
- কিছু তৃতীয় পক্ষের লাইব্রেরির জন্য প্রয়োজনীয়তা এবং আমি ভেবেছিলাম যে এটি নিজে করতে এটি কী গ্রহণ করতে পারে তা দেখানো আকর্ষণীয় হতে পারে
এই উত্তরটি উত্সাহিত count/strlen
পাসওয়ার্ডের সুরক্ষা হিসাবে অন্তত আইএমএইচওর বিষয়টি প্রচ্ছন্ন করবে আপনি সেখানে কীভাবে যাচ্ছেন তা ছাড়িয়ে দেয়। আমি পিএইচপি> 5.3.0 ধরেও চলেছি।
আসুন সমস্যাটি উপাদানগুলির মধ্যে ভাগ করুন যা হ'ল:
- এলোমেলো ডেটা পেতে এলোমেলোতার কিছু নিরাপদ উত্স ব্যবহার করুন
- সেই ডেটা ব্যবহার করুন এবং কিছু মুদ্রণযোগ্য স্ট্রিং হিসাবে উপস্থাপন করুন
প্রথম অংশের জন্য, পিএইচপি> 5.3.0 ফাংশন সরবরাহ করে openssl_random_pseudo_bytes
। মনে রাখবেন যে বেশিরভাগ সিস্টেমগুলি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী অ্যালগরিদম ব্যবহার করে, আপনাকে পরীক্ষা করতে হবে যাতে আমরা একটি মোড়ক ব্যবহার করব:
/**
* @param int $length
*/
function strong_random_bytes($length)
{
$strong = false; // Flag for whether a strong algorithm was used
$bytes = openssl_random_pseudo_bytes($length, $strong);
if ( ! $strong)
{
// System did not use a cryptographically strong algorithm
throw new Exception('Strong algorithm not available for PRNG.');
}
return $bytes;
}
দ্বিতীয় অংশের জন্য, আমরা base64_encode
এটি ব্যবহার করব যেহেতু এটি একটি বাইট স্ট্রিং নেয় এবং এমন একটি ধারাবাহিক অক্ষর তৈরি করবে যেটির বর্ণমালা রয়েছে মূল প্রশ্নের সাথে বর্ণিত বর্ণের খুব কাছাকাছি। আমরা থাকার কিছু মনে যদি না +
, /
এবং =
অক্ষর চূড়ান্ত স্ট্রিং মধ্যে প্রদর্শিত এবং আমরা অন্তত ফলে চান $n
অক্ষর দীর্ঘ, কেবলমাত্র আমরা ব্যবহার করতে পারে:
base64_encode(strong_random_bytes(intval(ceil($n * 3 / 4))));
3/4
ফ্যাক্টর যে একটি স্ট্রিং দৈর্ঘ্য কমপক্ষে এক তৃতীয়াংশ বাইট স্ট্রিং চেয়ে বড় যে ফলাফল এনকোডিং করুন Base64- জন্য হয়েছে। ফলাফলটি $n
4 এর একাধিক এবং অন্যথায় 3 টি অক্ষরের বেশি হওয়ার জন্য সঠিক হবে । যেহেতু অতিরিক্ত অক্ষরগুলি প্রধানত প্যাডিং চরিত্র =
, তাই যদি আমাদের কোনও কারণে যদি পাসওয়ার্ডের সঠিক দৈর্ঘ্য হওয়ার সীমাবদ্ধতা থাকে, তবে আমরা এটি আমাদের যে দৈর্ঘ্যে চাই সেটিকে ছেঁটে ফেলতে পারি। এটি বিশেষত কারণ একটি প্রদত্তর জন্য $n
, সমস্ত পাসওয়ার্ডগুলি একই সংখ্যার সাথে শেষ হবে, যাতে কোনও আক্রমণকারী যার ফলাফল পাসওয়ার্ডে অ্যাক্সেস ছিল, অনুমান করার জন্য 2 টি কম অক্ষর থাকবে।
অতিরিক্ত creditণের জন্য, আমরা যদি ওপি-র প্রশ্নের মতো সঠিক ধারণাটি পূরণ করতে চাই তবে আমাদের আরও কিছুটা কাজ করতে হবে। আমি এখানে বেস রূপান্তর পদ্ধতিটি এড়াতে যাচ্ছি এবং দ্রুত এবং নোংরা সাথে যেতে চাই। 62 এন্ট্রি দীর্ঘ বর্ণমালার কারণে উভয় ক্ষেত্রে ফলাফলের ক্ষেত্রে যত বেশি ব্যবহৃত হবে তার চেয়ে বেশি এলোমেলোতা তৈরি করা দরকার।
ফলাফলের অতিরিক্ত অক্ষরের জন্য, আমরা কেবল তাদের ফলাফলের স্ট্রিং থেকে বাদ দিতে পারি। যদি আমরা আমাদের বাইট-স্ট্রিংয়ে 8 বাইট দিয়ে শুরু করি, তবে প্রায় 25% বেস 64 অক্ষরগুলি এই "অনাকাঙ্ক্ষিত" অক্ষর হতে পারে, যাতে এই অক্ষরগুলি কেবল একটি স্ট্রিংয়ের ফলস্বরূপ অপ্রত্যাশিত চেয়ে অপেক্ষাকৃত ছোট হয় না। তারপরে সঠিক দৈর্ঘ্যে নামার জন্য আমরা কেবল এটি ছাঁটাই করতে পারি:
$dirty_pass = base64_encode(strong_random_bytes(8)));
$pass = substr(str_replace(['/', '+', '='], ['', '', ''], $dirty_pass, 0, 8);
যদি আপনি লম্বা পাসওয়ার্ড তৈরি করেন তবে প্যাডিং চরিত্রটি =
মধ্যবর্তী ফলাফলের একটি ছোট এবং ছোট অনুপাত গঠন করে যাতে PRNG এর জন্য ব্যবহৃত এন্ট্রপি পুলটি নিষ্কাশন করা যদি উদ্বেগের বিষয় হয় তবে আপনি কোনও ঝুঁকির পদ্ধতির প্রয়োগ করতে পারেন।