मैं एक उत्तर पोस्ट करने जा रहा हूं क्योंकि कुछ मौजूदा उत्तर पास हैं लेकिन उनमें से एक है:
- एक छोटा वर्ण स्थान जो आप चाहते थे ताकि या तो ब्रूट-फोर्सिंग आसान हो या पासवर्ड उसी एन्ट्रापी के लिए लंबा होना चाहिए
- एक RNG जिसे क्रिप्टोग्राफिक रूप से सुरक्षित नहीं माना जाता है
- कुछ तीसरे पक्ष के पुस्तकालय के लिए एक आवश्यकता और मुझे लगा कि यह दिखाना दिलचस्प हो सकता है कि इसे स्वयं करने के लिए क्या हो सकता है
यह उत्तर count/strlen
जनरेट किए गए पासवर्ड की सुरक्षा के रूप में समस्या को कम करेगा, कम से कम IMHO, आपको वहां कैसे पहुंचता है, यह बताता है। मैं PHP> 5.3.0 भी ग्रहण करने जा रहा हूँ।
आइए समस्या को नीचे दिए गए घटक भागों में विभाजित करें:
- यादृच्छिक डेटा प्राप्त करने के लिए यादृच्छिकता के कुछ सुरक्षित स्रोत का उपयोग करें
- उस डेटा का उपयोग करें और इसे कुछ मुद्रण योग्य स्ट्रिंग के रूप में दर्शाएं
पहले भाग के लिए, PHP> 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 से कम वर्ण तक होंगे।
अतिरिक्त ऋण के लिए, यदि हम ओपी के प्रश्न के अनुसार सटीक कल्पना को पूरा करना चाहते हैं तो हमें थोड़ा और काम करना होगा। मैं यहां आधार रूपांतरण दृष्टिकोण को समाप्त करने जा रहा हूं और एक त्वरित और गंदे के साथ जा रहा हूं। 62 प्रविष्टि लंबी वर्णमाला के कारण दोनों को परिणाम में अधिक यादृच्छिकता उत्पन्न करने की आवश्यकता होती है।
परिणाम में अतिरिक्त वर्णों के लिए, हम उन्हें परिणामी स्ट्रिंग से हटा सकते हैं। यदि हम अपने बाइट-स्ट्रिंग में 8 बाइट्स के साथ शुरू करते हैं, तो लगभग 25% बेस 64 अक्षर ये "अवांछनीय" वर्ण होंगे, ताकि इन वर्णों को त्यागने से परिणाम स्ट्रिंग में ओपी से कम नहीं हो। फिर हम इसे सटीक लंबाई तक ले जाने के लिए काट सकते हैं:
$dirty_pass = base64_encode(strong_random_bytes(8)));
$pass = substr(str_replace(['/', '+', '='], ['', '', ''], $dirty_pass, 0, 8);
यदि आप लंबे समय तक पासवर्ड उत्पन्न करते हैं, तो पैडिंग चरित्र =
मध्यवर्ती परिणाम का एक छोटा और छोटा अनुपात बनाता है ताकि आप एक दुबला दृष्टिकोण को लागू कर सकें, अगर PRNG के लिए उपयोग किए जाने वाले एन्ट्रापी पूल को निकालना एक चिंता का विषय है।