SQL सर्वर में सुरक्षित रूप से एक UNIQUEIDENTIFIER उत्पन्न करें


15

मैं UNIQUEIDENTIFIERएक एक्सेस कुंजी के रूप में उपयोग करने का इरादा रखता हूं जिसका उपयोग उपयोगकर्ता कुछ डेटा तक पहुंचने के लिए कर सकते हैं। कुंजी उस अर्थ में एक पासवर्ड के रूप में कार्य करेगी।

मुझे एक INSERT...SELECTबयान के हिस्से के रूप में कई ऐसे पहचानकर्ता उत्पन्न करने की आवश्यकता है । वास्तु संबंधी कारणों से मैं इस मामले में पहचानकर्ता सर्वर-साइड उत्पन्न करना चाहता हूं।

मैं एक सुरक्षित रूप से यादृच्छिक कैसे उत्पन्न कर सकता हूं UNIQUEIDENTIFIER? ध्यान दें, NEWIDयह बहुत यादृच्छिक नहीं होगा क्योंकि यह किसी भी सुरक्षा गुणों का वादा नहीं करता है। मैं SQL Server System.ecurity.Cryptography.RandomNumberGenerator के बराबर देख रहा हूँ क्योंकि मुझे बेकार ID की आवश्यकता है। के आधार पर कुछ भी CHECKSUM, RANDया GETUTCDATEयोग्य नहीं होगा।


2
@AaronBertrand बहुत कम से कम, एक अगर अंक हमेशा होता है 4। लेकिन इस तथ्य के कि मेरे पास मजबूत सबूत नहीं हैं कि वे अनुमान लगाने योग्य हो सकते हैं इसका मतलब यह नहीं है कि वे नहीं हैं। मैं इस अवलोकन पर इस सुरक्षा निर्णय को आधार नहीं बना सकता।
usr

1
शायद NEWID "Debian कमजोर SSH कुंजियों" के समान ही यादृच्छिक है : en.wikinews.org/wiki/… वे निश्चित रूप से डेवलपर को यादृच्छिक रूप से देखते हैं जिन्होंने उनका परीक्षण किया ...
usr

2
यह 4 आपको बताता है कि GUID को बनाने में किस एल्गोरिदम का उपयोग किया जाता है। en.wikipedia.org/wiki/Glo
Worldwide_unique_identifier

1
आप समझते हैं कि आपकी सुरक्षा के स्तर में एकमात्र निर्धारण कारक थोड़ा एंट्रोपी है? यह विचार कि न्यूआईडी आपकी आवश्यकताओं के लिए पर्याप्त यादृच्छिक नहीं है, इसका अर्थ यह होगा कि आपके पास बिट एंट्रोपी की मात्रा का कुछ विचार है जो आपके उपयोग के मामले के लिए "सुरक्षित" होना आवश्यक है। वह संख्या क्या है?
15-04 पर राद रॉक्स

2
@usr - "आंतरिक स्थिति का पूर्ण ज्ञान दिया गया है", कोई भी दृष्टिकोण दरार कर सकता है ।

जवाबों:


26
SELECT CAST(CRYPT_GEN_RANDOM(16) AS UNIQUEIDENTIFIER)

मुझे जो सोचना था वो करना चाहिए।

CRYPT_GEN_RANDOM

क्रिप्टो एपीआई (CAPI) द्वारा उत्पन्न एक क्रिप्टोग्राफिक यादृच्छिक संख्या देता है।


4

बस मेरे दो सेंट, लेकिन यह एक अच्छा विचार नहीं हो सकता है। GUID's ( भाग 1 , भाग 2 , भाग 3 ) पर एरिक लिपर्ट की उत्कृष्ट श्रृंखला को देखने के लिए , संक्षिप्त नाम GUID है, न कि GSUID - विश्वव्यापी विशिष्ट पहचानकर्ता, न कि विश्व स्तर पर सुरक्षित विशिष्ट पहचानकर्ता।

समस्या यह है कि जब GUID एक गैर-शत्रुतापूर्ण दायरे के भीतर उत्पन्न होते हैं, जैसे कि NEWID () का उपयोग कर रहे सभी लोग, सभी मान अनूठे (अच्छी तरह से, एरिक के लेख, भाग 3 देखें) के लिए ग्वारेंटेड होते हैं। लेकिन अगर शत्रुतापूर्ण इकाई उस दायरे में प्रवेश करती है, तो वे दोनों अगली उत्पन्न जीयूआईडी की भविष्यवाणी कर सकते हैं, साथ ही अपने आप ही टकराव का कारण बन सकते हैं।

एक मान उत्पन्न करने की अपनी विधि बनाकर, जिसे आप एक GUID की तरह दिखने वाली संरचना में संग्रहीत करते हैं, आप अनिवार्य रूप से एक शत्रुतापूर्ण इकाई बन गए हैं। आपने GUID के अनुबंध को अद्वितीय से यादृच्छिक होने के लिए बदल दिया है । जबकि गणित में कोई मुझसे बेहतर साबित हो सकता है कि आप अभी भी अनूठे हैं, यह केवल आपकी पीढ़ी के तरीकों के दायरे में है। यदि आप इन छद्म-GUIDs को NEWID () GUID के साथ मिलाते हैं, तो सभी दांव बंद हो जाते हैं।

मैं कहता हूँ यह हो सकता है एक अच्छा विचार की वजह से ही मैं कैसे आप मूल्यों का उपयोग कर रहे के संपूर्ण दायरे को पता नहीं है नहीं हो। यदि आप मान (कोई मिश्रण और मिलान नहीं) उत्पन्न करने वाली एकमात्र इकाई हैं, और / या आप मानों को बनाए नहीं रख रहे हैं, और / या आप टकरावों की परवाह नहीं करते हैं, तो यह कोई समस्या नहीं हो सकती है। यदि उन वस्तुओं में से कोई भी सत्य नहीं है, तो आप पुनर्मूल्यांकन करना चाहते हैं।


दिलचस्प अंक। मेरा डेटा प्रकार का चुनाव UNIQUEIDENTIFIERज्यादातर एक संयोग है। उस प्रकार का उपयोग करके 16 बाइट मात्रा को संभालना सुविधाजनक है। मैं इसे एक पासवर्ड के रूप में सोचता हूं। यह अद्वितीय होना है, यद्यपि। मुझे विश्वास है कि मैं कभी टकराव नहीं देखूंगा (और अगर ऐप है भी तो दुर्घटनाग्रस्त हो जाएगा - इसलिए यह सुरक्षित है, भी)।
usr

मैं असहमत हूं, यह निर्भर करता है कि यदि आप इसे अनूठे के बजाय यादृच्छिक बनते हैं तो आप इसे कैसे एन्क्रिप्ट करते हैं। यह आसानी से समान हो सकता है।
दाऊदी

4

Https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newfterentialid-histrorybenefits-and-implementation/ के अनुसार , NEWID () फ़ंक्शन केवल Windows फ़ंक्शन CoCreateGuid को लपेटता है, जो एक v4-शैली GUID लौटाता है। । और https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 के अनुसार , Windows 2000 के बाद से 1999 में वापस

"विंडोज में निर्मित सभी संस्करण 4 GUID के लिए यादृच्छिक बिट्स Windows CryptGenRandom cryptographic API या समकक्ष के माध्यम से प्राप्त होते हैं, वही स्रोत जो क्रिप्टोग्राफ़िक कुंजियों की पीढ़ी के लिए उपयोग किया जाता है"

तो मैं कहूंगा कि आप NEWID () को क्रिप्टोग्राफिक रूप से सुरक्षित मान सकते हैं - कम से कम 122 बिट्स एन्ट्रापी जो इसे प्रदान करता है।


यह तो दिलचस्प है। मैं व्यक्तिगत रूप से सुरक्षा उद्देश्यों के लिए इस पर भरोसा नहीं करूंगा। इस बारे में न तो विंडोज और न ही SQL सर्वर गारंटी देता है।
usr

@usr मुझे यकीन नहीं है कि क्या गारंटी होगी। यह "गारंटी" शब्द का उपयोग नहीं करता है, लेकिन यह मानक MSDN विंडोज एसडीके प्रलेखन प्रतीत होता है। यह विंडोज के कुछ भविष्य के संस्करण में एमएस के लिए GUID की क्रिप्टोग्राफिक यादृच्छिकता को कम करने के लिए बहुत संभावना नहीं होगी। कुछ हासिल नहीं होगा।
जॉर्डन राइगर

वह MSDN पृष्ठ केवल ऐतिहासिक विकल्पों का दस्तावेज़ देता है लेकिन यह नहीं कहता है कि इसे भविष्य में रखा जाएगा। SQL सर्वर के लिए भी। मैं उन परिस्थितियों की कल्पना नहीं कर सकता जिनके तहत यह टूट जाएगा। लेकिन कई विनाशकारी RNG डीबेकल्स हुए हैं। इस तरह की धारणाएं अक्सर झूठी निकली हैं। यह एक तर्कवादी तर्क है।
यूएसआर

@usr लेकिन कोई भी MSDN प्रलेखन विंडोज के भविष्य के व्यवहार की गारंटी कैसे दे सकता है ? इन मामलों में सबसे अधिक हम कभी भी उम्मीद कर सकते हैं कि मौजूदा व्यवहार का दस्तावेजीकरण हो। यदि व्यवहार कभी बदलता है, तो ठीक है कि वे प्रलेखन को अद्यतन करते हैं। इसीलिए इन स्टैक ओवरफ्लो Q & As में वर्जन टैग हैं और समय-समय पर अपडेट होते रहते हैं।
जॉर्डन राइगर

वे उन चीजों के बारे में गारंटी देते हैं जो वे नहीं बदलेंगे। वे उत्पाद बदल सकते थे, लेकिन अगर वे कहते हैं कि "यहां इन गुणों के साथ सुरक्षा महत्वपूर्ण कार्य नहीं है"। मैं उस दस्तावेज़ को भविष्य के बारे में एक बयान की तुलना में ऐतिहासिक दृष्टिकोण की तरह व्याख्या करता हूं।
usr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.