सर्वर सीड हैशिंग कैसे काम करती है
हैश का काम
provably fair casino के सामने एक समस्या है। उसे आपके खेलते समय अपना सर्वर सीड गुप्त रखना होता है, क्योंकि जो कोई इसे जानता है वह नतीजों का अनुमान लगा सकता है। लेकिन उसे बाद में यह भी साबित करना होता है कि उसने आपके दांव देखने के बाद सीड नहीं बदला। हैश दोनों को एक साथ हल करता है।
आपके खेलने से पहले casino आपको सर्वर सीड का SHA-256 हैश दिखाता है। वह हैश एक commitment है: यह सीड के बारे में कुछ भी काम का नहीं बताता, फिर भी यह तय कर देता है कि casino को बाद में कौन सा सीड सामने लाना होगा। जब रोटेशन के बाद सीड सामने आता है, तो आप उसे खुद हैश करके मिलाते हैं। मेल खाना साबित करता है कि casino ने वही सीड इस्तेमाल किया जिसके लिए उसने प्रतिबद्धता दी थी।
यह गाइड बताती है कि यह कैसे काम करता है और हैश को सही तरीके से कैसे जांचें। पूरी स्कीम के लिए देखें provably fair क्या है।
SHA-256 क्या है
SHA-256 एक हैश फंक्शन है जिसे NIST ने FIPS 180-4, यानी Secure Hash Standard में परिभाषित किया है। यह किसी भी लंबाई का इनपुट लेता है और 256-bit आउटपुट देता है, जो आमतौर पर 64 hexadecimal अक्षरों में लिखा जाता है।
FIPS 180-4 की एक मानक टेस्ट वैल्यू तीन अक्षरों का टेक्स्ट abc है। इसका SHA-256 हैश है:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
अगर कोई टूल abc के लिए यही नतीजा देता है, तो वह SHA-256 सही तरीके से निकालता है। किसी वेबसाइट या स्क्रिप्ट पर भरोसा करने से पहले उसे जांचने का यह एक आसान तरीका है।
तीन खूबियां जो commitment को काम करने लायक बनाती हैं
| खूबी | इसका मतलब | आपके लिए यह क्यों मायने रखती है |
|---|---|---|
| Deterministic | एक ही इनपुट हमेशा एक ही हैश देता है | आप खुद हैश दोबारा निकालकर casino की सटीक वैल्यू पा सकते हैं |
| Preimage resistant | हैश दिए जाने पर उसे बनाने वाला इनपुट ढूंढना व्यावहारिक नहीं | हैश सीड को उजागर नहीं करता, इसलिए भविष्य के नतीजे अनुमान से बाहर रहते हैं |
| Collision resistant | एक ही हैश वाले दो अलग इनपुट ढूंढना व्यावहारिक नहीं | casino बाद में कोई दूसरा सीड सामने नहीं ला सकता जो उसी हैश से मेल खाए |
दूसरी और तीसरी खूबी इस पर निर्भर करती है कि सीड का अनुमान लगाना मुश्किल हो, जिस पर नीचे बात की गई है।
एक हल किया गया उदाहरण
हमने ये वैल्यू Python में मानक hashlib मॉड्यूल से निकालीं।
सर्वर सीड (टेक्स्ट के रूप में):
a7c41e09d5b3f28e6c1d4a90b7e35f12c8d06e4b9a2f71c35e8d0b6a4f19c27e
उस टेक्स्ट का SHA-256:
3e29712c704eeff2d868f958cf08e44a1a16ecba4c974af0496e13bccdefaff2
एक अक्षर सब कुछ बदल देता है
सीड का सिर्फ आखिरी अक्षर e से f करें, और हैश बन जाता है:
af4391b73bb5adf912b7a7296ee8f79dda892ddbb47e5e4c38efeaaf2d82de7c
दोनों हैश में कोई दिखने वाला संबंध नहीं है। इसीलिए लगभग मेल खाने का कोई मतलब नहीं: या तो हर अक्षर मेल खाता है या commitment विफल हो गया।
टेक्स्ट या bytes: झूठे अलार्म की सबसे आम वजह
सर्वर सीड आमतौर पर 64 hexadecimal अक्षरों के रूप में दिखाया जाता है। इन अक्षरों को दो अलग तरीकों से हैश किया जा सकता है:
- टेक्स्ट के रूप में. खुद 64 अक्षर ही इनपुट हैं।
- Bytes के रूप में. hex को पहले 32 raw bytes में decode किया जाता है, और वे bytes इनपुट होते हैं।
हमारे उदाहरण वाले सीड के लिए:
| तरीका | SHA-256 |
|---|---|
| टेक्स्ट को हैश करना | 3e29712c704eeff2d868f958cf08e44a1a16ecba4c974af0496e13bccdefaff2 |
| decode किए गए bytes को हैश करना | 3667286ec9562c47723de3aa95a788fe2fa47fed883550be45a053e5d390c64e |
दोनों अलग इनपुट के वैध SHA-256 नतीजे हैं। आम स्कीम टेक्स्ट को ठीक वैसे ही हैश करती है जैसा वह दिखता है, और हमारा वेरिफायर यही करता है। अगर आपका हैश मेल नहीं खाता, तो नतीजे पर पहुंचने से पहले casino के फेयरनेस दस्तावेज़ पढ़कर देखें कि वह कौन सा तरीका इस्तेमाल करता है।
गलत हैश पाने के दो और तरीके
एक छिपा हुआ newline
Linux और macOS पर echo अपने आउटपुट के आखिर में एक newline जोड़ देता है। इसलिए echo seed | sha256sum से हैश करने पर सीड और एक newline हैश होते हैं। हमारे उदाहरण वाले सीड के लिए इससे मिलता है:
60f1c7bdca64b07819a42ddf185c24d093fe41bce96f41f029422f16bc9c50b5
जो मेल नहीं खाता। इसके बजाय printf %s seed | sha256sum या echo -n seed | sha256sum इस्तेमाल करें। यही समस्या तब भी आती है जब आप आखिर में स्पेस या line break के साथ सीड कॉपी करते हैं।
बदला हुआ अक्षरों का case
hex छोटे या बड़े अक्षरों में लिखा जा सकता है, लेकिन टेक्स्ट को हैश करने पर a और A अलग अक्षर माने जाते हैं। अगर casino छोटे अक्षर दिखाता है, तो छोटे अक्षर हैश करें।
खुद हैश जांचना
सीड को ठीक वैसे ही इस्तेमाल करते हुए जैसा casino दिखाता है, इनमें से कोई भी तरीका काम करता है:
- हमारा वेरिफायर: सर्वर सीड पेस्ट करें और दिखाए गए हैश से मिलाएं।
- Python:
hashlib.sha256(seed.encode()).hexdigest() - टर्मिनल:
printf %s 'seed' | sha256sum
सभी 64 अक्षरों को उस हैश से मिलाएं जो आपने खेलने से पहले सेव किया था, न कि उससे जो casino अभी दिखा रहा है। एक बेईमान साइट अपनी हिस्ट्री में सामने आया सीड और दिखाया गया हैश दोनों बदल सकती है। आपकी सेव की गई कॉपी ही एकमात्र ऐसी है जिसे वह नहीं बदल सकती।
सीड लंबा और रैंडम क्यों होना चाहिए
commitment सीड को तभी छिपाता है जब सीड का अनुमान न लगाया जा सके। SHA-256 तेज़ है, इसलिए हमला करने वाला हर सेकंड कई इनपुट आज़मा सकता है।
यह दिखाने के लिए हमने छह अंकों वाले सीड 482913 को हैश किया, फिर 000000 से 999999 तक हर संख्या आज़माई जब तक कोई मेल न खाए। एक सामान्य कंप्यूटर पर सादे Python loop ने इसे एक सेकंड से काफी कम में ढूंढ लिया। दस लाख संभावनाओं वाला सीड कोई गोपनीयता नहीं देता।
64 अक्षरों का hex सीड 256 bits दर्शाता है, जो किसी के भी खोजने की क्षमता से बहुत आगे है। अच्छे casinos cryptographically सुरक्षित रैंडम नंबर जनरेटर से सीड बनाते हैं। आप यह नहीं जांच सकते कि सीड कैसे बना, लेकिन यह जांच सकते हैं कि सामने आए सीड पूरी लंबाई के हैं और कभी दोहराए नहीं जाते। छोटा, पैटर्न वाला या दोबारा इस्तेमाल हुआ सीड रिपोर्ट करने लायक निष्कर्ष है।
HMAC कहां फिट होता है
हैश सीड के लिए प्रतिबद्ध करता है। एक अलग बनावट सीड को नतीजों में बदलती है: HMAC-SHA256, जिसे RFC 2104 और NIST FIPS 198-1 में परिभाषित किया गया है। आम स्कीम में सर्वर सीड HMAC key है और clientSeed:nonce:round मैसेज है। HMAC इस तरह डिज़ाइन किया गया है कि एक मैसेज का आउटपुट आपको key निकालने या दूसरे मैसेज के आउटपुट का अनुमान लगाने नहीं देता। इसीलिए अपने पिछले नतीजे देखने से सर्वर सीड उजागर नहीं होता। हमारा dice walkthrough HMAC को स्टेप बाय स्टेप दिखाता है।
हैश क्या साबित नहीं करता
- कि सीड निष्पक्ष रूप से चुना गया. हैश सीड को तय करता है; यह नहीं दिखाता कि उसे कैसे चुना गया। यह काम क्लाइंट सीड करता है, क्योंकि casino किसी ऐसी वैल्यू के हिसाब से सीड नहीं बना सकता जो उसने देखी ही नहीं।
- कि नतीजे उससे निकाले गए. यह आप दांवों को दोबारा निकालकर साबित करते हैं।
- थर्ड-पार्टी गेम्स के बारे में कुछ भी. स्लॉट और लाइव टेबल आपके सीड इस्तेमाल नहीं करते।
multiplayer गेम्स में hash chains
कुछ साझा नतीजे वाले गेम, जैसे कई crash गेम, हर खिलाड़ी के सीड इस्तेमाल नहीं करते। इसके बजाय ऑपरेटर एक लंबी chain बनाता है जिसमें हर गेम का सीड अगले गेम के सीड का SHA-256 हैश होता है, और final hash पहले से प्रकाशित करता है। क्योंकि हैशिंग सिर्फ एक दिशा में काम करती है, ऑपरेटर chain तोड़े बिना भविष्य के गेम नहीं बदल सकता, और कोई भी सामने आए गेम को आगे हैश करके जांच सकता है। casinos के बीच बारीकियां काफी अलग होती हैं, इसलिए इन गेम्स के लिए हर casino के अपने निर्देश इस्तेमाल करें।
त्वरित checklist
| जांच | हो गया? |
|---|---|
| खेलने से पहले हैश किया गया सर्वर सीड casino से बाहर सेव किया | |
अपने हैशिंग टूल को abc टेस्ट वैल्यू से जांचा |
|
| सामने आए सीड को टेक्स्ट के रूप में हैश किया, बिना आखिरी स्पेस या newline के | |
| सभी 64 अक्षर सेव किए गए हैश से मेल खाते हैं | |
| सामने आया सीड पूरी लंबाई का है और दोहराया हुआ नहीं |
स्रोत
- NIST FIPS 180-4, Secure Hash Standard: https://csrc.nist.gov/pubs/fips/180-4/upd1/final
- RFC 2104, HMAC: Keyed-Hashing for Message Authentication: https://datatracker.ietf.org/doc/html/rfc2104
- NIST FIPS 198-1, The Keyed-Hash Message Authentication Code (HMAC): https://csrc.nist.gov/pubs/fips/198-1/final
- Python दस्तावेज़, hashlib मॉड्यूल: https://docs.python.org/3/library/hashlib.html
- Python दस्तावेज़, hmac मॉड्यूल: https://docs.python.org/3/library/hmac.html
मुख्य शर्तें
- SHA-256
- एक cryptographic हैश फंक्शन जो किसी भी इनपुट को तय 256-bit आउटपुट में बदलता है; सर्वर सीड के लिए प्रतिबद्धता देने में इस्तेमाल होता है।
- हैश किया गया सर्वर सीड
- casino के गुप्त सर्वर सीड का SHA-256 हैश, जो खेलने से पहले इस प्रतिबद्धता के रूप में दिखाया जाता है कि सीड नहीं बदलेगा।
- सर्वर सीड
- casino द्वारा बनाई गई एक गुप्त रैंडम वैल्यू जो आपके क्लाइंट सीड और nonce के साथ मिलकर दांव के नतीजे तय करती है।
- सीड रोटेशन
- सक्रिय सर्वर सीड को नए सीड से बदलना, जिससे पुराना सीड सामने आता है ताकि उसके दांव वेरिफाई किए जा सकें।
- HMAC
- एक keyed हैश फंक्शन; provably fair गेम्स में HMAC-SHA256 सर्वर सीड को क्लाइंट सीड और nonce के साथ जोड़ता है।
- क्लाइंट सीड
- खिलाड़ी द्वारा चुनी या बदली जा सकने वाली वैल्यू जो हर नतीजे में मिलाई जाती है, ताकि casino अकेले नतीजे पहले से न निकाल सके।
- Crash गेम
- एक गेम जिसमें multiplier 1x से तब तक बढ़ता है जब तक crash न हो जाए, और जीतने के लिए आपको crash से पहले कैश आउट करना होता है।
- Provably fair
- एक सिस्टम जो खिलाड़ियों को cryptographically जांचने देता है कि गेम का नतीजा दांव से पहले तय था और बाद में बदला नहीं गया।