बीक्रिप्ट: Difference between revisions
(Text) |
No edit summary |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 29: | Line 29: | ||
== पृष्ठभूमि == | == पृष्ठभूमि == | ||
ब्लोफिश अपने महंगे कुंजी व्यवस्था चरण के लिए ब्लॉक सिफर के बीच उल्लेखनीय है। यह एक मानक स्थिति में उपकुंजियों के साथ प्रारम्भ होता है, फिर कुंजी के भाग का उपयोग करके ब्लॉक एन्क्रिप्शन करने के लिए इस स्थिति का उपयोग करता है, और कुछ उपकुंजियों को बदलने के लिए उस एन्क्रिप्शन (जो हैशिंग पर अधिक सटीक है) के परिणाम का उपयोग करता है। फिर यह कुंजी के दूसरे भाग को एन्क्रिप्ट करने के लिए इस संशोधित स्थिति का उपयोग करता है, और अधिक उपकुंजियों को बदलने के लिए परिणाम का उपयोग करता है। यह इस तरह से आगे बढ़ता है, जब तक कि सभी उपकुंजियों को सेट नहीं किया जाता है, तब तक कुंजी को हैश करने और संशोधित स्थिति के बिट्स को बदलने के लिए उत्तरोत्तर संशोधित स्थिति का उपयोग किया जाता है। | |||
प्रोवोस और मज़ीरेस ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर <nowiki>''</nowiki>एक्सब्लोफिश<nowiki>''</nowiki> (<nowiki>''</nowiki>महंगा कुंजी शेड्यूल ब्लोफिश<nowiki>''</nowiki>) को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से प्रारम्भ होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए साल्ट और पासवर्ड दोनों का उपयोग किया जाता है। इसके बाद कई चरण होते हैं जिनमें मानक ब्लोफिश कीइंग एल्गोरिथ्म को वैकल्पिक रूप से साल्ट और पासवर्ड को कुंजी के रूप में उपयोग करते हुए लागू किया जाता है, प्रत्येक चरण पिछले चरण से उपकुंजी स्थिति से प्रारम्भ होता है। सैद्धांतिक रूप में, यह मानक ब्लोफिश कुंजी कार्यसूची से अधिक मजबूत नहीं है, लेकिन रीकीइंग चरण की संख्या विन्यास योग्य है; इसलिए इस प्रक्रिया को स्वेच्छतः धीमा किया जा सकता है, जो हैश या साल्ट पर क्रूर-बल के हमलों को रोकने में मदद करता है। | |||
== विवरण == | == विवरण == | ||
बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट | बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट प्रायः एक यादृच्छिक मान है। 24-बाइट (192-बिट) हैश की गणना करने के लिए बीक्रिप्ट फ़ंक्शन इन इनपुट्स का उपयोग करता है। बीक्रिप्ट फ़ंक्शन का अंतिम आउटपुट फ़ॉर्म की एक स्ट्रिंग है: | ||
$2<nowiki><a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]</nowiki> | $2<nowiki><a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]</nowiki> | ||
उदाहरण के लिए, इनपुट पासवर्ड के साथ <code>abc123xyz</code> | उदाहरण के लिए, इनपुट पासवर्ड के साथ<code>abc123xyz,</code> लागत <code>12</code>, और एक यादृच्छिक साल्ट, बीक्रिप्ट का आउटपुट स्ट्रिंग है | ||
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW | $2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW | ||
\__/\/ \____________________/\________________________________________/ | \__/\/ \____________________/\________________________________________/ | ||
एल्ग कॉस्ट सॉल्ट हैश | एल्ग कॉस्ट सॉल्ट हैश | ||
जहां: | |||
* <code>$2a$</code>: हैश एल्गोरिथम पहचानकर्ता (बीक्रिप्ट) | * <code>$2a$</code>: हैश एल्गोरिथम पहचानकर्ता (बीक्रिप्ट) | ||
Line 52: | Line 52: | ||
* <code>PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW</code>: परिकलित 24 बाइट हैश के पहले 23 बाइट्स का बेस-64 एन्कोडिंग | * <code>PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW</code>: परिकलित 24 बाइट हैश के पहले 23 बाइट्स का बेस-64 एन्कोडिंग | ||
बीक्रिप्ट में बेस-64 एनकोडिंग तालिका का उपयोग करता है <code>./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</code>,<ref name="bcrypt.c_lines_57-58">{{Cite web|last=Provos|first=Niels|date=13 February 1997|title=bcrypt.c स्रोत कोड, लाइन्स 57-58|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c?rev=1.1&content-type=text/x-cvsweb-markup|access-date=29 January 2022}}</ref> जो | बीक्रिप्ट में बेस-64 एनकोडिंग तालिका का उपयोग करता है <code>./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</code>,<ref name="bcrypt.c_lines_57-58">{{Cite web|last=Provos|first=Niels|date=13 February 1997|title=bcrypt.c स्रोत कोड, लाइन्स 57-58|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c?rev=1.1&content-type=text/x-cvsweb-markup|access-date=29 January 2022}}</ref> जो {{IETF RFC|4648}} [[बेस 64]] एन्कोडिंग से अलग है। | ||
== संस्करण इतिहास == | == संस्करण इतिहास == | ||
$2$ (1999) | '''$2$ (1999)''' | ||
मूल बीक्रिप्ट विनिर्देशन | मूल बीक्रिप्ट विनिर्देशन <code>$2$</code> के एक उपसर्ग को परिभाषित करता है। यह ओपनबीएसडी पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला '''मॉड्यूलर [[ तहखाना (सी) |क्रिप्ट]] प्रारूप<ref>{{cite web|url=https://passlib.readthedocs.io/en/stable/modular_crypt_format.html|title=Modular Crypt Format — Passlib v1.7.1 Documentation|website=passlib.readthedocs.io}}</ref>''' का अनुसरण करता है: | ||
* <code>$1$</code>: MD5-आधारित क्रिप्ट (' | * <code>$1$</code>: MD5-आधारित क्रिप्ट ('md5क्रिप्ट ') | ||
* <code>$2$</code>: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट') | * <code>$2$</code>: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट') | ||
* <code>$ | * <code>$एसएचए1$</code>: एसएचए-1-आधारित क्रिप्ट ('एसएचए1क्रिप्ट') | ||
* <code>$5$</code>: | * <code>$5$</code>: एसएचए-256-आधारित क्रिप्ट ('एसएचए256क्रिप्ट') | ||
* <code>$6$</code>: | * <code>$6$</code>: एसएचए-512-आधारित क्रिप्ट ('एसएचए512क्रिप्ट') | ||
$2a$ | '''$2a$''' | ||
मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई | मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई वर्ण को कैसे संभालना है, न ही एक अशक्त टर्मिनेटर को कैसे संभालना है। विनिर्देश को यह निर्दिष्ट करने के लिए संशोधित किया गया था कि हैशिंग स्ट्रिंग्स: | ||
* स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए | * स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए | ||
* अशक्त टर्मिनेटर सम्मिलित होना चाहिए | * अशक्त टर्मिनेटर सम्मिलित होना चाहिए | ||
इस परिवर्तन के साथ, संस्करण को | इस परिवर्तन के साथ, संस्करण को <code>$2a$ में</code>बदल दिया गया था <ref name="undeadly.org">{{Cite web|url=http://undeadly.org/cgi?action=article&sid=20140224132743|title=bcrypt पासवर्ड हैश बग फिक्स, संस्करण परिवर्तन और परिणाम|website=undeadly.org}}</ref> | ||
'''$2x$, $2y$ (जून 2011)''' | |||
जून 2011 में, '''क्रिप्ट_ब्लोफिश''' में एक बग की खोज की गई थी, जो कि बीक्रिप्ट का एक PHP कार्यान्वयन है। यह 8 बिट सेट वाले वर्णों को गलत तरीके से संभाल रहा था।<ref>{{cite web|url=http://seclists.org/oss-sec/2011/q2/632|title=oss-sec: CVE request: crypt_blowfish 8-bit character mishandling|first=Solar|last=Designer|website=seclists.org}}</ref> उन्होंने सुझाव दिया कि सिस्टम प्रशासक अपने वर्तमान पासवर्ड डेटाबेस को बदलकर अद्यतन करें <code>$2a$</code> को<code>$2x$,</code>के साथ बदलते हैं, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए '''क्रिप्ट_ब्लोफिश''' एमिट <code>$2y$</code>होने का सुझाव भी दिया। | |||
कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को नहीं अपनाया। यह संस्करण मार्कर परिवर्तन '''क्रिप्ट_ब्लोफिश''' तक सीमित था। | |||
'''$2b$ (फरवरी 2014)''' | |||
बीक्रिप्ट ओपनबीएसडी के लिए बनाया गया था। जब उनके | बीक्रिप्ट के ओपनबीएसडी कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक असंकेतित 8-बिट मान का उपयोग कर रहा था।<ref name="undeadly.org" /><ref>{{cite web|url=http://marc.info/?l=openbsd-misc&m=139320023202696|title='बीक्रिप्ट संस्करण परिवर्तन' - मार्क|website=marc.info}}</ref><ref>{{Cite web|date=17 February 2014|title=bcrypt.c code fix for 2014 bug|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c.diff?r1=1.26&r2=1.27&f=h|url-status=live|archive-url=https://web.archive.org/web/20220218062645/https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c.diff?r1=1.26&r2=1.27&f=h|archive-date=17 February 2022|access-date=17 February 2022}}</ref> 255 बाइट्स से अधिक लंबे पासवर्ड के लिए, 72 बाइट्स पर छोटा किए जाने के अपेक्षाकृत पासवर्ड को 72 से कम या लंबाई [[मॉड्यूलर अंकगणित|माड्यूलो]] 256 पर छोटा कर दिया जाएगा। उदाहरण के लिए, एक 260 बाइट पासवर्ड को 72 बाइट्स पर छोटा करने के अपेक्षाकृत 4 बाइट्स पर छोटा कर दिया जाएगा। | ||
बीक्रिप्ट ओपनबीएसडी के लिए बनाया गया था। जब उनके लाइब्रेरी में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया। | |||
== एल्गोरिथम == | == एल्गोरिथम == | ||
नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश | नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश का उपयोग करके 64 बार <nowiki>''</nowiki>''ऑर्फीनबीहोल्डरस्क्रीडाउट<nowiki>''</nowiki>'' टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (ईकेएसब्लोफिशसेटअप) फंक्शन से बदल दिया जाता है: | ||
'''Function''' bcrypt | |||
'''Function''' bcrypt | |||
'''Input:''' | |||
cost: Number (4..31) log<sub>2</sub>(Iterations). e.g. 12 ==> 2<sup>12</sup> = 4,096 iterations | |||
salt: array of Bytes (16 bytes) random salt | |||
password: array of Bytes (1..72 bytes) UTF-8 encoded password | |||
'''Output:''' | |||
hash: array of Bytes (24 bytes) | |||
//Initialize Blowfish state with expensive key setup algorithm | |||
//P: array of 18 subkeys (UInt32[18]) | |||
//S: Four substitution boxes (S-boxes), S<sub>0</sub>...S<sub>3</sub>. Each S-box is 1,024 bytes (UInt32[256]) | |||
''P'', ''S'' ← EksBlowfishSetup(''cost'', ''salt'', ''password'') | |||
//Repeatedly encrypt the text "OrpheanBeholderScryDoubt" 64 times | |||
ctext ← | ''ctext'' ← ''"OrpheanBeholderScryDoubt"'' //24 bytes ==> three 64-bit blocks | ||
'''repeat''' (64) | |||
ctext ← EncryptECB(P, S, ctext) | ''ctext'' ← EncryptECB(''P'', ''S'', ''ctext'') //encrypt using standard Blowfish in ECB mode | ||
//24-byte ''ctext'' is resulting password hash | |||
'''return''' Concatenate(''cost'', ''salt'', ''ctext'') | |||
=== महंगा कुंजी सेटअप === | === महंगा कुंजी सेटअप === | ||
बीक्रिप्ट एल्गोरिथम अपने | बीक्रिप्ट एल्गोरिथम अपने <nowiki>''</nowiki>ईकेएसब्लोफिश<nowiki>''</nowiki> कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है: | ||
'''Function''' EksBlowfishSetup | |||
'''Input:''' | |||
password: array of Bytes (1..72 bytes) UTF-8 encoded password | |||
salt: array of Bytes (16 bytes) random salt | |||
cost: Number (4..31) log<sub>2</sub>(Iterations). e.g. 12 ==> 2<sup>12</sup> = 4,096 iterations | |||
'''Output:''' | |||
P: array of UInt32 array of 18 per-round subkeys | |||
S<sub>1</sub>..S<sub>4</sub>: array of UInt32 array of four SBoxes; each SBox is 256 UInt32 (''i.e.'' each SBox is 1 KiB) | |||
//Initialize P (Subkeys), and S (Substitution boxes) with the hex digits of pi | |||
''P'', ''S'' ← InitialState() | |||
//Permute P and S based on the password and salt | |||
P, S ← ExpandKey(P, S, | ''P'', ''S'' ← ExpandKey(''P'', ''S'', ''salt'', ''password'') | ||
//This is the "Expensive" part of the "Expensive Key Setup". | |||
//Otherwise the key setup is identical to Blowfish. | |||
'''repeat''' (2<sup>''cost''</sup>) | |||
P, S ← ExpandKey(P, S, 0, | ''P'', ''S'' ← ExpandKey(''P'', ''S'', 0, password) | ||
P, S ← ExpandKey(P, S, 0, | ''P'', ''S'' ← ExpandKey(''P'', ''S'', 0, salt) | ||
< | '''return''' ''P'', ''S'' | ||
इनिशियलस्टेट ब्लोफिश एल्गोरिथम की तरह काम करता है, पी-ऐरे और एस-बॉक्स प्रविष्टियों को हेक्साडेसिमल हेक्साडेसिमल <math>\pi</math> के आंशिक भाग के साथ पॉप्युलेट करता है। | |||
=== एक्सपैंड कीय === | |||
एक्सपैंडकीय फ़ंक्शन निम्न कार्य करता है: | |||
'''Function''' ExpandKey | |||
'''Input:''' | |||
password: array of Bytes (1..72 bytes) UTF-8 encoded password | |||
salt: Byte[16] random salt | |||
P: array of UInt32 Array of 18 subkeys | |||
S<sub>1</sub>..S<sub>4</sub>: UInt32[1024] Four 1 KB SBoxes | |||
'''Output:''' | |||
P: array of UInt32 Array of 18 per-round subkeys | |||
S<sub>1</sub>..S<sub>4</sub>: UInt32[1024] Four 1 KB SBoxes | |||
//Mix password into the P subkeys array | |||
'''for''' ''n'' ← 1 '''to''' 18 '''do''' | |||
P<sub>n</sub> ← P<sub>n</sub> xor ''password''[32(n-1)..32n-1] //treat the password as cyclic | |||
//Treat the 128-bit salt as two 64-bit halves (the Blowfish block size). | |||
saltHalf[0] ← ''salt''[0..63] //Lower 64-bits of salt | |||
saltHalf[1] ← ''salt''[64..127] //Upper 64-bits of salt | |||
//Initialize an 8-byte (64-bit) buffer with all zeros. | |||
block ← 0 | |||
//Mix internal state into P-boxes | |||
'''for''' ''n'' ← 1 '''to''' 9 '''do''' | |||
//xor 64-bit ''block'' with a 64-bit salt half | |||
''block'' ← ''block'' xor ''saltHalf''[(n-1) mod 2] //each iteration alternating between ''saltHalf''[0], and ''saltHalf''[1] | |||
//encrypt block using current key schedule | |||
''block'' ← Encrypt(''P'', '''S''', ''block'') | |||
P<sub>2n</sub> ← ''block''[0..31] //lower 32-bits of ''block'' | |||
P<sub>2n+1</sub> ← ''block''[32..63] //upper 32-bits ''block'' | |||
//Mix encrypted state into the internal S-boxes of ''state'' | |||
'''for''' ''i'' ← 1 '''to''' 4 '''do''' | |||
'''for''' ''n'' ← 0 '''to''' 127 '''do''' | |||
''block'' ← Encrypt(''state'', ''block'' '''xor''' ''salt''[64(n-1)..64n-1]) //as above | |||
S<sub>i</sub>[2n] ← ''block''[0..31] //lower 32-bits | |||
S<sub>i</sub>[2n+1] ← ''block''[32..63] //upper 32-bits | |||
< | '''return''' ''state'' | ||
इस तरह,<code>एक्सपैंडकीय(''स्थिति'' , 0, ''कुंजी'')</code>नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं। <code>एक्सपैंडकीय(''स्थिति'' , 0, ''साल्ट'')</code> समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है। | |||
== उपयोगकर्ता इनपुट == | |||
ओपनबीएसडी कार्यान्वयन के बाद, बीक्रिप्ट के कई कार्यान्वयन पासवर्ड को पहले 72 बाइट्स तक छाँट कर छोटा कर देते हैं। | |||
गणितीय एल्गोरिथ्म को स्वयं 18 32-बिट उपकुंजियों (72 ऑक्टेट/बाइट्स के बराबर) के साथ आरंभीकरण की आवश्यकता होती है। बीक्रिप्ट का मूल विनिर्देश एल्गोरिदम के लिए उपयोगकर्ता स्थान से संख्यात्मक मानों में टेक्स्ट-आधारित पासवर्ड मैप करने के लिए किसी एक विशेष विधि को अनिवार्य नहीं करता है। पाठ में एक संक्षिप्त टिप्पणी का उल्लेख है, लेकिन यह अनिवार्य नहीं है, केवल एक वर्ण स्ट्रिंग के एएससीआईआई एन्कोडेड मान का उपयोग करने की संभावना: <nowiki>''</nowiki>अंत में, मुख्य तर्क एक गुप्त एन्क्रिप्शन कुंजी है, जो तक उपयोगकर्ता द्वारा चुना गया 56 बाइट्स का पासवर्ड हो सकता है (कुंजी के एएससीआईआई स्ट्रिंग होने पर समाप्ति शून्य बाइट सहित)।<nowiki>''</nowiki><ref name=provos/> | |||
ध्यान दें कि उपरोक्त उद्धरण <nowiki>''56 बाइट्स तक''</nowiki> के पासवर्ड का उल्लेख करता है, भले ही एल्गोरिथ्म स्वयं 72 बाइट प्रारंभिक मान का उपयोग करता हो। हालांकि प्रोवोस और माजिएरेस छोटे प्रतिबंध का कारण नहीं बताते हैं, वे [[ब्रूस श्नेयर]] के ब्लोफिश के मूल विनिर्देश से निम्नलिखित कथन से प्रेरित हो सकते हैं, <nowiki>''</nowiki>कुंजी आकार पर 448 [बिट] सीमा यह सुनिश्चित करती है कि{{sic}} प्रत्येक उपकुंजी का प्रत्येक बिट कुंजी के प्रत्येक बिट पर निर्भर करता है।<nowiki>''</nowiki><ref>{{cite journal | url = https://www.schneier.com/paper-blowfish-fse.html | title = Fast Software Encryption, Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish) | first = Bruce | last = Schneier | publisher = Springer-Verlag | journal = Cambridge Security Workshop Proceedings |date=December 1993 | pages = 191–204}}</ref> | |||
कार्यान्वयन में पासवर्ड को प्रारंभिक संख्यात्मक मानों में परिवर्तित करने के उनके दृष्टिकोण में भिन्नता है, जिसमें कभी-कभी गैर-एएससीआईआई वर्णों वाले पासवर्ड की शक्ति को कम करना भी सम्मिलित है।<ref>{{cite web |url=http://www.mindrot.org/files/jBCrypt/internat.adv |date=1 February 2010 |title=jBCrypt security advisory}} And {{cite web |url=https://php.net/security/crypt_blowfish.php |title=Changes in CRYPT_BLOWFISH in PHP 5.3.7 |work=php.net}}</ref> | |||
== अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना == | == अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना == | ||
यह | यह ध्यान रखना महत्वपूर्ण है कि बीक्रिप्ट एक कीय डैरीवेसन फंक्शन (केडीएफ) नहीं है। उदाहरण के लिए, पासवर्ड से 512-बिट कुंजी प्राप्त करने के लिए बीक्रिप्ट का उपयोग नहीं किया जा सकता है। उसी समय, [[pbkdf2|पीबीकेडीएफ2]], [[scrypt|स्क्रिप्ट]], और [[argon2|आर्गन2]] जैसे एल्गोरिदम पासवर्ड-आधारित कुंजी व्युत्पत्ति फंक्शन हैं - जहाँ आउटपुट का उपयोग केवल कुंजी व्युत्पत्ति के बजाय पासवर्ड हैशिंग के उद्देश्य से किया जाता है। | ||
पासवर्ड हैशिंग को | पासवर्ड हैशिंग को प्रायः <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट पीबीकेडीएफ2, स्क्रिप्ट, और आर्गन2 से ज्यादा मजबूत है। | ||
* 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। | * '''पीबीकेडीएफ2''': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। प्रायः उपयोग किया जाने वाला एसएचए2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। एसएचए2 को अत्यधिक हल्के वजन के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।<ref>https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf {{Bare URL PDF|date=March 2022}}</ref> इसका मतलब है कि पीबीकेडीएफ2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी एसएचए-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है<ref>{{Cite web|url=https://www.asicminervalue.com/miners/goldshell/kd6|title=Goldshell KD6 profitability | ASIC Miner Value}}</ref> | ||
* स्क्रीप्ट: 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।<ref>{{Cite web|url=https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html#Putting-It-In-Perspective|title=मैं स्क्रीप्ट की सिफारिश क्यों नहीं करता|date=12 March 2014}}</ref> जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है। | * '''स्क्रीप्ट''': 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।<ref>{{Cite web|url=https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html#Putting-It-In-Perspective|title=मैं स्क्रीप्ट की सिफारिश क्यों नहीं करता|date=12 March 2014}}</ref> जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है। | ||
* आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड | * '''आर्गन2''': आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड प्रमाणीकरण के लिए) के लिए बीक्रिप्ट से कमजोर है। आर्गन2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक बीक्रिप्ट की शक्ति से मेल नहीं खाता या पार नहीं करता है।{{Citation needed|date=April 2022}} | ||
* | * '''पफरफिश'''2 बीक्रिप्ट का विकास है जो ट्यून करने योग्य मेमोरी फुटप्रिंट (जैसे स्क्रीप्ट और आर्गन2) का उपयोग करता है, न कि बीक्रिप्ट के फिक्स्ड 4 केबी मेमोरी फुटप्रिंट का। स्क्रीप्ट या आर्गन2 के समान, पफरफिश2 अधिक मेमोरी का उपयोग करके अपनी कठिनाई प्राप्त करता है। स्क्रीप्ट और आर्गन2 के विपरीत, पफरफिश2 केवल सीपीयू कोर के एल2 कैश में काम करता है। जबकि स्क्रीप्ट और आर्गन 2 अपनी मेमोरी कठोरता को यादृच्छिक ढंग से सी रैम तक पहुंच कर प्राप्त करते हैं, पफरफिश2 खुद को सीपीयू कोर के लिए उपलब्ध समर्पित एल 2 कैश तक ही सीमित करता है। यह स्क्रीप्ट और आर्गन2 की तुलना में कस्टम हार्डवेयर में लागू करना और भी कठिन बना देता है। पफरफिश 2 का आदर्श मेमोरी फुटप्रिंट कोर के लिए उपलब्ध कैश का आकार है (उदाहरण के लिए इंटेल एल्डर लेक के लिए 1.25 एमबी<ref>{{Cite web|url=https://ark.intel.com/content/www/us/en/ark/products/134586/intel-core-i512400-processor-18m-cache-up-to-4-40-ghz.html|title = Product Specifications}}</ref>) यह पफरफिश2 को जीपीयू या एएसआईसी के प्रति अधिक प्रतिरोधी बनाता है। | ||
== आलोचना == | == आलोचना == | ||
Line 208: | Line 216: | ||
=== अधिकतम पासवर्ड लंबाई === | === अधिकतम पासवर्ड लंबाई === | ||
बीक्रिप्ट की अधिकतम पासवर्ड लंबाई 72 बाइट्स है। यह अधिकतम | बीक्रिप्ट की अधिकतम पासवर्ड लंबाई 72 बाइट्स है। यह अधिकतम एक्सपैंडकीय फ़ंक्शन के पहले ऑपरेशन से आता है जो पासवर्ड के साथ<code>xor</code>की 18 4-बाइट उपकुंजियाँ (पी) हैं: | ||
P<sub>1</sub>..P<sub>18</sub> ← P<sub>1</sub>..P<sub>18</sub> xor पासवर्डबाइट्स | |||
पासवर्ड (जो UTF-8 एन्कोडेड है), 72-बाइट लंबा होने तक दोहराया जाता है। उदाहरण के लिए, | पासवर्ड (जो UTF-8 एन्कोडेड है), 72-बाइट लंबा होने तक दोहराया जाता है। उदाहरण के लिए, एक पासवर्ड: | ||
:<code>correct horse battery staple␀</code> (29 बाइट्स) | :<code>correct horse battery staple␀</code> (29 बाइट्स) | ||
Line 246: | Line 254: | ||
=== बेस 64 एन्कोडिंग वर्णमाला === | === बेस 64 एन्कोडिंग वर्णमाला === | ||
कैनोनिकल ओपनबीएसडी कार्यान्वयन द्वारा उपयोग की जाने वाली एन्कोडिंग क्रिप्ट | कैनोनिकल ओपनबीएसडी कार्यान्वयन द्वारा उपयोग की जाने वाली एन्कोडिंग क्रिप्ट के समान बेस 64 वर्णमाला का उपयोग करती है, जो है <code>./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</code>.<ref name="bcrypt.c_lines_57-58" />इसका अर्थ है कि एन्कोडिंग अधिक सामान्य RFC 4648 के साथ संगत नहीं है।{{citation needed|date=November 2021}} | ||
== यह भी देखें == | == यह भी देखें == | ||
Line 257: | Line 265: | ||
* [[चाबी खींचना]] | * [[चाबी खींचना]] | ||
* [[mcrypt]] - उपयोगिता | * [[mcrypt]] - उपयोगिता | ||
* [[PBKDF2]] - एक व्यापक रूप से | * [[PBKDF2|पीबीकेडीएफ2]] - एक व्यापक रूप से उपयोग किया जाने वाला मानक पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन 2 | ||
* स्क्रीप्ट - पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन (और एक उपयोगिता भी) | * स्क्रीप्ट - पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन (और एक उपयोगिता भी) | ||
Line 269: | Line 277: | ||
{{Cryptography navbox | hash}} | {{Cryptography navbox | hash}} | ||
[[Category: | [[Category:All articles with bare URLs for citations]] | ||
[[Category:All articles with unsourced statements]] | |||
[[Category:Articles with PDF format bare URLs for citations]] | |||
[[Category:Articles with bare URLs for citations from March 2022]] | |||
[[Category:Articles with hatnote templates targeting a nonexistent page]] | |||
[[Category:Articles with unsourced statements from April 2022]] | |||
[[Category:Articles with unsourced statements from November 2021]] | |||
[[Category:CS1 English-language sources (en)]] | |||
[[Category:Collapse templates]] | |||
[[Category:Created On 11/05/2023]] | [[Category:Created On 11/05/2023]] | ||
[[Category:Cryptographic hash functions]] | |||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:Navigational boxes| ]] | |||
[[Category:Navigational boxes without horizontal lists]] | |||
[[Category:Pages with empty portal template]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Portal templates with redlinked portals]] | |||
[[Category:Sidebars with styles needing conversion]] | |||
[[Category:Template documentation pages|Documentation/doc]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates generating microformats]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that are not mobile friendly]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:Wikipedia metatemplates]] | |||
[[Category:क्रिप्टोग्राफिक सॉफ्टवेयर]] |
Latest revision as of 16:15, 29 May 2023
General | |
---|---|
Designers | Niels Provos, David Mazières |
First published | 1999 |
Derived from | Blowfish (cipher) |
Detail | |
Digest sizes | 184 bit |
Rounds | variable via cost parameter |
बीक्रिप्ट एक पासवर्ड-हैशिंग फ़ंक्शन है, जिसे नील्स प्रोवोस और डेविड माज़िएरेस द्वारा डिज़ाइन किया गया है, जो ब्लोफिश सिफर पर आधारित है और 1999 में यू एस इ एन आई एक्स में प्रस्तुत किया गया था।[1] रेनबो टेबल हमलों से बचाने के लिए एक साल्ट को सम्मिलित करने के अलावा, बीक्रिप्ट एक अनुकूली फ़ंक्शन है: समय के साथ, पुनरावृत्ति की संख्या को इसे धीमा करने के लिए बढ़ाया जा सकता है, इसलिए यह संगणना शक्ति बढ़ने के साथ भी क्रूर-बल खोज हमलों के लिए प्रतिरोधी रहता है।
बीक्रिप्ट फ़ंक्शन ओपनबीएसडी के लिए डिफ़ॉल्ट पासवर्ड हैश एल्गोरिथ्म है[2] और कुछ लिनक्स वितरण जैसे एस यू एस इ लिनक्स के लिए डिफ़ॉल्ट था।[3]
C, C++, Cशार्प, एम्बरकाडेरो डेल्फी, एलिक्सिर, गो,[4] जावा,[5][6] जावास्क्रिप्ट,[7] पर्ल, पीएचपी, पायथन,[8] रूबी, और अन्य भाषाओं में बीक्रिप्ट के कार्यान्वयन हैं।[9] ।
पृष्ठभूमि
ब्लोफिश अपने महंगे कुंजी व्यवस्था चरण के लिए ब्लॉक सिफर के बीच उल्लेखनीय है। यह एक मानक स्थिति में उपकुंजियों के साथ प्रारम्भ होता है, फिर कुंजी के भाग का उपयोग करके ब्लॉक एन्क्रिप्शन करने के लिए इस स्थिति का उपयोग करता है, और कुछ उपकुंजियों को बदलने के लिए उस एन्क्रिप्शन (जो हैशिंग पर अधिक सटीक है) के परिणाम का उपयोग करता है। फिर यह कुंजी के दूसरे भाग को एन्क्रिप्ट करने के लिए इस संशोधित स्थिति का उपयोग करता है, और अधिक उपकुंजियों को बदलने के लिए परिणाम का उपयोग करता है। यह इस तरह से आगे बढ़ता है, जब तक कि सभी उपकुंजियों को सेट नहीं किया जाता है, तब तक कुंजी को हैश करने और संशोधित स्थिति के बिट्स को बदलने के लिए उत्तरोत्तर संशोधित स्थिति का उपयोग किया जाता है।
प्रोवोस और मज़ीरेस ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर ''एक्सब्लोफिश'' (''महंगा कुंजी शेड्यूल ब्लोफिश'') को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से प्रारम्भ होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए साल्ट और पासवर्ड दोनों का उपयोग किया जाता है। इसके बाद कई चरण होते हैं जिनमें मानक ब्लोफिश कीइंग एल्गोरिथ्म को वैकल्पिक रूप से साल्ट और पासवर्ड को कुंजी के रूप में उपयोग करते हुए लागू किया जाता है, प्रत्येक चरण पिछले चरण से उपकुंजी स्थिति से प्रारम्भ होता है। सैद्धांतिक रूप में, यह मानक ब्लोफिश कुंजी कार्यसूची से अधिक मजबूत नहीं है, लेकिन रीकीइंग चरण की संख्या विन्यास योग्य है; इसलिए इस प्रक्रिया को स्वेच्छतः धीमा किया जा सकता है, जो हैश या साल्ट पर क्रूर-बल के हमलों को रोकने में मदद करता है।
विवरण
बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट प्रायः एक यादृच्छिक मान है। 24-बाइट (192-बिट) हैश की गणना करने के लिए बीक्रिप्ट फ़ंक्शन इन इनपुट्स का उपयोग करता है। बीक्रिप्ट फ़ंक्शन का अंतिम आउटपुट फ़ॉर्म की एक स्ट्रिंग है:
$2<a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]
उदाहरण के लिए, इनपुट पासवर्ड के साथabc123xyz,
लागत 12
, और एक यादृच्छिक साल्ट, बीक्रिप्ट का आउटपुट स्ट्रिंग है
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW \__/\/ \____________________/\________________________________________/ एल्ग कॉस्ट सॉल्ट हैश
जहां:
$2a$
: हैश एल्गोरिथम पहचानकर्ता (बीक्रिप्ट)12
: इनपुट लागत (212 यानी 4096 राउंड)R9h/cIPz0gi.URNNX3kh2O
: इनपुट साल्ट का एक बेस-64 एनकोडिंगPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
: परिकलित 24 बाइट हैश के पहले 23 बाइट्स का बेस-64 एन्कोडिंग
बीक्रिप्ट में बेस-64 एनकोडिंग तालिका का उपयोग करता है ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
,[10] जो RFC 4648 बेस 64 एन्कोडिंग से अलग है।
संस्करण इतिहास
$2$ (1999)
मूल बीक्रिप्ट विनिर्देशन $2$
के एक उपसर्ग को परिभाषित करता है। यह ओपनबीएसडी पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला मॉड्यूलर क्रिप्ट प्रारूप[11] का अनुसरण करता है:
$1$
: MD5-आधारित क्रिप्ट ('md5क्रिप्ट ')$2$
: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट')$एसएचए1$
: एसएचए-1-आधारित क्रिप्ट ('एसएचए1क्रिप्ट')$5$
: एसएचए-256-आधारित क्रिप्ट ('एसएचए256क्रिप्ट')$6$
: एसएचए-512-आधारित क्रिप्ट ('एसएचए512क्रिप्ट')
$2a$
मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई वर्ण को कैसे संभालना है, न ही एक अशक्त टर्मिनेटर को कैसे संभालना है। विनिर्देश को यह निर्दिष्ट करने के लिए संशोधित किया गया था कि हैशिंग स्ट्रिंग्स:
- स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए
- अशक्त टर्मिनेटर सम्मिलित होना चाहिए
इस परिवर्तन के साथ, संस्करण को $2a$ में
बदल दिया गया था [12]
$2x$, $2y$ (जून 2011)
जून 2011 में, क्रिप्ट_ब्लोफिश में एक बग की खोज की गई थी, जो कि बीक्रिप्ट का एक PHP कार्यान्वयन है। यह 8 बिट सेट वाले वर्णों को गलत तरीके से संभाल रहा था।[13] उन्होंने सुझाव दिया कि सिस्टम प्रशासक अपने वर्तमान पासवर्ड डेटाबेस को बदलकर अद्यतन करें $2a$
को$2x$,
के साथ बदलते हैं, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए क्रिप्ट_ब्लोफिश एमिट $2y$
होने का सुझाव भी दिया।
कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को नहीं अपनाया। यह संस्करण मार्कर परिवर्तन क्रिप्ट_ब्लोफिश तक सीमित था।
$2b$ (फरवरी 2014)
बीक्रिप्ट के ओपनबीएसडी कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक असंकेतित 8-बिट मान का उपयोग कर रहा था।[12][14][15] 255 बाइट्स से अधिक लंबे पासवर्ड के लिए, 72 बाइट्स पर छोटा किए जाने के अपेक्षाकृत पासवर्ड को 72 से कम या लंबाई माड्यूलो 256 पर छोटा कर दिया जाएगा। उदाहरण के लिए, एक 260 बाइट पासवर्ड को 72 बाइट्स पर छोटा करने के अपेक्षाकृत 4 बाइट्स पर छोटा कर दिया जाएगा।
बीक्रिप्ट ओपनबीएसडी के लिए बनाया गया था। जब उनके लाइब्रेरी में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया।
एल्गोरिथम
नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश का उपयोग करके 64 बार ''ऑर्फीनबीहोल्डरस्क्रीडाउट'' टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (ईकेएसब्लोफिशसेटअप) फंक्शन से बदल दिया जाता है:
Function bcrypt
Function bcrypt
Input: cost: Number (4..31) log2(Iterations). e.g. 12 ==> 212 = 4,096 iterations salt: array of Bytes (16 bytes) random salt password: array of Bytes (1..72 bytes) UTF-8 encoded password Output: hash: array of Bytes (24 bytes) //Initialize Blowfish state with expensive key setup algorithm //P: array of 18 subkeys (UInt32[18]) //S: Four substitution boxes (S-boxes), S0...S3. Each S-box is 1,024 bytes (UInt32[256]) P, S ← EksBlowfishSetup(cost, salt, password) //Repeatedly encrypt the text "OrpheanBeholderScryDoubt" 64 times ctext ← "OrpheanBeholderScryDoubt" //24 bytes ==> three 64-bit blocks repeat (64) ctext ← EncryptECB(P, S, ctext) //encrypt using standard Blowfish in ECB mode //24-byte ctext is resulting password hash return Concatenate(cost, salt, ctext)
महंगा कुंजी सेटअप
बीक्रिप्ट एल्गोरिथम अपने ''ईकेएसब्लोफिश'' कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है:
Function EksBlowfishSetup
Input: password: array of Bytes (1..72 bytes) UTF-8 encoded password
salt: array of Bytes (16 bytes) random salt cost: Number (4..31) log2(Iterations). e.g. 12 ==> 212 = 4,096 iterations Output: P: array of UInt32 array of 18 per-round subkeys S1..S4: array of UInt32 array of four SBoxes; each SBox is 256 UInt32 (i.e. each SBox is 1 KiB) //Initialize P (Subkeys), and S (Substitution boxes) with the hex digits of pi P, S ← InitialState() //Permute P and S based on the password and salt P, S ← ExpandKey(P, S, salt, password) //This is the "Expensive" part of the "Expensive Key Setup". //Otherwise the key setup is identical to Blowfish. repeat (2cost) P, S ← ExpandKey(P, S, 0, password) P, S ← ExpandKey(P, S, 0, salt) return P, S
इनिशियलस्टेट ब्लोफिश एल्गोरिथम की तरह काम करता है, पी-ऐरे और एस-बॉक्स प्रविष्टियों को हेक्साडेसिमल हेक्साडेसिमल के आंशिक भाग के साथ पॉप्युलेट करता है।
एक्सपैंड कीय
एक्सपैंडकीय फ़ंक्शन निम्न कार्य करता है:
Function ExpandKey Input: password: array of Bytes (1..72 bytes) UTF-8 encoded password salt: Byte[16] random salt P: array of UInt32 Array of 18 subkeys
S1..S4: UInt32[1024] Four 1 KB SBoxes Output:
P: array of UInt32 Array of 18 per-round subkeys S1..S4: UInt32[1024] Four 1 KB SBoxes //Mix password into the P subkeys array for n ← 1 to 18 do Pn ← Pn xor password[32(n-1)..32n-1] //treat the password as cyclic //Treat the 128-bit salt as two 64-bit halves (the Blowfish block size). saltHalf[0] ← salt[0..63] //Lower 64-bits of salt saltHalf[1] ← salt[64..127] //Upper 64-bits of salt //Initialize an 8-byte (64-bit) buffer with all zeros. block ← 0 //Mix internal state into P-boxes for n ← 1 to 9 do //xor 64-bit block with a 64-bit salt half block ← block xor saltHalf[(n-1) mod 2] //each iteration alternating between saltHalf[0], and saltHalf[1] //encrypt block using current key schedule block ← Encrypt(P, S, block) P2n ← block[0..31] //lower 32-bits of block P2n+1 ← block[32..63] //upper 32-bits block //Mix encrypted state into the internal S-boxes of state for i ← 1 to 4 do for n ← 0 to 127 do block ← Encrypt(state, block xor salt[64(n-1)..64n-1]) //as above Si[2n] ← block[0..31] //lower 32-bits Si[2n+1] ← block[32..63] //upper 32-bits return state
इस तरह,एक्सपैंडकीय(स्थिति , 0, कुंजी)
नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं। एक्सपैंडकीय(स्थिति , 0, साल्ट)
समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है।
उपयोगकर्ता इनपुट
ओपनबीएसडी कार्यान्वयन के बाद, बीक्रिप्ट के कई कार्यान्वयन पासवर्ड को पहले 72 बाइट्स तक छाँट कर छोटा कर देते हैं।
गणितीय एल्गोरिथ्म को स्वयं 18 32-बिट उपकुंजियों (72 ऑक्टेट/बाइट्स के बराबर) के साथ आरंभीकरण की आवश्यकता होती है। बीक्रिप्ट का मूल विनिर्देश एल्गोरिदम के लिए उपयोगकर्ता स्थान से संख्यात्मक मानों में टेक्स्ट-आधारित पासवर्ड मैप करने के लिए किसी एक विशेष विधि को अनिवार्य नहीं करता है। पाठ में एक संक्षिप्त टिप्पणी का उल्लेख है, लेकिन यह अनिवार्य नहीं है, केवल एक वर्ण स्ट्रिंग के एएससीआईआई एन्कोडेड मान का उपयोग करने की संभावना: ''अंत में, मुख्य तर्क एक गुप्त एन्क्रिप्शन कुंजी है, जो तक उपयोगकर्ता द्वारा चुना गया 56 बाइट्स का पासवर्ड हो सकता है (कुंजी के एएससीआईआई स्ट्रिंग होने पर समाप्ति शून्य बाइट सहित)।''[1]
ध्यान दें कि उपरोक्त उद्धरण ''56 बाइट्स तक'' के पासवर्ड का उल्लेख करता है, भले ही एल्गोरिथ्म स्वयं 72 बाइट प्रारंभिक मान का उपयोग करता हो। हालांकि प्रोवोस और माजिएरेस छोटे प्रतिबंध का कारण नहीं बताते हैं, वे ब्रूस श्नेयर के ब्लोफिश के मूल विनिर्देश से निम्नलिखित कथन से प्रेरित हो सकते हैं, ''कुंजी आकार पर 448 [बिट] सीमा यह सुनिश्चित करती है कि [sic] प्रत्येक उपकुंजी का प्रत्येक बिट कुंजी के प्रत्येक बिट पर निर्भर करता है।''[16]
कार्यान्वयन में पासवर्ड को प्रारंभिक संख्यात्मक मानों में परिवर्तित करने के उनके दृष्टिकोण में भिन्नता है, जिसमें कभी-कभी गैर-एएससीआईआई वर्णों वाले पासवर्ड की शक्ति को कम करना भी सम्मिलित है।[17]
अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना
यह ध्यान रखना महत्वपूर्ण है कि बीक्रिप्ट एक कीय डैरीवेसन फंक्शन (केडीएफ) नहीं है। उदाहरण के लिए, पासवर्ड से 512-बिट कुंजी प्राप्त करने के लिए बीक्रिप्ट का उपयोग नहीं किया जा सकता है। उसी समय, पीबीकेडीएफ2, स्क्रिप्ट, और आर्गन2 जैसे एल्गोरिदम पासवर्ड-आधारित कुंजी व्युत्पत्ति फंक्शन हैं - जहाँ आउटपुट का उपयोग केवल कुंजी व्युत्पत्ति के बजाय पासवर्ड हैशिंग के उद्देश्य से किया जाता है।
पासवर्ड हैशिंग को प्रायः <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट पीबीकेडीएफ2, स्क्रिप्ट, और आर्गन2 से ज्यादा मजबूत है।
- पीबीकेडीएफ2: पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। प्रायः उपयोग किया जाने वाला एसएचए2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। एसएचए2 को अत्यधिक हल्के वजन के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।[18] इसका मतलब है कि पीबीकेडीएफ2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी एसएचए-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है[19]
- स्क्रीप्ट: 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।[20] जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है।
- आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड प्रमाणीकरण के लिए) के लिए बीक्रिप्ट से कमजोर है। आर्गन2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक बीक्रिप्ट की शक्ति से मेल नहीं खाता या पार नहीं करता है।[citation needed]
- पफरफिश2 बीक्रिप्ट का विकास है जो ट्यून करने योग्य मेमोरी फुटप्रिंट (जैसे स्क्रीप्ट और आर्गन2) का उपयोग करता है, न कि बीक्रिप्ट के फिक्स्ड 4 केबी मेमोरी फुटप्रिंट का। स्क्रीप्ट या आर्गन2 के समान, पफरफिश2 अधिक मेमोरी का उपयोग करके अपनी कठिनाई प्राप्त करता है। स्क्रीप्ट और आर्गन2 के विपरीत, पफरफिश2 केवल सीपीयू कोर के एल2 कैश में काम करता है। जबकि स्क्रीप्ट और आर्गन 2 अपनी मेमोरी कठोरता को यादृच्छिक ढंग से सी रैम तक पहुंच कर प्राप्त करते हैं, पफरफिश2 खुद को सीपीयू कोर के लिए उपलब्ध समर्पित एल 2 कैश तक ही सीमित करता है। यह स्क्रीप्ट और आर्गन2 की तुलना में कस्टम हार्डवेयर में लागू करना और भी कठिन बना देता है। पफरफिश 2 का आदर्श मेमोरी फुटप्रिंट कोर के लिए उपलब्ध कैश का आकार है (उदाहरण के लिए इंटेल एल्डर लेक के लिए 1.25 एमबी[21]) यह पफरफिश2 को जीपीयू या एएसआईसी के प्रति अधिक प्रतिरोधी बनाता है।
आलोचना
अधिकतम पासवर्ड लंबाई
बीक्रिप्ट की अधिकतम पासवर्ड लंबाई 72 बाइट्स है। यह अधिकतम एक्सपैंडकीय फ़ंक्शन के पहले ऑपरेशन से आता है जो पासवर्ड के साथxor
की 18 4-बाइट उपकुंजियाँ (पी) हैं:
P1..P18 ← P1..P18 xor पासवर्डबाइट्स
पासवर्ड (जो UTF-8 एन्कोडेड है), 72-बाइट लंबा होने तक दोहराया जाता है। उदाहरण के लिए, एक पासवर्ड:
correct horse battery staple␀
(29 बाइट्स)
तब तक दोहराया जाता है जब तक यह 18 पी प्रति-राउंड उपकुंजियों के 72-बाइट से मेल नहीं खाता:
correct horse battery staple␀correct horse battery staple␀correct horse
(72 बाइट्स)
सबसे खराब स्थिति में एक पासवर्ड 18 वर्णों तक सीमित होता है, जब प्रत्येक वर्ण को UTF-8 एन्कोडिंग के 4 बाइट्स की आवश्यकता होती है। उदाहरण के लिए:
𐑜𐑝𐑟𐑥𐑷𐑻𐑽𐑾𐑿𐑿𐑰𐑩𐑛𐑙𐑘𐑙𐑒𐑔
(18 अक्षर, 72 बाइट्स)
पासवर्ड हैश ट्रंकेशन
बीक्रिप्ट एल्गोरिथम में 24-बाइट टेक्स्ट को बार-बार एन्क्रिप्ट करना सम्मिलित है:
OrpheanBeholderScryDoubt
(24-बाइट्स)
यह सिफरटेक्स्ट के 24 बाइट्स उत्पन्न करता है, जैसे:
85 20 af 9f 03 3d b3 8c 08 5f d2 5e 2d aa 5e 84 a2 b9 61 d2 f1 29 c9 a4
(24-बाइट्स)
विहित ओपनबीएसडी कार्यान्वयन इसे 23 बाइट्स तक काट देता है:
85 20 af 9f 03 3d b3 8c 08 5f d2 5e 2d aa 5e 84 a2 b9 61 d2 f1 29 c9
(23-बाइट्स)
यह स्पष्ट नहीं है कि विहित कार्यान्वयन परिणामी पासवर्ड हैश से 8-बिट क्यों हटाता है।
रेडिक्स -64 एन्कोडेड होने पर ये 23 बाइट 31 वर्ण बन जाते हैं:
fQAtluK7q2uGV7HcJYncfII3WbJvIai
(31-अक्षर)
बेस 64 एन्कोडिंग वर्णमाला
कैनोनिकल ओपनबीएसडी कार्यान्वयन द्वारा उपयोग की जाने वाली एन्कोडिंग क्रिप्ट के समान बेस 64 वर्णमाला का उपयोग करती है, जो है ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
.[10]इसका अर्थ है कि एन्कोडिंग अधिक सामान्य RFC 4648 के साथ संगत नहीं है।[citation needed]
यह भी देखें
- Argon2 - 2015 में पासवर्ड हैशिंग प्रतियोगिता का विजेता
- क्रिप्ट (सी) # ब्लोफिश-आधारित योजना - 2002 में विकसित ब्लोफिश-आधारित क्रॉस-प्लेटफ़ॉर्म फ़ाइल एन्क्रिप्शन उपयोगिता[22][23][24][25]
- ccrypt (सी) - यूनिक्स सी लाइब्रेरी फ़ंक्शन
- क्रिप्ट (यूनिक्स) - यूनिक्स उपयोगिता
- सीक्रिप्ट - उपयोगिता
- चाबी खींचना
- mcrypt - उपयोगिता
- पीबीकेडीएफ2 - एक व्यापक रूप से उपयोग किया जाने वाला मानक पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन 2
- स्क्रीप्ट - पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन (और एक उपयोगिता भी)
संदर्भ
- ↑ 1.0 1.1 Provos, Niels; Mazières, David; Talan Jason Sutton 2012 (1999). "एक भविष्य-अनुकूलनीय पासवर्ड योजना". Proceedings of 1999 USENIX Annual Technical Conference: 81–92.
- ↑ "रेपो के लिए पहले काम की प्रतिबद्धता". 13 Feb 1997.
- ↑ "SUSE Security Announcement: (SUSE-SA:2011:035)". 23 August 2011. Archived from the original on 4 March 2016. Retrieved 20 August 2015.
SUSE's crypt() implementation supports the blowfish password hashing function (id $2a) and system logins by default also use this method.
- ↑ "पैकेज बीक्रिप्ट". godoc.org.
- ↑ "jBCrypt - जावा के लिए मजबूत पासवर्ड हैशिंग". www.mindrot.org (in English). Retrieved 2017-03-11.
- ↑ "bcrypt - bcrypt पासवर्ड हैश फंक्शन का जावा स्टैंडअलोन कार्यान्वयन". github.com (in English). Retrieved 2018-07-19.
- ↑ "bcryptjs". npm.
- ↑ Stufft, Donald (14 October 2021). "bcrypt: Modern password hashing for your software and your servers" – via PyPI.
- ↑ Whitlock, David (21 September 2021). "Bcrypt Elixir: bcrypt password hashing algorithm for Elixir". GitHub. riverrun.
- ↑ 10.0 10.1 Provos, Niels (13 February 1997). "bcrypt.c स्रोत कोड, लाइन्स 57-58". Retrieved 29 January 2022.
- ↑ "Modular Crypt Format — Passlib v1.7.1 Documentation". passlib.readthedocs.io.
- ↑ 12.0 12.1 "bcrypt पासवर्ड हैश बग फिक्स, संस्करण परिवर्तन और परिणाम". undeadly.org.
- ↑ Designer, Solar. "oss-sec: CVE request: crypt_blowfish 8-bit character mishandling". seclists.org.
- ↑ "'बीक्रिप्ट संस्करण परिवर्तन' - मार्क". marc.info.
- ↑ "bcrypt.c code fix for 2014 bug". 17 February 2014. Archived from the original on 17 February 2022. Retrieved 17 February 2022.
{{cite web}}
:|archive-date=
/|archive-url=
timestamp mismatch (help) - ↑ Schneier, Bruce (December 1993). "Fast Software Encryption, Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Cambridge Security Workshop Proceedings. Springer-Verlag: 191–204.
- ↑ "jBCrypt security advisory". 1 February 2010. And "Changes in CRYPT_BLOWFISH in PHP 5.3.7". php.net.
- ↑ https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf[bare URL PDF]
- ↑ "Goldshell KD6 profitability | ASIC Miner Value".
- ↑ "मैं स्क्रीप्ट की सिफारिश क्यों नहीं करता". 12 March 2014.
- ↑ "Product Specifications".
- ↑ http://bcrypt.sourceforge.net bcrypt file encryption program homepage
- ↑ "Android के लिए bcrypt APK - Droid मुखबिर पर निःशुल्क डाउनलोड". droidinformer.org.
- ↑ "T2 package - trunk - bcrypt - A utility to encrypt files". t2sde.org.
- ↑ "Oracle GoldenGateのライセンス". docs.oracle.com.