2012-06-14 3 views
19

previous discussed के रूप में, पुष्टिकरण ईमेल में एक अद्वितीय, (व्यावहारिक रूप से) अनुमान लगाने योग्य कोड होना चाहिए - अनिवार्य रूप से one-time password - पुष्टिकरण लिंक में।UUID.randomUUID() एक बार पासवर्ड के रूप में उपयोग के लिए उपयुक्त है?

The UUID.randomUUID() docs कहते हैं:

UUID एक को क्रिप्टोग्राफी मजबूत छद्म यादृच्छिक संख्या जनरेटर का उपयोग कर उत्पन्न होता है।

क्या यह दर्शाता है कि यूयूआईडी यादृच्छिक जनरेटर एक उचित ढंग से कार्यान्वित जेवीएम में अद्वितीय, (व्यावहारिक रूप से) अनुमान लगाने योग्य ओटीपी के रूप में उपयोग के लिए उपयुक्त है?

+2

आप में रुचि हो सकती [एक और सवाल करने के लिए अपने जवाब है,] (http://stackoverflow.com/a/41156/3474) जो आपको कम अंकों के साथ और अधिक सुरक्षा दे देंगे ... कि अगर मायने रखती है। – erickson

+0

यहां चर्चा भी देखें: https://security.stackexchange.com/questions/890/are-guids-safe-for-one-time-tokens –

उत्तर

4

संUUID spec के अनुसार:

यह मानकर न चलें कि UUIDs का अनुमान लगाना मुश्किल है, उन्हें सुरक्षा क्षमताओं के रूप में उपयोग नहीं किया जाना चाहिए (पहचानकर्ता जिनके पास केवल पहुंच प्रदान करता है), उदाहरण के लिए। एक अनुमानित यादृच्छिक संख्या स्रोत स्थिति को बढ़ा देगा।

इसके अलावा, यूयूआईडी में केवल 16 संभावित वर्ण (एफ के माध्यम से 0) हैं। आप SecureRandom (@erickson के लिए धन्यवाद) का उपयोग करके अधिक कॉम्पैक्ट और स्पष्ट रूप से सुरक्षित यादृच्छिक पासवर्ड उत्पन्न कर सकते हैं।

import java.security.SecureRandom; 
import java.math.BigInteger; 

public final class PasswordGenerator { 
    private SecureRandom random = new SecureRandom(); 

    public String nextPassword() { 
     return new BigInteger(130, random).toString(32); 
    } 
} 
+5

यूयूआईडी स्पेक! = जावा कार्यान्वयन। जबकि spec को यूयूआईडी सुरक्षित होने की आवश्यकता नहीं है, जावा कार्यान्वयन वास्तव में सुरक्षित यादृच्छिकता के 122 बिट प्रदान करता है। यह भी देखें http://stackoverflow.com/a/7532965/47528 – Dan

+0

मैं अभी भी एक क्रिप्टो lib का स्पष्ट रूप से उपयोग करने की अनुशंसा करता हूं। – jchook

+1

हां, निश्चित रूप से ;-) जब सुरक्षा की बात आती है, तो सतर्क और स्पष्ट होना बेहतर होता है। आप सैन्य-ग्रेड सिस्टम के लिए UUID.randomUUID() का उपयोग नहीं करेंगे। लेकिन अगर सवाल यह है कि "क्या मैं टोकन के लिए UUID.randomUUID() का उपयोग कर सुरक्षा छेद पेश कर रहा हूं?" तो जवाब नहीं है। – Dan

-1

मुझे लगता है कि यह उपयुक्त होना चाहिए, क्योंकि यह किसी भी विशिष्ट इनपुट (यानी आप इसे उपयोगकर्ता नाम या कुछ ऐसा नहीं कर रहे हैं) के बजाय यादृच्छिक रूप से उत्पन्न होता है - इसलिए इस कोड के लिए कई कॉल अलग-अलग परिणाम देंगे। यह कहता है कि इसकी एक 128-बिट कुंजी है, इसलिए इसे तोड़ने के लिए अव्यवहारिक होना काफी लंबा है।

क्या आप एक मान एन्क्रिप्ट करने के लिए इस कुंजी का उपयोग करने जा रहे हैं, या आप इसे वास्तविक पासवर्ड के रूप में उपयोग करने की उम्मीद कर रहे हैं? भले ही, आपको उस कुंजीपटल में कुंजी को दोबारा समझने की आवश्यकता होगी जिसे कीबोर्ड द्वारा दर्ज किया जा सकता है। उदाहरण के लिए, बेस 64 या हेक्स रूपांतरण करें, या किसी भी तरह से अल्फा-न्यूमेरिक्स के मानों को मानचित्र करें, अन्यथा उपयोगकर्ता बाइट मानों को दर्ज करने का प्रयास करेगा जो कीबोर्ड पर मौजूद नहीं हैं।

+0

मैं एक पुष्टिकरण URL में पुष्टिकरण कोड एम्बेड करने की योजना बना रहा हूं जो ईमेल प्राप्तकर्ता क्लिक करता है पुष्टि पूर्ण करने के लिए। कोई उपयोगकर्ता इनपुट आवश्यक नहीं होना चाहिए ... – cqcallaw

-1

यह एक बार पासवर्ड के रूप में एकदम सही है, क्योंकि मैंने इसे लागू करने के लिए भी आवेदन किया था जिस पर मैं काम कर रहा हूं। इसके अलावा, जो लिंक आपने साझा किया है वह सब कुछ कहता है।

0

यदि यह एक सीएसआरएनजी द्वारा उत्पन्न होता है तो यह अप्रत्याशित है और इसलिए इसका उपयोग किया जा सकता है।

लेकिन यदि आप पुष्टि ईमेल को अनएन्क्रिप्टेड भेज रहे हैं तो परेशानी बर्बाद हो जाती है - अगर किसी हमलावर के पास आपके सिस्टम से आरएनजी परिणामों की भविष्यवाणी करने का साधन है तो संभावना है कि वे ईमेल भी रोक सकते हैं।

यूयूआईडी भी लंबे तार हैं (128-बिट्स आमतौर पर बेस 64 (22 वर्ण) या बेस 16-एन्कोडेड (32 वर्ण)) - इस बारे में सोचें कि आपका सिस्टम उपयोगकर्ता के अनुकूल कैसे होगा। व्यक्तिगत रूप से मैं यादृच्छिक रूप से 8 अल्फान्यूमेरिक वर्णों का चयन करने के लिए एक CSRNG का उपयोग करता हूं और उन्हें वापस कर देता हूं।

+0

मुझे नहीं लगता कि आरएनजी परिणामों की भविष्यवाणी करने में सक्षम होने से ईमेल अवरोध क्षमताओं का तात्पर्य है - इसका मतलब यह है कि आरएनजी खराब रूप से कार्यान्वित किया गया है :) इसके अलावा, मैं लंबाई के बारे में बहुत चिंतित नहीं हूं, क्योंकि मैं एक पुष्टिकरण URL में कोड एम्बेड करने की अपेक्षा करता हूं जिसे पुष्टि पूर्ण करने के लिए देखा जाना चाहिए। – cqcallaw

0

एक पुष्टिकरण लिंक के लिए यादृच्छिक कोड का बिंदु यह है कि हमलावर अनुमान लगाने और मूल्य की भविष्यवाणी करने में सक्षम नहीं होना चाहिए। जैसा कि आप देख सकते हैं, अपने पुष्टिकरण लिंक पर सही कोड ढूंढने के लिए, 128 बिट्स लंबाई यूयूआईडी 2^128 अलग-अलग संभावित कोड, अर्थात् 340,282,366,920,938,463,463,374,607,431,768,211,456 संभव कोड को आज़माएं। मुझे लगता है कि आपका पुष्टिकरण लिंक परमाणु हथियार लॉन्च करने के लिए नहीं है, है ना? हमलावर अनुमान लगाने के लिए यह मुश्किल है। यह सुरक्षित है।

- अद्यतन -

आप को क्रिप्टोग्राफी मजबूत यादृच्छिक संख्या जनरेटर प्रदान की पर भरोसा नहीं करते हैं, तो आप UUID कोड के साथ कुछ और अप्रत्याशित मापदंडों रख दिया और उन्हें हैश सकते। उदाहरण के लिए,

कोड = SHA1 (UUID, प्रक्रिया पीआईडी, थ्रेड ID, स्थानीय कनेक्शन पोर्ट संख्या, सीपीयू तापमान)

यह और भी कठिन भविष्यवाणी करने के लिए बनाते हैं।

+2

बस उत्पन्न बिट्स की संख्या इसे अप्रत्याशित नहीं बनाती है। 'java.util.Random' का उपयोग डेटा के 128 बिट प्राप्त करने के लिए किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि यह सुरक्षित की तरह कुछ भी है। –

+2

आजकल, लोग पैसे कमाने के लिए हमला करते हैं, और आपके पास सीमित बजट है। कुछ भी अटूट नहीं है। तो यह कितना सुरक्षित होना चाहिए? सुरक्षा का मुद्दा यह है कि उन्हें तोड़ने के लिए कितना खर्च होता है, और उन्हें क्या लाभ मिल सकता है? यदि यह एक सामान्य वेबसाइट के पुष्टिकरण लिंक के लिए एक कोड है, तो यह पर्याप्त सुरक्षित है।यदि यह परमाणु हथियार के लिए एक कोड है, तो मैं ऐसा नहीं कहूंगा। मेरे लिए, सुरक्षित की परिभाषा है - इसे तोड़ने की लागत >> राजस्व की उम्मीद। जब इसे तोड़ने के लिए बहुत अधिक खर्च होता है, और इसे कम करके आप कम कमा सकते हैं, तो यह सुरक्षित है। –

+0

@LouisWasserman आप 'java.util.Random' की तुलना' UUID.randomUUID() ' –

13

अगर आप RFC कि UUIDs परिभाषित करता है, और जो एपीआई डॉक्स से लिंक किया गया पढ़ते हैं, आपको लगता है कि नहीं UUID के सभी बिट्स वास्तव में यादृच्छिक हैं ("संस्करण" और "संस्करण" दिखाई देगा यादृच्छिक नहीं हैं)। तो एक प्रकार 4 यूयूआईडी (जिस तरह से आप उपयोग करना चाहते हैं), अगर सही ढंग से कार्यान्वित किया गया है, तो 128 बिट्स के कुल आकार में, 122 बिट्स (सुरक्षित, इस कार्यान्वयन के लिए) यादृच्छिक जानकारी होनी चाहिए।

तो हाँ, यह एक "सुरक्षित" जनरेटर से 122 बिट यादृच्छिक संख्या के साथ-साथ काम करेगा। लेकिन एक छोटे मूल्य में पर्याप्त मात्रा में यादृच्छिकता हो सकती है और उपयोगकर्ता के लिए यह आसान हो सकता है (शायद मैं एकमात्र पुराना शैली वाला व्यक्ति हूं जो अभी भी टर्मिनल में ईमेल पढ़ता है, लेकिन लाइनों में लपेटने वाले पुष्टिकरण URL परेशान हैं ... ।)।

+0

अन्य ने समान उत्तर दिए, लेकिन यह सबसे पूर्ण और जानकारीपूर्ण प्रतीत होता था। धन्यवाद। – cqcallaw

+7

असल में, आरएफसी स्पष्ट रूप से सुरक्षा टोकन के रूप में यूयूआईडी का उपयोग करने के खिलाफ सावधानी बरतता है: "मान लीजिए कि यूयूआईडी अनुमान लगाने में कठोर हैं; उन्हें सुरक्षा क्षमताओं के रूप में उपयोग नहीं किया जाना चाहिए (पहचानकर्ता जिनके पास केवल कब्जा पहुंच है), उदाहरण के लिए।" एक सुरक्षित आरएनजी ** के साथ उत्पन्न यूयूआईडी 4 ** अनुमान लगाने के लिए लगभग असंभव होगा, लेकिन मानक स्पष्ट रूप से असुरक्षित आरएनजी (!) की अनुमति देता है। http://tools.ietf.org/html/rfc4122#section-6 (एक बहुत पुरानी टिप्पणी को पुनर्जीवित करने के लिए क्षमा, लेकिन सुरक्षा हर किसी की चिंता है।) –

4

हां, java.util.UUID का उपयोग करना ठीक है। ऐसा करने की जरूरत नहीं है।

यहाँ मेरी सुझाव है:

  1. यूआरएल तर्क के रूप में यह में एक विशाल पासवर्ड के साथ एक लिंक भेज देते हैं।
  2. उपयोगकर्ता लिंक क्लिक करता है, अपने बैकएंड लिखने इतना है कि यह तय करेंगे या नहीं, तर्क सही है और उपयोगकर्ता के प्रवेश कि।
  3. UUID अमान्य 24 घंटे के बाद इसे जारी किया गया है।

यह कुछ काम करेगा, लेकिन यदि आप वास्तव में एक मजबूत, सुरक्षित प्रणाली लिखने की परवाह करते हैं तो यह आवश्यक है।

+1

आपका सुझाव मेरा सटीक इरादा है, सिवाय इसके कि मैं जल्द ही यूयूआईडी को अमान्य करना चाहता हूं चूंकि पुष्टिकरण यूआरएल का दौरा किया गया है और पुष्टि पूरी हो गई है। – cqcallaw

संबंधित मुद्दे

 संबंधित मुद्दे