mysql डाटाबेस में एक बैक्रिप्ट हैश पासवर्ड संग्रहीत करने के लिए मुझे किस कॉलम प्रकार/लंबाई का उपयोग करना चाहिए?




hash types (4)

मैं डेटाबेस में एक हैश पासवर्ड (बीसीआरपीटी का उपयोग करके) स्टोर करना चाहता हूं। इसके लिए एक अच्छा प्रकार क्या होगा, और यह सही लंबाई होगी? पासवर्ड हमेशा समान लंबाई के बीसीआरपीटी के साथ धोए गए हैं?

संपादित करें

उदाहरण हैश:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

कुछ पासवर्ड हैशिंग करने के बाद, ऐसा लगता है कि बीसीक्रिप्ट हमेशा 60 चरित्र हैंश उत्पन्न करता है।

संपादित करें 2

कार्यान्वयन का जिक्र नहीं करने के लिए खेद है। मैं jBCrypt का उपयोग कर रहा हूँ।


मुझे नहीं लगता कि कोई भी साफ चाल है जो आप इसे संग्रहीत कर सकते हैं क्योंकि आप एमडी 5 हैश के साथ उदाहरण के लिए कर सकते हैं।

मुझे लगता है कि आपकी सबसे अच्छी शर्त इसे एक CHAR(60) रूप में स्टोर करना है क्योंकि यह हमेशा 60 वर्ण लंबा होता है


यदि आप bcrypt हैश उत्पन्न करने के लिए PASSWORD_DEFAULT एल्गोरिदम के साथ PHP के password_hash() का उपयोग कर रहे हैं (जो मुझे लगता है कि इस प्रश्न को पढ़ने वाले लोगों का एक बड़ा प्रतिशत है) तो ध्यान रखें कि भविष्य में password_hash() एक अलग एल्गोरिदम का उपयोग कर सकता है डिफ़ॉल्ट के रूप में और इसलिए यह हैश की लंबाई को प्रभावित कर सकता है (लेकिन यह आवश्यक नहीं हो सकता है)।

मैनुअल पेज से:

ध्यान दें कि यह निरंतर समय के साथ बदलने के लिए डिज़ाइन किया गया है क्योंकि PHP में नए और मजबूत एल्गोरिदम जोड़े गए हैं। इसी कारण से, इस पहचानकर्ता का उपयोग करने से परिणाम की लंबाई समय के साथ बदल सकती है। इसलिए, परिणाम को डेटाबेस कॉलम में संग्रहीत करने की अनुशंसा की जाती है जो 60 वर्णों से अधिक विस्तार कर सकती है (255 वर्ण एक अच्छी पसंद होगी)।

255 बाइट पासवर्ड हैश स्टोर करने के लिए यहां तक ​​कि आपके पास 1 अरब उपयोगकर्ता (यानी आप वर्तमान में फेसबुक के साथ प्रतिस्पर्धा कर रहे हैं) के लिए bcrypt का उपयोग करना, यह केवल 255 जीबी डेटा होगा - एक छोटे से एसएसडी हार्ड ड्राइव के आकार के बारे में। यह बेहद असंभव है कि पासवर्ड हैश को संग्रहीत करना आपके आवेदन में बाधा बन जाएगा। हालांकि बंद कारण यह है कि स्टोरेज स्पेस वास्तव में किसी कारण से एक मुद्दा है, आप पासवर्ड_शैश password_hash() को bcrypt का उपयोग करने के लिए PASSWORD_BCRYPT का उपयोग कर सकते हैं, भले ही यह डिफ़ॉल्ट न हो। बस bcrypt में मिली किसी भी भेद्यता के बारे में सूचित रहना सुनिश्चित करें और हर बार एक नया PHP संस्करण जारी होने पर रिलीज नोट्स की समीक्षा करें। यदि डिफ़ॉल्ट एल्गोरिदम कभी भी बदला जाता है तो यह समीक्षा करना अच्छा होगा कि नए एल्गोरिदम का उपयोग करने के लिए क्यों नहीं और सूचित निर्णय लिया जाए।


Bcrypt के लिए मॉड्यूलर क्रिप्ट प्रारूप में शामिल हैं

  • हैशिंग एल्गोरिदम और प्रारूप की पहचान $2$ , $2a$ या $2y$
  • लागत पैरामीटर को दर्शाते हुए दो अंकों का मूल्य, उसके बाद $
  • एक 53 वर्ण लंबे बेस -64-एन्कोडेड मान (वे वर्णमाला का उपयोग करते हैं . , / , 0 - 9 , A - Z , A - Z मानक बेस 64 एन्कोडिंग वर्णमाला से अलग है) जिसमें शामिल हैं:
    • नमक के 22 वर्ण (132 डीकोडेड बिट्स के प्रभावी रूप से केवल 128 बिट्स)
    • एन्क्रिप्टेड आउटपुट के 31 वर्ण (186 डीकोडेड बिट्स के प्रभावी रूप से केवल 184 बिट्स)

इस प्रकार कुल लंबाई क्रमशः 59 या 60 बाइट है।

जैसे ही आप 2 ए प्रारूप का उपयोग करते हैं, आपको 60 बाइट्स की आवश्यकता होगी। और इस प्रकार MySQL के लिए मैं CHAR(60) BINARY बिनरी या बिनरी BINARY(60) का उपयोग करने की सिफारिश करूंगा CHAR(60) BINARY अंतर के बारे में जानकारी के लिए _bin और बाइनरी कॉलेशन देखें)।

CHAR बाइनरी सुरक्षित नहीं है और समानता केवल बाइट मान पर निर्भर नहीं है बल्कि वास्तविक संयोजन पर निर्भर करती है; सबसे खराब मामले में A को बराबर माना जाता a । अधिक जानकारी के लिए _bin और binary कॉलेशन देखें।


एक Bryrypt हैश को एक बिनरी BINARY(40) कॉलम में संग्रहीत किया जा सकता है।

BINARY(60) , जैसा कि अन्य उत्तरों का सुझाव है, सबसे आसान और सबसे प्राकृतिक विकल्प है, लेकिन यदि आप स्टोरेज दक्षता को अधिकतम करना चाहते हैं, तो आप हैश को लापरवाही से निर्णायक रूप से 20 बाइट्स बचा सकते हैं। मैंने गिटहब पर इसे और अधिक अच्छी तरह से दस्तावेज किया है: https://github.com/ademarre/binary-mcf

Bcrypt हैश मॉड्यूलर क्रिप्ट प्रारूप (एमसीएफ) के रूप में संदर्भित एक संरचना का पालन करें। बाइनरी एमसीएफ (बीएमसीएफ) इन पाठ्यचर्या हैश प्रस्तुतियों को एक और कॉम्पैक्ट बाइनरी संरचना में डीकोड करता है। बीक्रिप्ट के मामले में, परिणामस्वरूप बाइनरी हैश 40 बाइट्स है।

गम्बो ने एक बैक्रिप्ट एमसीएफ हैश के चार घटकों को समझाने का अच्छा काम किया:

$<id>$<cost>$<salt><digest>

बीएमसीएफ को डीकोडिंग इस तरह है:

  1. $<id>$ बिट्स $<id>$ 3 बिट्स में प्रदर्शित किया जा सकता है।
  2. <cost>$ , 04-31, 5 बिट्स में प्रदर्शित किया जा सकता है। इन्हें 1 बाइट के लिए एक साथ रखो।
  3. 22-वर्ण नमक 128 बिट्स का एक (गैर-मानक) आधार -64 प्रतिनिधित्व है। बेस -64 डिकोडिंग 16 बाइट उत्पन्न करता है।
  4. 31-वर्ण हैश डाइजेस्ट आधार -64 23 बाइट्स को डीकोड किया जा सकता है।
  5. इसे सभी 40 बाइट्स के लिए एक साथ रखें: 1 + 16 + 23

आप उपरोक्त लिंक पर और अधिक पढ़ सकते हैं, या गिटहब पर भी मेरे PHP कार्यान्वयन की जांच कर सकते हैं।





bcrypt