दिलचस्प पोस्ट
अकेले सीएसएस का प्रयोग करके मंडल को ड्रा करें उपप्रोसेस का उपयोग करके रीयलटाइम आउटपुट प्राप्त करना एंड्रॉइड: स्पिनर का संकेत सीएसवी मॉड्यूल के साथ सीएसवी फ़ाइल से विशिष्ट कॉलम पढ़ें? एंड्रॉइड – प्रसारण प्रेरणा ACTION_SCREEN_ON / बंद कैसे प्राप्त करें? जांचें कि क्या एक पायथन सूची आइटम में एक स्ट्रिंग के अंदर एक स्ट्रिंग है एक चर के लिए मान निर्दिष्ट करने के लिए लाइन द्वारा एक फ़ाइल लाइन पढ़ें .NET में एक वर्ग प्रति फाइल नियम? एक बड़े स्थानीय ऑर्नाम को मेरे कार्यक्रम को क्यों क्रैश किया जाता है? JAX-RS / जर्सी त्रुटि प्रबंधन को कैसे अनुकूलित करें? फ़्लोट का उपयोग "अतिभारित कार्य करने के लिए कॉल अस्पष्ट" त्रुटि देता है मुझे "char * s" के साथ आरंभ करने वाले स्ट्रिंग पर लिखे जाने पर "चार्ल्स " क्यों नहीं है, मुझे एक विभाजन त्रुटि क्यों मिली? मैं कक्षा से स्टोरीबोर्ड प्रोग्राम को कैसे लोड कर सकता हूं? English.pickle को nltk.data.load के साथ लोड करने में विफल किसी भी यूट्यूब यूआरएल से यूट्यूब वीडियो आईडी प्राप्त करने के लिए RegEx पैटर्न

पासवर्ड भूल गए के लिए यादृच्छिक टोकन उत्पन्न करने के लिए सर्वोत्तम अभ्यास

मैं भूल गए पासवर्ड के लिए पहचानकर्ता उत्पन्न करना चाहता हूं। मैंने पढ़ा है कि मैं इसे एमटी_आरेंड () के साथ टाइमस्टैम्प का उपयोग करके कर सकता हूं, लेकिन कुछ लोग यह कह रहे हैं कि टाइम स्टाम्प हर समय अद्वितीय नहीं हो सकता। तो मैं यहाँ उलझन में हूँ क्या मैं इस के साथ समय टिकट का उपयोग करने के साथ कर सकता हूँ?

सवाल
कस्टम लंबाई के यादृच्छिक / अद्वितीय टोकन उत्पन्न करने के लिए सबसे अच्छा अभ्यास क्या है?

मुझे पता है कि यहां बहुत से सवाल पूछे गए हैं लेकिन विभिन्न लोगों से अलग राय पढ़ने के बाद मुझे और अधिक भ्रमित हो रहा है।

वेब के समाधान से एकत्रित समाधान "पासवर्ड भूल गए के लिए यादृच्छिक टोकन उत्पन्न करने के लिए सर्वोत्तम अभ्यास"

PHP में, random_bytes() उपयोग random_bytes() कारण: आप एक पासवर्ड रिमाइंडर टोकन प्राप्त करने के तरीके की तलाश कर रहे हैं, और, अगर यह एक बार लॉगिन क्रेडेंशियल्स है, तो आपके पास वास्तव में रक्षा करने के लिए एक डाटा है (जो – संपूर्ण उपयोगकर्ता खाता है)

इसलिए, कोड निम्नानुसार होगा:

 //$length = 78 etc $token = bin2hex(random_bytes($length)); 

अद्यतन : इस उत्तर के पिछले संस्करण uniqid() बात कर रहे uniqid() और वह गलत है अगर सुरक्षा की बात है और न केवल अद्वितीयता uniqid() अनिवार्य रूप से कुछ एन्कोडिंग के साथ ही microtime() अपने सर्वर पर microtime() सटीक भविष्यवाणियां प्राप्त करने के सरल तरीके हैं एक हमलावर एक पासवर्ड रीसेट अनुरोध जारी कर सकता है और फिर कुछ संभावित टोकनों के माध्यम से प्रयास करें। यह भी संभव है यदि अधिक_इनट्रॉपी का उपयोग किया जाता है, क्योंकि अतिरिक्त एंट्रोपी समान रूप से कमजोर है। यह संकेत देने के लिए @NikiC और @ScottArciszewski के लिए धन्यवाद

अधिक जानकारी के लिए देखें

https://security.stackexchange.com/questions/40310/generating-an-unguesable-token-for-confirmation-e-mails

यह सबसे अच्छा यादृच्छिक जवाब

 $token = bin2hex(openssl_random_pseudo_bytes(16)); 

स्वीकार किए जाते हैं उत्तर के पहले संस्करण ( md5(uniqid(mt_rand(), true)) असुरक्षित है और केवल 2 ^ 60 संभावित आउटपुट प्रदान करता है – कम से कम एक सप्ताह के समय में ब्रूट बल खोज की सीमा के भीतर। -बैट्ज़ आक्रमणकर्ता:

  • mt_rand() उम्मीद के मुताबिक है (और केवल एंटरपीपी के 31 बिट तक बढ़ाता है)
  • uniqid() केवल uniqid() 29 बिट तक जोड़ता है
  • md5() एन्ट्रापी नहीं जोड़ता है, यह सिर्फ यह निश्चित रूप से घोषित करता है

चूंकि एक 56-बिट डीईएस कुंजी लगभग 24 घंटों में जबरदस्त हो सकती है , और औसत मामले में लगभग 59 बिट एंटरपीपी होंगे, हम 2 ^ 59/2 ^ 56 = लगभग 8 दिनों की गणना कर सकते हैं। यह टोकन सत्यापन कैसे कार्यान्वित किया जाता है इस पर निर्भर करते हुए, संभवतः समय की जानकारी लीक करने और एक मान्य रीसेट टोकन के पहले एन बाइट्स अनुमान लगा सकते हैं ।

चूंकि सवाल "सर्वोत्तम प्रथाओं" के बारे में है और इसके साथ खुलता है …

मैं भूल गए पासवर्ड के लिए पहचानकर्ता उत्पन्न करना चाहता हूं

… हम अनुमान लगा सकते हैं कि इस टोकन में निहित सुरक्षा आवश्यकताएं हैं और जब आप एक यादृच्छिक संख्या जनरेटर के लिए सुरक्षा आवश्यकताओं को जोड़ते हैं, तो सबसे अच्छा अभ्यास हमेशा एक क्रिप्टोग्राफ़िक रूप से सुरक्षित छद्म यादृच्छिक संख्या जनरेटर (संक्षिप्त CSPRNG) का उपयोग करना है।


सीएसपीआरएनजी का उपयोग करना

PHP 7 में, आप bin2hex(random_bytes($n)) उपयोग कर सकते हैं (जहां $n 15 से अधिक पूर्णांक है)।

PHP 5 में, आप समान एपीआई को बेनकाब करने के लिए random_compat का उपयोग कर सकते हैं।

वैकल्पिक रूप से, bin2hex(mcrypt_create_iv($n, MCRYPT_DEV_URANDOM)) यदि आपके पास ext/mcrypt स्थापित है। एक और अच्छा एक-लाइनर bin2hex(openssl_random_pseudo_bytes($n))

वैधीकरण से लुकअप अलग करना

मेरे पिछले काम से सुरक्षित "मुझे याद रखें" PHP में कुकीज़ , उपरोक्त समय के रिसाव को कम करने का एकमात्र प्रभावी तरीका (आमतौर पर डेटाबेस क्वेरी द्वारा प्रस्तुत किया गया है) सत्यापन से लुकअप को अलग करना है।

यदि आपकी तालिका इस तरह दिखती है (MySQL) …

 CREATE TABLE account_recovery ( id INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT userid INTEGER(11) UNSIGNED NOT NULL, token CHAR(64), expires DATETIME, PRIMARY KEY(id) ); 

… आपको एक और स्तंभ, selector को इतना जोड़ना होगा:

 CREATE TABLE account_recovery ( id INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT userid INTEGER(11) UNSIGNED NOT NULL, selector CHAR(16), token CHAR(64), expires DATETIME, PRIMARY KEY(id), KEY(selector) ); 

CSPRNG का उपयोग करें जब एक पासवर्ड रीसेट टोकन जारी किया जाता है, तो उपयोगकर्ता को दोनों मान भेजें, चयनकर्ता को स्टोर करें और डेटाबेस में यादृच्छिक टोकन के SHA-256 हैश को संग्रहीत करें। हैश और यूजर आईडी को पकड़ने के लिए चयनकर्ता का उपयोग करें, उस उपयोगकर्ता को उपयोगकर्ता के पास hash_equals() का उपयोग कर डेटाबेस में संग्रहीत एक टोकन के SHA-256 हैश की गणना करें।

उदाहरण कोड

पीडीओ के साथ PHP 7 (या 5.6 को यादृच्छिक_कंपलेट) में एक रीसेट टोकेन उत्पन्न करना:

 $selector = bin2hex(random_bytes(8)); $token = random_bytes(32); $urlToEmail = 'http://example.com/reset.php?'.http_build_query([ 'selector' => $selector, 'validator' => bin2hex($token) ]); $expires = new DateTime('NOW'); $expires->add(new DateInterval('PT01H')); // 1 hour $stmt = $pdo->prepare("INSERT INTO account_recovery (userid, selector, token, expires) VALUES (:userid, :selector, :token, :expires);"); $stmt->execute([ 'userid' => $userId, // define this elsewhere! 'selector' => $selector, 'token' => hash('sha256', $token), 'expires' => $expires->format('Ymd\TH:i:s') ]); 

उपयोगकर्ता द्वारा प्रदान किए गए रीसेट टोकन की पुष्टि करना:

 $stmt = $pdo->prepare("SELECT * FROM account_recovery WHERE selector = ? AND expires >= NOW()"); $stmt->execute([$selector]); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); if (!empty($results)) { $calc = hash('sha256', hex2bin($validator)); if (hash_equals($calc, $results[0]['token'])) { // The reset token is valid. Authenticate the user. } // Remove the token from the DB regardless of success or failure. } 

ये कोड स्निपेट पूर्ण समाधान नहीं हैं (मैं इनपुट सत्यापन और फ़्रेमवर्क एकीकरण को टालना), लेकिन उन्हें क्या करना चाहिए, इसका एक उदाहरण के रूप में कार्य करना चाहिए

आप DEV_RANDOM का उपयोग भी कर सकते हैं, जहां 128 = 1/2 उत्पन्न टोकन की लंबाई नीचे दिए गए कोड से 256 टोकन उत्पन्न होते हैं

 $token = bin2hex(mcrypt_create_iv(128, MCRYPT_DEV_RANDOM)); 

जब भी आपको बहुत ही यादृच्छिक टोकन की आवश्यकता होती है तब यह उपयोगी हो सकता है

 <?php echo mb_strtoupper(strval(bin2hex(openssl_random_pseudo_bytes(16)))); ?> 

आप इको स्ट्रॉसशफल ('एएसजीडीएचएफएफडीजीएफडीआर 5475433 एफडी') का प्रयोग कर सकते हैं;