बीक्रिप्ट: Difference between revisions
(Created page with "{{Short description|Password-based key derivation function}} {{for|the bcrypt file encryption utility|Blowfish (cipher)}} {{lowercase title}} {{Infobox cryptographic hash func...") |
(Text) |
||
Line 1: | Line 1: | ||
{{Short description|Password-based key derivation function}} | {{Short description|Password-based key derivation function}} | ||
{{for| | {{for|बीक्रिप्ट फ़ाइल एन्क्रिप्शन उपयोगिता|ब्लोफिश (सिफर)}} | ||
{{lowercase title}} | {{lowercase title}} | ||
{{Infobox cryptographic hash function | {{Infobox cryptographic hash function | ||
Line 22: | Line 22: | ||
}} | }} | ||
'''बीक्रिप्ट''' एक [[पासवर्ड-हैशिंग फ़ंक्शन]] है, जिसे [[नील्स प्रोवोस]] और डेविड माज़िएरेस द्वारा डिज़ाइन किया गया है, जो [[ब्लोफिश (सिफर)|ब्लोफिश]] सिफर पर आधारित है और 1999 में [[USENIX|यू एस इ एन आई एक्स]] में प्रस्तुत किया गया था।<ref name=provos>{{cite journal | url = http://www.usenix.org/events/usenix99/provos/provos_html/node1.html | title = एक भविष्य-अनुकूलनीय पासवर्ड योजना| first = Niels | last = Provos |author2=Mazières, David | year = 1999 |author3=Talan Jason Sutton 2012 | journal = Proceedings of 1999 USENIX Annual Technical Conference | pages = 81–92}}</ref> [[ इंद्रधनुष तालिका |रेनबो टेबल]] हमलों से बचाने के लिए एक [[नमक (क्रिप्टोग्राफी)|साल्ट]] को सम्मिलित करने के अलावा, बीक्रिप्ट एक अनुकूली फ़ंक्शन है: समय के साथ, पुनरावृत्ति की संख्या को इसे धीमा करने के लिए बढ़ाया जा सकता है, इसलिए यह संगणना शक्ति बढ़ने के साथ भी [[क्रूर-बल खोज]] हमलों के लिए प्रतिरोधी रहता है। | |||
'''बीक्रिप्ट फ़ंक्शन''' [[OpenBSD]] के लिए डिफ़ॉल्ट पासवर्ड [[ हैश एल्गोरिथ्म ]] है<ref name=original>{{cite web|url=//cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c|title= रेपो के लिए पहले काम की प्रतिबद्धता|date=13 Feb 1997}}</ref> और कुछ Linux वितरण जैसे [[SUSE Linux]] के लिए डिफ़ॉल्ट था।<ref>{{cite web|url=https://www.suse.com/support/security/advisories/2011_35_blowfish.html |title=SUSE Security Announcement: (SUSE-SA:2011:035) |date=23 August 2011 |access-date=20 August 2015 |quote=SUSE's crypt() implementation supports the blowfish password hashing function (id $2a) and system logins by default also use this method. |url-status=dead |archive-url=https://web.archive.org/web/20160304094921/https://www.suse.com/support/security/advisories/2011_35_blowfish.html |archive-date=4 March 2016 }}</ref> | |||
C (प्रोग्रामिंग लैंग्वेज), [[C++]], C शार्प (प्रोग्रामिंग लैंग्वेज)|C#, [[Embarcadero Delphi]], Elixir (प्रोग्रामिंग लैंग्वेज) में | C (प्रोग्रामिंग लैंग्वेज), [[C++]], C शार्प (प्रोग्रामिंग लैंग्वेज)|C#, [[Embarcadero Delphi]], Elixir (प्रोग्रामिंग लैंग्वेज) में बीक्रिप्ट के कार्यान्वयन हैं।<ref>{{cite web |last1=Whitlock |first1=David |title=Bcrypt Elixir: bcrypt password hashing algorithm for Elixir. |url=https://github.com/riverrun/bcrypt_elixir |website=GitHub |date=21 September 2021 |publisher=riverrun}}</ref> [[जाओ (प्रोग्रामिंग भाषा)]],<ref>{{cite web|url=https://godoc.org/golang.org/x/crypto/bcrypt|title=पैकेज बीक्रिप्ट|website=godoc.org}}</ref> [[जावा (प्रोग्रामिंग भाषा)]],<ref>{{Cite web|url=http://www.mindrot.org/projects/jBCrypt/|title=jBCrypt - जावा के लिए मजबूत पासवर्ड हैशिंग|website=www.mindrot.org|language=en|access-date=2017-03-11}}</ref><ref>{{Cite web|url=https://github.com/patrickfav/bcrypt|title=bcrypt - bcrypt पासवर्ड हैश फंक्शन का जावा स्टैंडअलोन कार्यान्वयन|website=github.com|language=en|access-date=2018-07-19}}</ref> [[जावास्क्रिप्ट]],<ref>{{cite web|url=https://www.npmjs.com/package/bcryptjs|title=bcryptjs|website=npm}}</ref> [[पर्ल]], [[पीएचपी]], [[पायथन (प्रोग्रामिंग भाषा)]],<ref>{{cite web|url=https://github.com/pyca/bcrypt/|title=bcrypt: Modern password hashing for your software and your servers|first=Donald|last=Stufft|date=14 October 2021|via=PyPI}}</ref> [[रूबी (प्रोग्रामिंग भाषा)]], और अन्य भाषाएँ। | ||
== पृष्ठभूमि == | == पृष्ठभूमि == | ||
ब्लोफिश अपने महंगे कुंजी सेटअप चरण के लिए ब्लॉक सिफर के बीच उल्लेखनीय है। यह एक मानक स्थिति में उपकुंजियों के साथ शुरू होता है, फिर कुंजी के हिस्से का उपयोग करके ब्लॉक एन्क्रिप्शन करने के लिए इस स्थिति का उपयोग करता है, और कुछ उपकुंजियों को बदलने के लिए उस एन्क्रिप्शन (जो हैशिंग पर अधिक सटीक है) के परिणाम का उपयोग करता है। फिर यह कुंजी के दूसरे भाग को एन्क्रिप्ट करने के लिए इस संशोधित स्थिति का उपयोग करता है, और अधिक उपकुंजियों को बदलने के लिए परिणाम का उपयोग करता है। यह इस तरह से आगे बढ़ता है, जब तक कि सभी उपकुंजियों को सेट नहीं किया जाता है, तब तक कुंजी को हैश करने और राज्य के बिट्स को बदलने के लिए उत्तरोत्तर संशोधित स्थिति का उपयोग किया जाता है। | ब्लोफिश अपने महंगे कुंजी सेटअप चरण के लिए ब्लॉक सिफर के बीच उल्लेखनीय है। यह एक मानक स्थिति में उपकुंजियों के साथ शुरू होता है, फिर कुंजी के हिस्से का उपयोग करके ब्लॉक एन्क्रिप्शन करने के लिए इस स्थिति का उपयोग करता है, और कुछ उपकुंजियों को बदलने के लिए उस एन्क्रिप्शन (जो हैशिंग पर अधिक सटीक है) के परिणाम का उपयोग करता है। फिर यह कुंजी के दूसरे भाग को एन्क्रिप्ट करने के लिए इस संशोधित स्थिति का उपयोग करता है, और अधिक उपकुंजियों को बदलने के लिए परिणाम का उपयोग करता है। यह इस तरह से आगे बढ़ता है, जब तक कि सभी उपकुंजियों को सेट नहीं किया जाता है, तब तक कुंजी को हैश करने और राज्य के बिट्स को बदलने के लिए उत्तरोत्तर संशोधित स्थिति का उपयोग किया जाता है। | ||
Provos और Mazières ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर एक्सब्लोफिश (महंगा कुंजी शेड्यूल ब्लोफिश) को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से शुरू होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए | Provos और Mazières ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर एक्सब्लोफिश (महंगा कुंजी शेड्यूल ब्लोफिश) को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से शुरू होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए साल्ट और पासवर्ड दोनों का उपयोग किया जाता है। इसके बाद कई राउंड होते हैं जिनमें मानक ब्लोफिश कीइंग एल्गोरिथ्म को वैकल्पिक रूप से साल्ट और पासवर्ड को कुंजी के रूप में उपयोग करते हुए लागू किया जाता है, प्रत्येक राउंड पिछले राउंड से उपकुंजी स्थिति से शुरू होता है। सिद्धांत रूप में, यह मानक ब्लोफिश कुंजी शेड्यूल से अधिक मजबूत नहीं है, लेकिन रीकीइंग राउंड की संख्या विन्यास योग्य है; इसलिए इस प्रक्रिया को मनमाने ढंग से धीमा किया जा सकता है, जो हैश या साल्ट पर क्रूर-बल के हमलों को रोकने में मदद करता है। | ||
== विवरण == | == विवरण == | ||
बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट आमतौर पर एक यादृच्छिक मूल्य है। 24-बाइट (192-बिट) हैश की गणना करने के लिए बीक्रिप्ट फ़ंक्शन इन इनपुट का उपयोग करता है। बीक्रिप्ट फ़ंक्शन का अंतिम आउटपुट फ़ॉर्म की एक स्ट्रिंग है: | |||
$2<a/b/x/y>$[लागत]$[22 वर्ण | $2<nowiki><a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]</nowiki> | ||
उदाहरण के लिए, इनपुट पासवर्ड के साथ <code>abc123xyz</code>, लागत <code>12</code>, और एक यादृच्छिक | उदाहरण के लिए, इनपुट पासवर्ड के साथ <code>abc123xyz</code>, लागत <code>12</code>, और एक यादृच्छिक साल्ट, बीक्रिप्ट का आउटपुट स्ट्रिंग है | ||
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW | $2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW | ||
Line 51: | Line 51: | ||
* <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> जो इससे अलग है {{IETF RFC|4648}} [[बेस 64]] एन्कोडिंग। | |||
== संस्करण इतिहास == | == संस्करण इतिहास == | ||
Line 57: | Line 57: | ||
$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> OpenBSD पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला प्रारूप: | ||
* <code>$1$</code>: MD5-आधारित क्रिप्ट ('md5crypt') | * <code>$1$</code>: MD5-आधारित क्रिप्ट ('md5crypt') | ||
Line 70: | Line 70: | ||
* स्ट्रिंग 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> | इस परिवर्तन के साथ, संस्करण को बदल दिया गया था <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) | $2x$, $2y$ (जून 2011) | ||
जून 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>, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने crypt_blowfish एमिट होने का सुझाव भी दिया <code>$2y$</code> निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए। | ||
कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को अपनाया नहीं। यह संस्करण मार्कर परिवर्तन crypt_blowfish तक सीमित था। | कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को अपनाया नहीं। यह संस्करण मार्कर परिवर्तन crypt_blowfish तक सीमित था। | ||
Line 81: | Line 81: | ||
$2b$ (फरवरी 2014) | $2b$ (फरवरी 2014) | ||
बीक्रिप्ट के OpenBSD कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक अहस्ताक्षरित 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 बाइट्स पर छोटा कर दिया जाएगा। . | |||
बीक्रिप्ट OpenBSD के लिए बनाया गया था। जब उनके पुस्तकालय में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया। | |||
== एल्गोरिथम == | == एल्गोरिथम == | ||
नीचे दिया गया | नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश (सिफर) का उपयोग करके 64 बार OrpheanBeholderScryDoubt टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (EksBlowfishSetup) फंक्शन से बदल दिया जाता है: | ||
<span style= color: #004DBB; >'फंक्शन'</span> | <span style= color: #004DBB; >'फंक्शन'</span> बीक्रिप्ट | ||
<span style= color: #004DBB; >'इनपुट:'</span> | <span style= color: #004DBB; >'इनपुट:'</span> | ||
लागत: संख्या (4..31) <विस्तार शैली = रंग: हरा; > लॉग<sub>2</sub>(पुनरावृत्ति)। उदा. 12 ==> 2<sup>12</sup> = 4,096 पुनरावृत्तियाँ | लागत: संख्या (4..31) <विस्तार शैली = रंग: हरा; > लॉग<sub>2</sub>(पुनरावृत्ति)। उदा. 12 ==> 2<sup>12</sup> = 4,096 पुनरावृत्तियाँ | ||
साल्ट: बाइट्स की सरणी (16 बाइट्स) <अवधि शैली = रंग: हरा; >रैंडम सॉल्ट | |||
पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड | पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड | ||
<span style= color: #004DBB; >आउटपुट:</span> | <span style= color: #004DBB; >आउटपुट:</span> | ||
हैश: बाइट्स की सरणी (24 बाइट्स) | हैश: बाइट्स की सरणी (24 बाइट्स) | ||
<अवधि शैली = रंग: हरा; >//महंगी कुंजी सेटअप एल्गोरिद्म | <अवधि शैली = रंग: हरा; >//महंगी कुंजी सेटअप एल्गोरिद्म के साथ ब्लोफ़िश अवस्था को प्रारंभ करें | ||
<अवधि शैली = रंग: हरा; >//P: 18 उपकुंजियों की सरणी (UInt32[18]) | <अवधि शैली = रंग: हरा; >//P: 18 उपकुंजियों की सरणी (UInt32[18]) | ||
<अवधि शैली = रंग: हरा; >//एस: चार प्रतिस्थापन बॉक्स (एस-बॉक्स), एस<sub>0</sub>...एस<sub>3</sub>. प्रत्येक एस-बॉक्स 1,024 बाइट्स (UInt32[256]) | <अवधि शैली = रंग: हरा; >//एस: चार प्रतिस्थापन बॉक्स (एस-बॉक्स), एस<sub>0</sub>...एस<sub>3</sub>. प्रत्येक एस-बॉक्स 1,024 बाइट्स (UInt32[256]) है | ||
पी, एस ← EksBlowfishSetup(लागत, | पी, एस ← EksBlowfishSetup(लागत, साल्ट, पासवर्ड) | ||
<अवधि शैली = रंग: हरा; >// बार-बार पाठ को एन्क्रिप्ट करें OrpheanBeholderScryDoubt 64 बार | <अवधि शैली = रंग: हरा; >// बार-बार पाठ को एन्क्रिप्ट करें OrpheanBeholderScryDoubt 64 बार | ||
ctext ← <span style= color: maroon > OrpheanBeholderScryDoubt </span> <span style= color: green; >//24 बाइट्स ==> तीन 64-बिट ब्लॉक</span> | ctext ← <span style= color: maroon > OrpheanBeholderScryDoubt </span> <span style= color: green; >//24 बाइट्स ==> तीन 64-बिट ब्लॉक</span> | ||
<span style= color: #004DBB; >'दोहराना'</span> (64) | <span style= color: #004DBB; >'दोहराना'</span> (64) | ||
ctext ← EncryptECB(P, S, ctext) <span style= color: green; >// ECB मोड</span> में मानक ब्लोफ़िश का उपयोग करके एन्क्रिप्ट करें | ctext ← EncryptECB(P, S, ctext) <span style= color: green; >// ECB मोड</span> में मानक ब्लोफ़िश का उपयोग करके एन्क्रिप्ट करें | ||
<अवधि शैली = रंग: हरा; >//24-बाइट ctext का परिणाम पासवर्ड हैश | <अवधि शैली = रंग: हरा; >//24-बाइट ctext का परिणाम पासवर्ड हैश है | ||
<span style= color: #004DBB; >'वापसी'</span> श्रृंखलाबद्ध (लागत, | <span style= color: #004DBB; >'वापसी'</span> श्रृंखलाबद्ध (लागत, साल्ट, ctext) | ||
=== महंगा कुंजी सेटअप === | === महंगा कुंजी सेटअप === | ||
बीक्रिप्ट एल्गोरिथम अपने Eksblowfish कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है: | |||
<span style= color: #004DBB; >फंक्शन</span> EksBlowfishSetup | <span style= color: #004DBB; >फंक्शन</span> EksBlowfishSetup | ||
<span style= color: #004DBB; > इनपुट:</span> | <span style= color: #004DBB; > इनपुट:</span> | ||
पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड | पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड | ||
साल्ट: बाइट्स की सरणी (16 बाइट्स) <अवधि शैली = रंग: हरा; >रैंडम सॉल्ट | |||
लागत: संख्या (4..31) <अवधि शैली = रंग: हरा; > लॉग<sub>2</sub>(पुनरावृत्ति)। उदा. 12 ==> 2<sup>12</sup> = 4,096 पुनरावृत्तियाँ | लागत: संख्या (4..31) <अवधि शैली = रंग: हरा; > लॉग<sub>2</sub>(पुनरावृत्ति)। उदा. 12 ==> 2<sup>12</sup> = 4,096 पुनरावृत्तियाँ | ||
<span style= color: #004DBB; >आउटपुट:</span> | <span style= color: #004DBB; >आउटपुट:</span> | ||
पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सरणी | पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सरणी | ||
एस<sub>1</sub>..एस<sub>4</sub>: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > चार SBoxes की सरणी; प्रत्येक SBox 256 UInt32 है (यानी प्रत्येक SBox 1 KiB है) | एस<sub>1</sub>..एस<sub>4</sub>: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > चार SBoxes की सरणी; प्रत्येक SBox 256 UInt32 है (यानी प्रत्येक SBox 1 KiB है) | ||
<अवधि शैली = रंग: हरा; >//पी के हेक्स अंकों के साथ पी (उपकुंजी), और एस (प्रतिस्थापन बक्से) को प्रारंभ करें | <अवधि शैली = रंग: हरा; >//पी के हेक्स अंकों के साथ पी (उपकुंजी), और एस (प्रतिस्थापन बक्से) को प्रारंभ करें | ||
पी, एस ← इनिशियलस्टेट () | पी, एस ← इनिशियलस्टेट () | ||
<अवधि शैली = रंग: हरा; >//पासवर्ड और | <अवधि शैली = रंग: हरा; >//पासवर्ड और साल्ट के आधार पर P और S को परमिट करें | ||
P, S ← ExpandKey(P, S, | P, S ← ExpandKey(P, S, साल्ट, पासवर्ड) | ||
<अवधि शैली = रंग: हरा; >//यह महंगी कुंजी सेटअप का महंगा हिस्सा है। | <अवधि शैली = रंग: हरा; >//यह महंगी कुंजी सेटअप का महंगा हिस्सा है। | ||
<अवधि शैली = रंग: हरा; >//अन्यथा कुंजी सेटअप ब्लोफिश के समान है। | <अवधि शैली = रंग: हरा; >//अन्यथा कुंजी सेटअप ब्लोफिश के समान है। | ||
<span style= color: #004DBB; >'दोहराना'</span> (2<sup>लागत</sup>) | <span style= color: #004DBB; >'दोहराना'</span> (2<sup>लागत</sup>) | ||
P, S ← ExpandKey(P, S, 0, पासवर्ड) | P, S ← ExpandKey(P, S, 0, पासवर्ड) | ||
P, S ← ExpandKey(P, S, 0, | P, S ← ExpandKey(P, S, 0, साल्ट) | ||
<span style= color: #004DBB; >'रिटर्न'</span> पी, एस | <span style= color: #004DBB; >'रिटर्न'</span> पी, एस | ||
Line 144: | Line 144: | ||
<span style= color: #004DBB; >फ़ंक्शन</span> ExpandKey | <span style= color: #004DBB; >फ़ंक्शन</span> ExpandKey | ||
<span style= color: #004DBB; > इनपुट:</span> | <span style= color: #004DBB; > इनपुट:</span> | ||
पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड | पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड | ||
साल्ट: बाइट [16] <विस्तार शैली = रंग: हरा; >रैंडम सॉल्ट | |||
पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > 18 उपकुंजियों की सारणी | पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > 18 उपकुंजियों की सारणी | ||
एस<sub>1</sub>..एस<sub>4</sub>: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes | एस<sub>1</sub>..एस<sub>4</sub>: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes | ||
<span style= color: #004DBB; >आउटपुट:</span> | <span style= color: #004DBB; >आउटपुट:</span> | ||
पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सारणी | पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सारणी | ||
एस<sub>1</sub>..एस<sub>4</sub>: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes | एस<sub>1</sub>..एस<sub>4</sub>: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes | ||
<अवधि शैली = रंग: हरा; > // P उपकुंजियों की सरणी में पासवर्ड मिलाएं | <अवधि शैली = रंग: हरा; > // P उपकुंजियों की सरणी में पासवर्ड मिलाएं | ||
<span style= color: #004DBB; >for</span> ''n'' ← 1 <span style= color: #004DBB; >से</span> 18 <span style= color: #004DBB; >करें</span> | <span style= color: #004DBB; >for</span> ''n'' ← 1 <span style= color: #004DBB; >से</span> 18 <span style= color: #004DBB; >करें</span> | ||
पी<sub>n</sub> ← पी<sub>n</sub> <span style= color: #004DBB; >xor</span> पासवर्ड[32(n-1)..32n-1] <अवधि शैली= रंग: हरा; >//पासवर्ड को चक्रीय | पी<sub>n</sub> ← पी<sub>n</sub> <span style= color: #004DBB; >xor</span> पासवर्ड[32(n-1)..32n-1] <अवधि शैली= रंग: हरा; >//पासवर्ड को चक्रीय मानें | ||
<अवधि शैली = रंग: हरा; >//128-बिट | <अवधि शैली = रंग: हरा; >//128-बिट साल्ट को 64-बिट के दो हिस्सों (ब्लोफ़िश ब्लॉक आकार) के रूप में लें। | ||
साल्टहाफ[0] ← साल्ट[0..63] <अवधि शैली= रंग: हरा; >//64-बिट साल्ट कम करें | |||
साल्ट आधा [1] ← साल्ट [64..127] <अवधि शैली = रंग: हरा; >//ऊपरी 64-बिट साल्ट | |||
<अवधि शैली = रंग: हरा; >// सभी शून्यों के साथ 8-बाइट (64-बिट) बफर प्रारंभ करें। | <अवधि शैली = रंग: हरा; >// सभी शून्यों के साथ 8-बाइट (64-बिट) बफर प्रारंभ करें। | ||
ब्लॉक ← 0 | ब्लॉक ← 0 | ||
<अवधि शैली = रंग: हरा; >//आंतरिक स्थिति को पी-बॉक्स में मिलाएं | <अवधि शैली = रंग: हरा; >//आंतरिक स्थिति को पी-बॉक्स में मिलाएं | ||
<span style= color: #004DBB; >'for'</span> n ← 1 <span style= color: #004DBB; >'से'</span> 9 <span style= color: #004DBB; >'करें'</span> | <span style= color: #004DBB; >'for'</span> n ← 1 <span style= color: #004DBB; >'से'</span> 9 <span style= color: #004DBB; >'करें'</span> | ||
<अवधि शैली = रंग: हरा; >//xor 64-बिट ब्लॉक 64-बिट सॉल्ट हाफ | <अवधि शैली = रंग: हरा; >//xor 64-बिट ब्लॉक 64-बिट सॉल्ट हाफ के साथ | ||
ब्लॉक ← ब्लॉक xor | ब्लॉक ← ब्लॉक xor साल्ट आधा [(n-1) mod 2] <अवधि शैली = रंग: हरा; >//प्रत्येक पुनरावृत्ति साल्ट आधा [0], और साल्ट आधा [1] के बीच बारी-बारी से | ||
<अवधि शैली = रंग: हरा; >//वर्तमान कुंजी शेड्यूल का उपयोग करके ब्लॉक एन्क्रिप्ट करें | <अवधि शैली = रंग: हरा; >//वर्तमान कुंजी शेड्यूल का उपयोग करके ब्लॉक एन्क्रिप्ट करें | ||
ब्लॉक ← एनक्रिप्ट (पी, 'एस', ब्लॉक) | ब्लॉक ← एनक्रिप्ट (पी, 'एस', ब्लॉक) | ||
पी<sub>2n</sub> ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//ब्लॉक के 32-बिट कम करें | पी<sub>2n</sub> ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//ब्लॉक के 32-बिट कम करें | ||
पी<sub>2n+1</sub> ← ब्लॉक [32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट ब्लॉक | पी<sub>2n+1</sub> ← ब्लॉक [32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट ब्लॉक | ||
<अवधि शैली = रंग: हरा; >// एन्क्रिप्टेड स्थिति को राज्य के आंतरिक एस-बॉक्स में मिलाएं | <अवधि शैली = रंग: हरा; >// एन्क्रिप्टेड स्थिति को राज्य के आंतरिक एस-बॉक्स में मिलाएं | ||
<span style= color: #004DBB; >'for'</span> i ← 1 <span style= color: #004DBB; >'to'</span> 4 <span style= color: #004DBB; >'करें'</span> | <span style= color: #004DBB; >'for'</span> i ← 1 <span style= color: #004DBB; >'to'</span> 4 <span style= color: #004DBB; >'करें'</span> | ||
<span style= color: #004DBB; >'for'</span> n ← 0 <span style= color: #004DBB; >'से'</span> 127 <span style= color: #004DBB; >'करें'</span> | <span style= color: #004DBB; >'for'</span> n ← 0 <span style= color: #004DBB; >'से'</span> 127 <span style= color: #004DBB; >'करें'</span> | ||
ब्लॉक ← एनक्रिप्ट (स्टेट, ब्लॉक <span style= color: #004DBB; >'xor'</span> Salt[64(n-1)..64n-1]) <span style= color: green; >//जैसा कि ऊपर</span> | ब्लॉक ← एनक्रिप्ट (स्टेट, ब्लॉक <span style= color: #004DBB; >'xor'</span> Salt[64(n-1)..64n-1]) <span style= color: green; >//जैसा कि ऊपर</span> | ||
एस<sub>i</sub>[2एन] ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//32-बिट कम करें | एस<sub>i</sub>[2एन] ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//32-बिट कम करें | ||
एस<sub>i</sub>[2n+1] ← ब्लॉक[32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट्स | एस<sub>i</sub>[2n+1] ← ब्लॉक[32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट्स | ||
<span style= color: #004DBB; >'वापसी'</span> स्थिति | <span style= color: #004DBB; >'वापसी'</span> स्थिति | ||
इस तरह, <code>ExpandKey(''state'', 0, ''key'')</code> नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य | इस तरह, <code>ExpandKey(''state'', 0, ''key'')</code> नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं। <code>ExpandKey(''state'', 0, ''salt'')</code> समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है। | ||
== उपयोगकर्ता इनपुट == | == उपयोगकर्ता इनपुट == | ||
Line 189: | Line 189: | ||
ध्यान दें कि उपरोक्त उद्धरण 56 बाइट्स तक के पासवर्ड का उल्लेख करता है, भले ही एल्गोरिथ्म स्वयं 72 बाइट प्रारंभिक मान का उपयोग करता हो। हालांकि प्रोवोस और माजिएरेस छोटे प्रतिबंध का कारण नहीं बताते हैं, वे [[ब्रूस श्नेयर]] के ब्लोफिश के मूल विनिर्देश से निम्नलिखित कथन से प्रेरित हो सकते हैं, कुंजी आकार पर 448 [बिट] सीमा यह सुनिश्चित करती है कि{{sic}} प्रत्येक उपकुंजी का प्रत्येक बिट कुंजी के प्रत्येक बिट पर निर्भर करता है।<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> | ध्यान दें कि उपरोक्त उद्धरण 56 बाइट्स तक के पासवर्ड का उल्लेख करता है, भले ही एल्गोरिथ्म स्वयं 72 बाइट प्रारंभिक मान का उपयोग करता हो। हालांकि प्रोवोस और माजिएरेस छोटे प्रतिबंध का कारण नहीं बताते हैं, वे [[ब्रूस श्नेयर]] के ब्लोफिश के मूल विनिर्देश से निम्नलिखित कथन से प्रेरित हो सकते हैं, कुंजी आकार पर 448 [बिट] सीमा यह सुनिश्चित करती है कि{{sic}} प्रत्येक उपकुंजी का प्रत्येक बिट कुंजी के प्रत्येक बिट पर निर्भर करता है।<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> | ||
कार्यान्वयन में पासवर्ड को प्रारंभिक संख्यात्मक मानों में परिवर्तित करने के उनके दृष्टिकोण में भिन्नता है, जिसमें कभी-कभी गैर-ASCII वर्णों वाले पासवर्ड की शक्ति को कम करना भी | कार्यान्वयन में पासवर्ड को प्रारंभिक संख्यात्मक मानों में परिवर्तित करने के उनके दृष्टिकोण में भिन्नता है, जिसमें कभी-कभी गैर-ASCII वर्णों वाले पासवर्ड की शक्ति को कम करना भी सम्मिलित है।<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> | ||
== अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना == | == अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना == | ||
यह नोट करना महत्वपूर्ण है कि | यह नोट करना महत्वपूर्ण है कि बीक्रिप्ट एक Key_derivation_function|key deriation function (KDF) नहीं है। उदाहरण के लिए, पासवर्ड से 512-बिट कुंजी प्राप्त करने के लिए बीक्रिप्ट का उपयोग नहीं किया जा सकता है। उसी समय, [[pbkdf2]], [[scrypt]], और [[argon2]] जैसे एल्गोरिदम पासवर्ड-आधारित कुंजी व्युत्पत्ति कार्य हैं - जहाँ आउटपुट का उपयोग केवल कुंजी व्युत्पत्ति के बजाय पासवर्ड हैशिंग के उद्देश्य से किया जाता है। | ||
पासवर्ड हैशिंग को आम तौर पर <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, | पासवर्ड हैशिंग को आम तौर पर <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट pbkdf2, scrypt, और argon2 से ज्यादा मजबूत है। | ||
* 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। आमतौर पर इस्तेमाल किया जाने वाला SHA2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। SHA2 को अत्यधिक हल्के होने के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।<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> इसका मतलब है कि PBKDF2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी SHA-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है<ref>{{Cite web|url=https://www.asicminervalue.com/miners/goldshell/kd6|title=Goldshell KD6 profitability | ASIC Miner Value}}</ref> | * 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। आमतौर पर इस्तेमाल किया जाने वाला SHA2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। SHA2 को अत्यधिक हल्के होने के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।<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> इसका मतलब है कि PBKDF2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी SHA-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 सेकेंड से कम रन टाइम (यानी पासवर्ड ऑथेंटिकेशन के लिए) के लिए बीक्रिप्ट से कमजोर है। Argon2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक | * आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड ऑथेंटिकेशन के लिए) के लिए बीक्रिप्ट से कमजोर है। Argon2 > = ~ 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 को जीपीयू या एएसआईसी के प्रति अधिक प्रतिरोधी बनाता है। | * पफरफिश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 207: | Line 207: | ||
=== अधिकतम पासवर्ड लंबाई === | === अधिकतम पासवर्ड लंबाई === | ||
बीक्रिप्ट की अधिकतम पासवर्ड लंबाई 72 बाइट्स है। यह अधिकतम ExpandKey फ़ंक्शन के पहले ऑपरेशन से आता है <code>xor's</code> पासवर्ड के साथ 18 4-बाइट उपकुंजी (पी): | |||
पी<sub>1</sub>..पी<sub>18</sub> ← पी<sub>1</sub>..पी<sub>18</sub> xor पासवर्डबाइट्स | पी<sub>1</sub>..पी<sub>18</sub> ← पी<sub>1</sub>..पी<sub>18</sub> xor पासवर्डबाइट्स | ||
Line 225: | Line 225: | ||
=== पासवर्ड हैश ट्रंकेशन === | === पासवर्ड हैश ट्रंकेशन === | ||
बीक्रिप्ट एल्गोरिथम में 24-बाइट टेक्स्ट को बार-बार एन्क्रिप्ट करना सम्मिलित है: | |||
:<code>OrpheanBeholderScryDoubt</code> (24-बाइट्स) | :<code>OrpheanBeholderScryDoubt</code> (24-बाइट्स) |
Revision as of 12:17, 21 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] रेनबो टेबल हमलों से बचाने के लिए एक साल्ट को सम्मिलित करने के अलावा, बीक्रिप्ट एक अनुकूली फ़ंक्शन है: समय के साथ, पुनरावृत्ति की संख्या को इसे धीमा करने के लिए बढ़ाया जा सकता है, इसलिए यह संगणना शक्ति बढ़ने के साथ भी क्रूर-बल खोज हमलों के लिए प्रतिरोधी रहता है।
बीक्रिप्ट फ़ंक्शन OpenBSD के लिए डिफ़ॉल्ट पासवर्ड हैश एल्गोरिथ्म है[2] और कुछ Linux वितरण जैसे SUSE Linux के लिए डिफ़ॉल्ट था।[3] C (प्रोग्रामिंग लैंग्वेज), C++, C शार्प (प्रोग्रामिंग लैंग्वेज)|C#, Embarcadero Delphi, Elixir (प्रोग्रामिंग लैंग्वेज) में बीक्रिप्ट के कार्यान्वयन हैं।[4] जाओ (प्रोग्रामिंग भाषा),[5] जावा (प्रोग्रामिंग भाषा),[6][7] जावास्क्रिप्ट,[8] पर्ल, पीएचपी, पायथन (प्रोग्रामिंग भाषा),[9] रूबी (प्रोग्रामिंग भाषा), और अन्य भाषाएँ।
पृष्ठभूमि
ब्लोफिश अपने महंगे कुंजी सेटअप चरण के लिए ब्लॉक सिफर के बीच उल्लेखनीय है। यह एक मानक स्थिति में उपकुंजियों के साथ शुरू होता है, फिर कुंजी के हिस्से का उपयोग करके ब्लॉक एन्क्रिप्शन करने के लिए इस स्थिति का उपयोग करता है, और कुछ उपकुंजियों को बदलने के लिए उस एन्क्रिप्शन (जो हैशिंग पर अधिक सटीक है) के परिणाम का उपयोग करता है। फिर यह कुंजी के दूसरे भाग को एन्क्रिप्ट करने के लिए इस संशोधित स्थिति का उपयोग करता है, और अधिक उपकुंजियों को बदलने के लिए परिणाम का उपयोग करता है। यह इस तरह से आगे बढ़ता है, जब तक कि सभी उपकुंजियों को सेट नहीं किया जाता है, तब तक कुंजी को हैश करने और राज्य के बिट्स को बदलने के लिए उत्तरोत्तर संशोधित स्थिति का उपयोग किया जाता है।
Provos और Mazières ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर एक्सब्लोफिश (महंगा कुंजी शेड्यूल ब्लोफिश) को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से शुरू होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए साल्ट और पासवर्ड दोनों का उपयोग किया जाता है। इसके बाद कई राउंड होते हैं जिनमें मानक ब्लोफिश कीइंग एल्गोरिथ्म को वैकल्पिक रूप से साल्ट और पासवर्ड को कुंजी के रूप में उपयोग करते हुए लागू किया जाता है, प्रत्येक राउंड पिछले राउंड से उपकुंजी स्थिति से शुरू होता है। सिद्धांत रूप में, यह मानक ब्लोफिश कुंजी शेड्यूल से अधिक मजबूत नहीं है, लेकिन रीकीइंग राउंड की संख्या विन्यास योग्य है; इसलिए इस प्रक्रिया को मनमाने ढंग से धीमा किया जा सकता है, जो हैश या साल्ट पर क्रूर-बल के हमलों को रोकने में मदद करता है।
विवरण
बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (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] OpenBSD पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला प्रारूप:
$1$
: MD5-आधारित क्रिप्ट ('md5crypt')$2$
: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट')$sha1$
: SHA-1-आधारित क्रिप्ट ('sha1crypt')$5$
: SHA-256-आधारित क्रिप्ट ('sha256crypt')$6$
: SHA-512-आधारित क्रिप्ट ('sha512crypt')
$2a$
मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई चरित्र को कैसे संभालना है, न ही एक अशक्त टर्मिनेटर को कैसे संभालना है। विनिर्देश को यह निर्दिष्ट करने के लिए संशोधित किया गया था कि हैशिंग स्ट्रिंग्स:
- स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए
- अशक्त टर्मिनेटर सम्मिलित होना चाहिए
इस परिवर्तन के साथ, संस्करण को बदल दिया गया था $2a$
[12]
$2x$, $2y$ (जून 2011)
जून 2011 में, क्रिप्ट_ब्लोफिश में एक बग की खोज की गई थी, जो कि बीक्रिप्ट का एक PHP कार्यान्वयन है। यह 8 बिट सेट वाले पात्रों को गलत तरीके से संभाल रहा था।[13] उन्होंने सुझाव दिया कि सिस्टम प्रशासक अपने मौजूदा पासवर्ड डेटाबेस को बदलकर अद्यतन करें $2a$
साथ $2x$
, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने crypt_blowfish एमिट होने का सुझाव भी दिया $2y$
निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए।
कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को अपनाया नहीं। यह संस्करण मार्कर परिवर्तन crypt_blowfish तक सीमित था।
$2b$ (फरवरी 2014)
बीक्रिप्ट के OpenBSD कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक अहस्ताक्षरित 8-बिट मान का उपयोग कर रहा था।[12][14][15] 255 बाइट्स से अधिक के पासवर्ड के लिए, 72 बाइट्स पर छोटा होने के बजाय पासवर्ड को 72 से कम या लंबाई मॉड्यूलर अंकगणितीय 256 पर छोटा कर दिया जाएगा। उदाहरण के लिए, एक 260 बाइट पासवर्ड को 72 बाइट्स पर छोटा करने के बजाय 4 बाइट्स पर छोटा कर दिया जाएगा। .
बीक्रिप्ट OpenBSD के लिए बनाया गया था। जब उनके पुस्तकालय में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया।
एल्गोरिथम
नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश (सिफर) का उपयोग करके 64 बार OrpheanBeholderScryDoubt टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (EksBlowfishSetup) फंक्शन से बदल दिया जाता है:
'फंक्शन' बीक्रिप्ट 'इनपुट:' लागत: संख्या (4..31) <विस्तार शैली = रंग: हरा; > लॉग2(पुनरावृत्ति)। उदा. 12 ==> 212 = 4,096 पुनरावृत्तियाँ साल्ट: बाइट्स की सरणी (16 बाइट्स) <अवधि शैली = रंग: हरा; >रैंडम सॉल्ट पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड आउटपुट: हैश: बाइट्स की सरणी (24 बाइट्स) <अवधि शैली = रंग: हरा; >//महंगी कुंजी सेटअप एल्गोरिद्म के साथ ब्लोफ़िश अवस्था को प्रारंभ करें <अवधि शैली = रंग: हरा; >//P: 18 उपकुंजियों की सरणी (UInt32[18]) <अवधि शैली = रंग: हरा; >//एस: चार प्रतिस्थापन बॉक्स (एस-बॉक्स), एस0...एस3. प्रत्येक एस-बॉक्स 1,024 बाइट्स (UInt32[256]) है पी, एस ← EksBlowfishSetup(लागत, साल्ट, पासवर्ड) <अवधि शैली = रंग: हरा; >// बार-बार पाठ को एन्क्रिप्ट करें OrpheanBeholderScryDoubt 64 बार ctext ← OrpheanBeholderScryDoubt //24 बाइट्स ==> तीन 64-बिट ब्लॉक 'दोहराना' (64) ctext ← EncryptECB(P, S, ctext) // ECB मोड में मानक ब्लोफ़िश का उपयोग करके एन्क्रिप्ट करें <अवधि शैली = रंग: हरा; >//24-बाइट ctext का परिणाम पासवर्ड हैश है 'वापसी' श्रृंखलाबद्ध (लागत, साल्ट, ctext)
महंगा कुंजी सेटअप
बीक्रिप्ट एल्गोरिथम अपने Eksblowfish कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है:
फंक्शन EksBlowfishSetup इनपुट: पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड साल्ट: बाइट्स की सरणी (16 बाइट्स) <अवधि शैली = रंग: हरा; >रैंडम सॉल्ट लागत: संख्या (4..31) <अवधि शैली = रंग: हरा; > लॉग2(पुनरावृत्ति)। उदा. 12 ==> 212 = 4,096 पुनरावृत्तियाँ आउटपुट: पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सरणी एस1..एस4: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > चार SBoxes की सरणी; प्रत्येक SBox 256 UInt32 है (यानी प्रत्येक SBox 1 KiB है) <अवधि शैली = रंग: हरा; >//पी के हेक्स अंकों के साथ पी (उपकुंजी), और एस (प्रतिस्थापन बक्से) को प्रारंभ करें पी, एस ← इनिशियलस्टेट () <अवधि शैली = रंग: हरा; >//पासवर्ड और साल्ट के आधार पर P और S को परमिट करें P, S ← ExpandKey(P, S, साल्ट, पासवर्ड) <अवधि शैली = रंग: हरा; >//यह महंगी कुंजी सेटअप का महंगा हिस्सा है। <अवधि शैली = रंग: हरा; >//अन्यथा कुंजी सेटअप ब्लोफिश के समान है। 'दोहराना' (2लागत) P, S ← ExpandKey(P, S, 0, पासवर्ड) P, S ← ExpandKey(P, S, 0, साल्ट) 'रिटर्न' पी, एस
इनिशियलस्टेट मूल ब्लोफिश एल्गोरिथम की तरह काम करता है, पी-एरे और एस-बॉक्स प्रविष्टियों को आंशिक भाग के साथ पॉप्युलेट करता है हेक्साडेसिमल में।
कुंजी का विस्तार करें
ExpandKey फ़ंक्शन निम्न कार्य करता है:
फ़ंक्शन ExpandKey इनपुट: पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड साल्ट: बाइट [16] <विस्तार शैली = रंग: हरा; >रैंडम सॉल्ट पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > 18 उपकुंजियों की सारणी एस1..एस4: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes आउटपुट: पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सारणी एस1..एस4: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes <अवधि शैली = रंग: हरा; > // P उपकुंजियों की सरणी में पासवर्ड मिलाएं for n ← 1 से 18 करें पीn ← पीn xor पासवर्ड[32(n-1)..32n-1] <अवधि शैली= रंग: हरा; >//पासवर्ड को चक्रीय मानें <अवधि शैली = रंग: हरा; >//128-बिट साल्ट को 64-बिट के दो हिस्सों (ब्लोफ़िश ब्लॉक आकार) के रूप में लें। साल्टहाफ[0] ← साल्ट[0..63] <अवधि शैली= रंग: हरा; >//64-बिट साल्ट कम करें साल्ट आधा [1] ← साल्ट [64..127] <अवधि शैली = रंग: हरा; >//ऊपरी 64-बिट साल्ट <अवधि शैली = रंग: हरा; >// सभी शून्यों के साथ 8-बाइट (64-बिट) बफर प्रारंभ करें। ब्लॉक ← 0 <अवधि शैली = रंग: हरा; >//आंतरिक स्थिति को पी-बॉक्स में मिलाएं 'for' n ← 1 'से' 9 'करें' <अवधि शैली = रंग: हरा; >//xor 64-बिट ब्लॉक 64-बिट सॉल्ट हाफ के साथ ब्लॉक ← ब्लॉक xor साल्ट आधा [(n-1) mod 2] <अवधि शैली = रंग: हरा; >//प्रत्येक पुनरावृत्ति साल्ट आधा [0], और साल्ट आधा [1] के बीच बारी-बारी से <अवधि शैली = रंग: हरा; >//वर्तमान कुंजी शेड्यूल का उपयोग करके ब्लॉक एन्क्रिप्ट करें ब्लॉक ← एनक्रिप्ट (पी, 'एस', ब्लॉक) पी2n ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//ब्लॉक के 32-बिट कम करें पी2n+1 ← ब्लॉक [32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट ब्लॉक <अवधि शैली = रंग: हरा; >// एन्क्रिप्टेड स्थिति को राज्य के आंतरिक एस-बॉक्स में मिलाएं 'for' i ← 1 'to' 4 'करें' 'for' n ← 0 'से' 127 'करें' ब्लॉक ← एनक्रिप्ट (स्टेट, ब्लॉक 'xor' Salt[64(n-1)..64n-1]) //जैसा कि ऊपर एसi[2एन] ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//32-बिट कम करें एसi[2n+1] ← ब्लॉक[32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट्स 'वापसी' स्थिति
इस तरह, ExpandKey(state, 0, key)
नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं। ExpandKey(state, 0, salt)
समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है।
उपयोगकर्ता इनपुट
ओपनबीएसडी कार्यान्वयन के बाद, बीक्रिप्ट के कई कार्यान्वयन पासवर्ड को पहले 72 बाइट्स तक काट देते हैं।
गणितीय एल्गोरिथ्म को स्वयं 18 32-बिट उपकुंजियों (72 ऑक्टेट/बाइट्स के बराबर) के साथ आरंभीकरण की आवश्यकता होती है। बीक्रिप्ट का मूल विनिर्देश एल्गोरिदम के लिए उपयोगकर्ता स्थान से संख्यात्मक मानों में टेक्स्ट-आधारित पासवर्ड मैप करने के लिए किसी एक विशेष विधि को अनिवार्य नहीं करता है। पाठ में एक संक्षिप्त टिप्पणी का उल्लेख है, लेकिन यह अनिवार्य नहीं है, केवल एक वर्ण स्ट्रिंग के ASCII एन्कोडेड मान का उपयोग करने की संभावना: अंत में, मुख्य तर्क एक गुप्त एन्क्रिप्शन कुंजी है, जो 56 तक उपयोगकर्ता द्वारा चुना गया पासवर्ड हो सकता है बाइट्स (कुंजी के ASCII स्ट्रिंग होने पर समाप्ति शून्य बाइट सहित)।[1]
ध्यान दें कि उपरोक्त उद्धरण 56 बाइट्स तक के पासवर्ड का उल्लेख करता है, भले ही एल्गोरिथ्म स्वयं 72 बाइट प्रारंभिक मान का उपयोग करता हो। हालांकि प्रोवोस और माजिएरेस छोटे प्रतिबंध का कारण नहीं बताते हैं, वे ब्रूस श्नेयर के ब्लोफिश के मूल विनिर्देश से निम्नलिखित कथन से प्रेरित हो सकते हैं, कुंजी आकार पर 448 [बिट] सीमा यह सुनिश्चित करती है कि [sic] प्रत्येक उपकुंजी का प्रत्येक बिट कुंजी के प्रत्येक बिट पर निर्भर करता है।[16] कार्यान्वयन में पासवर्ड को प्रारंभिक संख्यात्मक मानों में परिवर्तित करने के उनके दृष्टिकोण में भिन्नता है, जिसमें कभी-कभी गैर-ASCII वर्णों वाले पासवर्ड की शक्ति को कम करना भी सम्मिलित है।[17]
अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना
यह नोट करना महत्वपूर्ण है कि बीक्रिप्ट एक Key_derivation_function|key deriation function (KDF) नहीं है। उदाहरण के लिए, पासवर्ड से 512-बिट कुंजी प्राप्त करने के लिए बीक्रिप्ट का उपयोग नहीं किया जा सकता है। उसी समय, pbkdf2, scrypt, और argon2 जैसे एल्गोरिदम पासवर्ड-आधारित कुंजी व्युत्पत्ति कार्य हैं - जहाँ आउटपुट का उपयोग केवल कुंजी व्युत्पत्ति के बजाय पासवर्ड हैशिंग के उद्देश्य से किया जाता है।
पासवर्ड हैशिंग को आम तौर पर <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट pbkdf2, scrypt, और argon2 से ज्यादा मजबूत है।
- 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। आमतौर पर इस्तेमाल किया जाने वाला SHA2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। SHA2 को अत्यधिक हल्के होने के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।[18] इसका मतलब है कि PBKDF2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी SHA-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है[19]
- स्क्रीप्ट: 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।[20] जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है।
- आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड ऑथेंटिकेशन के लिए) के लिए बीक्रिप्ट से कमजोर है। Argon2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक बीक्रिप्ट की ताकत से मेल नहीं खाता या पार नहीं करता है।[citation needed]
- पफरफिश2 बीक्रिप्ट का विकास है जो ट्यून करने योग्य मेमोरी फुटप्रिंट (जैसे स्क्रीप्ट और आर्गन2) का उपयोग करता है, न कि बीक्रिप्ट के फिक्स्ड 4 केबी मेमोरी फुटप्रिंट का। स्क्रीप्ट या आर्गन2 के समान, पफरफिश2 अधिक मेमोरी का उपयोग करके अपनी कठिनाई प्राप्त करता है। स्क्रीप्ट और आर्गन2 के विपरीत, पफरफिश2 केवल सीपीयू कोर के एल2 कैश में काम करता है। जबकि स्क्रीप्ट और आर्गन 2 अपनी मेमोरी कठोरता को बेतरतीब ढंग से बहुत सी रैम तक पहुंच कर प्राप्त करते हैं, पफरफिश 2 खुद को सीपीयू कोर के लिए उपलब्ध समर्पित एल 2 कैश तक ही सीमित करता है। यह स्क्रीप्ट और आर्गन2 की तुलना में कस्टम हार्डवेयर में लागू करना और भी कठिन बना देता है। पफरफिश 2 का आदर्श स्मृति पदचिह्न कोर के लिए उपलब्ध कैश का आकार है (उदाहरण के लिए इंटेल एल्डर लेक के लिए 1.25 एमबी[21]) यह पफरफिश2 को जीपीयू या एएसआईसी के प्रति अधिक प्रतिरोधी बनाता है।
आलोचना
अधिकतम पासवर्ड लंबाई
बीक्रिप्ट की अधिकतम पासवर्ड लंबाई 72 बाइट्स है। यह अधिकतम ExpandKey फ़ंक्शन के पहले ऑपरेशन से आता है xor's
पासवर्ड के साथ 18 4-बाइट उपकुंजी (पी):
पी1..पी18 ← पी1..पी18 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-बाइट्स)
विहित OpenBSD कार्यान्वयन इसे 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]इसका अर्थ है कि एन्कोडिंग अधिक सामान्य बेस64#कार्यान्वयन और इतिहास के साथ संगत नहीं है।[citation needed]
यह भी देखें
- Argon2 - 2015 में पासवर्ड हैशिंग प्रतियोगिता का विजेता
- क्रिप्ट (सी) # ब्लोफिश-आधारित योजना - 2002 में विकसित ब्लोफिश-आधारित क्रॉस-प्लेटफ़ॉर्म फ़ाइल एन्क्रिप्शन उपयोगिता[22][23][24][25]
- ccrypt (सी) - यूनिक्स सी लाइब्रेरी फ़ंक्शन
- क्रिप्ट (यूनिक्स) - यूनिक्स उपयोगिता
- सीक्रिप्ट - उपयोगिता
- चाबी खींचना
- mcrypt - उपयोगिता
- PBKDF2 - एक व्यापक रूप से इस्तेमाल किया जाने वाला मानक पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन 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.
- ↑ Whitlock, David (21 September 2021). "Bcrypt Elixir: bcrypt password hashing algorithm for Elixir". GitHub. riverrun.
- ↑ "पैकेज बीक्रिप्ट". 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.
- ↑ 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.