हैशेड पासवर्ड फ़ील्ड के लिए किस डेटा प्रकार का उपयोग करना है और किस लंबाई का है?


268

मुझे यकीन नहीं है कि पासवर्ड हैशिंग कैसे काम करता है (इसे बाद में लागू किया जाएगा), लेकिन अब डेटाबेस स्कीमा बनाने की आवश्यकता है।

मैं 4-20 अक्षरों तक पासवर्ड सीमित करने के बारे में सोच रहा हूं, लेकिन जैसा कि मैं समझता हूं कि हैश स्ट्रिंग एन्क्रिप्ट करने के बाद अलग लंबाई होगी।

तो, इन पासवर्ड को डेटाबेस में कैसे स्टोर करें?


ओपनवॉल के PHP पासवर्ड हैशिंग ( फ्रेमपास) को भी देखें । उपयोगकर्ता पासवर्ड पर कई आम हमलों के खिलाफ इसकी पोर्टेबल और कठोर। जिस व्यक्ति ने फ्रेमवर्क (सोलरडिजाइनर) लिखा है, वह वही व्यक्ति है जिसने जॉन द रिपर लिखा था और पासवर्ड हैशिंग प्रतियोगिता में एक न्यायाधीश के रूप में बैठता है । तो वह पासवर्ड पर हमलों के बारे में एक या दो बात जानता है।
jww

2
कृपया अपने पासवर्ड पर ऊपरी सीमा न रखें। आप उन्हें हैशिंग कर रहे हैं, ऊपरी सीमा के लिए कोई भंडारण कारण नहीं है। यदि आप पासवर्ड हैश का उपयोग करते हुए DoS के हमलों से चिंतित हैं, तो 1000 या 1024 एक उचित ऊपरी सीमा है।
इरिडैन

पासवर्ड की लंबाई क्यों सीमित करें? कम से कम एक उपयोगकर्ता को 100 चरित्र पासवर्ड बनाने दें :)
एंड्रयू

4 अक्षर पासवर्ड के लिए एक बहुत ही खतरनाक कम बाउंड होते हैं क्योंकि वे दरार के लिए तुच्छ होते हैं। बहुत कम से कम 8 का उपयोग करें, लेकिन 14 या 16 ज्यादा बेहतर है।
क्विकचेंज

यह एक पुराना सवाल है जो एक पुराने उत्तर के साथ है। आज तक के लिए गिल्स जवाब देखें ।
kelalaka

जवाबों:


448

अपडेट: बस हैश फ़ंक्शन का उपयोग पासवर्ड संग्रहीत करने के लिए पर्याप्त मजबूत नहीं है। आपको अधिक विस्तृत विवरण के लिए इस थ्रेड पर गिल्स के उत्तर को पढ़ना चाहिए ।

पासवर्ड के लिए, Bcrypt या Argon2i जैसे की-स्ट्रॉन्ग हैश एल्गोरिथ्म का उपयोग करें। उदाहरण के लिए, PHP में, password_hash () फ़ंक्शन का उपयोग करें, जो डिफ़ॉल्ट रूप से Bcrypt का उपयोग करता है।

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

परिणाम निम्नलिखित के समान 60-वर्ण का स्ट्रिंग है (लेकिन अंक अलग-अलग होंगे, क्योंकि यह एक अद्वितीय नमक उत्पन्न करता है)।

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

CHAR(60)Bcrypt हैश के इस एन्कोडिंग को संग्रहीत करने के लिए SQL डेटा प्रकार का उपयोग करें । ध्यान दें कि यह फ़ंक्शन हेक्साडेसिमल अंकों की एक स्ट्रिंग के रूप में एन्कोड नहीं करता है, इसलिए हम बाइनरी में स्टोर करने के लिए इसे आसानी से अनहैक्स नहीं कर सकते हैं।

अन्य हैश फ़ंक्शंस में अभी भी उपयोग हैं, लेकिन पासवर्ड संग्रहीत करने के लिए नहीं, इसलिए मैं नीचे मूल उत्तर रखूंगा, जो 2008 में लिखा गया था।


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

  • MD5 एक 128-बिट हैश मान उत्पन्न करता है। आप CHAR (32) या बायनेरी (16) का उपयोग कर सकते हैं
  • SHA-1 एक 160-बिट हैश मान उत्पन्न करता है। आप CHAR (40) या BINARY (20) का उपयोग कर सकते हैं
  • SHA-224 एक 224-बिट हैश मान उत्पन्न करता है। आप CHAR (56) या BINARY (28) का उपयोग कर सकते हैं
  • SHA-256 एक 256-बिट हैश मान उत्पन्न करता है। आप CHAR (64) या बायनेरी (32) का उपयोग कर सकते हैं
  • SHA-384 एक 384-बिट हैश मान उत्पन्न करता है। आप CHAR (96) या BINARY (48) का उपयोग कर सकते हैं
  • SHA-512 एक 512-बिट हैश मान उत्पन्न करता है। आप CHAR (128) या BINARY (64) का उपयोग कर सकते हैं
  • BCrypt एक कार्यान्वयन-निर्भर 448-बिट हैश मान उत्पन्न करता है। आपको CHAR (56), CHAR (60), CHAR (76), BINARY (56) या BINARY (60) की आवश्यकता हो सकती है

2015 तक, एनआईएसटी इंटरऑपरेबिलिटी की आवश्यकता वाले किसी भी हैश कार्यों के लिए SHA-256 या उच्चतर का उपयोग करने की सिफारिश करता है। लेकिन NIST पासवर्ड को सुरक्षित रूप से संग्रहीत करने के लिए इन सरल हैश फ़ंक्शन का उपयोग करने की अनुशंसा नहीं करता है।

कम हैशिंग हैशिंग एल्गोरिदम के उनके उपयोग होते हैं (जैसे कि किसी एप्लिकेशन के लिए आंतरिक, इंटरचेंज के लिए नहीं), लेकिन वे क्रैकेबल होने के लिए जाने जाते हैं ।


47
@ हिप्पो: कृपया, नमक के रूप में उपयोगकर्ता नाम का उपयोग न करें। प्रति उपयोगकर्ता एक यादृच्छिक नमक उत्पन्न करें।
बिल कार्विन

11
हां, इसे एक ही पंक्ति में संग्रहीत करने का कोई कारण नहीं है। यहां तक ​​कि अगर कोई हमलावर आपके डेटाबेस तक पहुंच प्राप्त करता है, तो उन्हें उस नमक के आधार पर अपनी इंद्रधनुष तालिका का निर्माण करना होगा। और यह केवल पासवर्ड का अनुमान लगाने के रूप में बहुत काम है।
बिल कारविन

5
@SgtPooki: सादे में नमक को स्टोर करने के लिए आपको एक और कॉलम की आवश्यकता होगी। तब आप उपयोगकर्ता के पासवर्ड को उसी नमक के साथ हैश कर सकते हैं जब वे इसे टाइप करते हैं, और परिणाम की तुलना तालिका में संग्रहीत हैश डाइजेस्ट से करते हैं।
बिल कारविन

12
यदि आप उसी तालिका में नमक का भंडारण कर रहे हैं (या समान पहुंच अनुमतियों के साथ कोई अन्य स्थान) तो नमक के रूप में उपयोगकर्ता नाम का उपयोग न करने का कोई कारण नहीं है, क्योंकि यह प्रति उपयोगकर्ता अद्वितीय होगा। हालांकि, कोई भी ज्ञात नमक हैश को क्रिप्टोग्राफिक रूप से कमजोर बनाता है अगर कोई ज्ञात नमक नहीं था। एक नमक केवल मूल्य जोड़ता है अगर यह भी अज्ञात है।
फिजियारोन

9
मैं ज्ञात अज्ञात नमक के साथ सौदा नहीं समझता। यदि आप किसी साइट को लागू कर रहे हैं - नमक को लॉगिन पृष्ठ / स्क्रिप्ट / सेविस के लिए जाना जाता है जो पासवर्ड का परीक्षण कर रहा है। तो - आप "अज्ञात" नमक अधिवक्ताओं - क्या आप मान रहे हैं कि लॉगिन प्रक्रिया के लिए कोड हमलावर के लिए अज्ञात है? अन्यथा - हमलावर को हमेशा नमक का पता नहीं चलेगा, क्या यह यादृच्छिक, अनोखा, हैशेड पासवर्ड या एक साथ संग्रहीत है?
मैटस्ट्यूहलर

13

आप MySQL के लिए अपने डेटाटाइप को परिभाषित करने के लिए वास्तव में CHAR(हैश की लंबाई) का उपयोग कर सकते हैं क्योंकि प्रत्येक हैशिंग एल्गोरिथ्म हमेशा समान वर्णों का मूल्यांकन करेगा। उदाहरण के लिए, SHA1हमेशा 40-वर्ण का हेक्साडेसिमल नंबर देता है।


1
SHA-1 हैशिंग पासवर्ड के लिए उपयुक्त नहीं है।
गिलेस एसओ- बुराई को रोकना '

10

हमेशा पासवर्ड हैशिंग एल्गोरिथ्म का उपयोग करें: आर्गन 2 , स्क्रीप्ट , बीक्रिप्ट या पीबीकेडीएफ 2

आर्गन 2 ने 2015 पासवर्ड हैशिंग प्रतियोगिता जीती। Scrypt , bcrypt और PBKDF2 पुराने एल्गोरिदम हैं जिन्हें अब कम पसंद किया जाता है, लेकिन फिर भी मौलिक रूप से ध्वनि दी जाती है, इसलिए यदि आपका प्लेटफ़ॉर्म अभी तक Argon2 का समर्थन नहीं करता है, तो अभी के लिए किसी अन्य एल्गोरिदम का उपयोग करना ठीक है।

पासवर्ड को कभी भी डेटाबेस में स्टोर न करें। इसे एन्क्रिप्ट न करें, या तो: अन्यथा, यदि आपकी साइट भंग हो जाती है, तो हमलावर को डिक्रिप्शन कुंजी मिलती है और इसलिए सभी पासवर्ड प्राप्त कर सकते हैं। पासवर्डों किया जाना चाहिए टुकड़ों में बांटा

एक पासवर्ड हैश एक हैश तालिका हैश या एक क्रिप्टोग्राफिक हैश से अलग गुण है। पासवर्ड पर कभी भी एक साधारण क्रिप्टोग्राफिक हैश का उपयोग न करें जैसे कि MD5, SHA-256 या SHA-512। एक पासवर्ड हैशिंग एल्गोरिथ्म एक नमक का उपयोग करता है , जो अद्वितीय है (किसी अन्य उपयोगकर्ता या किसी और के डेटाबेस के लिए उपयोग नहीं किया जाता है)। नमक आवश्यक है ताकि हमलावर सामान्य पासवर्ड के हैश की पूर्व-गणना न कर सकें: एक नमक के साथ, उन्हें हर खाते के लिए गणना को पुनरारंभ करना होगा। एक पासवर्ड हैशिंग एल्गोरिथ्म आंतरिक रूप से धीमा है - जितना धीमा आप खर्च कर सकते हैं। धीमेपन से हमलावर को आप से बहुत अधिक चोट पहुँचती है क्योंकि हमलावर को कई अलग-अलग पासवर्ड आज़माने होते हैं। अधिक जानकारी के लिए, सुरक्षित रूप से हैश पासवर्ड कैसे देखें ।

एक पासवर्ड हैश सूचना के चार टुकड़े करता है:

  • एक संकेतक जिसका एल्गोरिथ्म उपयोग किया जाता है। चपलता के लिए यह आवश्यक है : समय के साथ क्रिप्टोग्राफिक सिफारिशें बदल जाती हैं। आपको एक नए एल्गोरिथ्म में संक्रमण करने में सक्षम होने की आवश्यकता है।
  • एक कठिनाई या कठोरता सूचक। यह मान जितना अधिक होता है, हैश की गणना करने के लिए उतनी ही अधिक गणना की आवश्यकता होती है। पासवर्ड परिवर्तन फ़ंक्शन में यह एक स्थिर या वैश्विक कॉन्फ़िगरेशन मान होना चाहिए, लेकिन यह समय के साथ बढ़ जाना चाहिए क्योंकि कंप्यूटर तेज़ हो जाते हैं, इसलिए आपको प्रत्येक खाते के लिए मूल्य याद रखना होगा। कुछ एल्गोरिदम का एक संख्यात्मक मान है, अन्य में अधिक पैरामीटर हैं (उदाहरण के लिए सीपीयू उपयोग और रैम उपयोग अलग-अलग ट्यून करने के लिए)।
  • नमक। चूंकि नमक विश्व स्तर पर अद्वितीय होना चाहिए, इसलिए इसे प्रत्येक खाते के लिए संग्रहीत किया जाना चाहिए। प्रत्येक पासवर्ड परिवर्तन पर बेतरतीब ढंग से नमक उत्पन्न किया जाना चाहिए।
  • हैश उचित, हैशिंग एल्गोरिथ्म में गणितीय गणना का उत्पादन।

कई पुस्तकालयों में एक जोड़ी फ़ंक्शन शामिल है जो आसानी से इस जानकारी को एक स्ट्रिंग के रूप में पैकेज करता है: एक जो एल्गोरिथ्म संकेतक, कठोरता संकेतक और पासवर्ड लेता है, एक यादृच्छिक नमक उत्पन्न करता है और पूर्ण हैश स्ट्रिंग लौटाता है; और वह जो एक पासवर्ड लेता है और इनपुट के रूप में पूरा हैश स्ट्रिंग और एक बूलियन देता है जो दर्शाता है कि पासवर्ड सही था या नहीं। कोई सार्वभौमिक मानक नहीं है, लेकिन एक सामान्य एन्कोडिंग है

$ एल्गोरिदम $ पैरामीटर $ नमक $ आउटपुट

जहां algorithmएक नंबर या एक छोटी अल्फ़ान्यूमेरिक स्ट्रिंग एल्गोरिथ्म के चुनाव एन्कोडिंग, है parametersएक मुद्रण योग्य स्ट्रिंग है, और saltऔर outputसमाप्त बिना Base64 में इनकोड =

नमक और आउटपुट के लिए 16 बाइट्स पर्याप्त हैं। ( Argon2 के लिए उदाहरण के लिए सिफारिशें देखें ।) Base64 में एन्कोडेड, यह प्रत्येक 21 वर्ण है। अन्य दो भाग एल्गोरिथ्म और मापदंडों पर निर्भर करते हैं, लेकिन 20–40 वर्ण विशिष्ट होते हैं। यह कुल C२ ASCII अक्षर है ( CHAR(82)और यूनिकोड की कोई आवश्यकता नहीं है), जिसके लिए आपको एक सुरक्षा मार्जिन जोड़ना चाहिए अगर आपको लगता है कि बाद में क्षेत्र को बड़ा करना मुश्किल हो रहा है।

यदि आप हैश को एक द्विआधारी प्रारूप में कूटबद्ध करते हैं, तो आप इसे एल्गोरिथ्म के लिए 1 बाइट तक, कठोरता के लिए 1-4 बाइट्स (यदि आप कुछ मापदंडों को हार्ड-कोड करते हैं), और नमक और आउटपुट के लिए 16 बाइट्स प्राप्त कर सकते हैं। , कुल 37 बाइट्स के लिए। 40 बाइट्स ( BINARY(40)) को कहें कि कम से कम कुछ अतिरिक्त बाइट्स हों। ध्यान दें कि ये 8-बिट बाइट्स हैं, न कि मुद्रण योग्य वर्ण, विशेष रूप से फ़ील्ड में शून्य बाइट्स शामिल हो सकते हैं।

ध्यान दें कि हैश की लंबाई पूरी तरह से पासवर्ड की लंबाई से असंबंधित है।


9

आपको यह विकिपीडिया लेख सार्थक सलाम करने पर मिल सकता है । अपने हैश मूल्य को यादृच्छिक बनाने के लिए डेटा का एक सेट बिट जोड़ने के लिए विचार है; यदि कोई पासवर्ड हैश करने के लिए अनधिकृत पहुँच पाता है तो यह आपके पासवर्ड को शब्दकोश हमलों से बचाएगा।


2
यह वास्तव में बहुत सार्थक (+1) है, लेकिन यह सवाल का जवाब नहीं देता है! (-1)
बिल कारविन

3
हां, लेकिन इस संदर्भ में निश्चित रूप से प्रासंगिक है (+1)
ट्रेब

7

एक निश्चित लंबाई के तार के रूप में (VARCHAR (n) या फिर MySQL इसे कहते हैं)। एक हैश में हमेशा 12 वर्णों की एक निश्चित लंबाई होती है (आपके द्वारा उपयोग किए गए हैश एल्गोरिथम के आधार पर)। तो 20 char का पासवर्ड घटकर 12 char हैश का हो जाएगा, और 4 char का पासवर्ड भी 12 char हैश का उत्पादन करेगा।


3
'या हालाँकि MySQL इसे कहता है' - MYSQL इसे CHAR कहता है। यह प्रकार निश्चित लंबाई मान के लिए है। इसलिए मुझे लगता है कि CHAR VARCHAR से बेहतर प्रकार है।
t298712383

4

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


3

यह वास्तव में आपके द्वारा उपयोग किए जा रहे हैशिंग एल्गोरिथ्म पर निर्भर करता है। पासवर्ड की लंबाई हैश की लंबाई के साथ बहुत कम है, अगर मुझे सही याद है। आपके द्वारा उपयोग किए जा रहे हैशिंग एल्गोरिथ्म पर चश्मा देखें, कुछ परीक्षण चलाएं, और उसके ठीक ऊपर ट्रंकट करें।


3

डैश बिट्स (128 बिट्स, 160 बिट्स, 256 बिट्स, इत्यादि, एल्गोरिथ्म पर निर्भर करता है) का एक क्रम है। , नहीं पाठ / चरित्र टाइप, अगर MySQL यह (SQL सर्वर डेटाप्रकार है की अनुमति देता है आपके कॉलम द्विआधारी टाइप किया जाना चाहिए binary(n)या varbinary(n))। आपको हैश को भी नमक करना चाहिए। लवण पाठ या बाइनरी हो सकता है, और आपको एक संबंधित कॉलम की आवश्यकता होगी।


न्याय यहां पूरी तरह से सही है - MySQL इन्हें संख्यात्मक मानों के रूप में संग्रहीत करेगा और इस स्तंभ पर एक स्ट्रिंग मिलान करने की तुलना में अधिक कुशल खोज करेगा, हालांकि नमकीन डेटा के बगल में लवण को डेटाबेस में संग्रहीत नहीं किया जाना चाहिए - जो सुरक्षा प्रदान करता है जो लवण प्रदान करता है ।
टोनी मारो

6
लवण गुप्त नहीं हैं । केवल गुप्त पासवर्ड है। बस यह सुनिश्चित करें कि हर नए पासवर्ड को एक नया नमक मिले। हर बार जब उपयोगकर्ता अपना पासवर्ड बदलता है, तो सिस्टम को उस पासवर्ड के लिए एक नया नमक उत्पन्न करना चाहिए। साल्ट लंबे और यादृच्छिक होने चाहिए, जैसे कि क्रिप्टोग्राफिक रूप से सुरक्षित PRNG से उत्पन्न 16 बाइट्स।
येल्डब्लम सिप

1
@TonyMaro यकीन नहीं है कि SQL स्तर पर एक पासवर्ड स्ट्रिंग मैच एक अच्छी रणनीति है। दूसरे शब्दों में, आपको पासवर्ड के लिए अपने डेटाबेस की खोज नहीं करनी चाहिए, इसके बजाय उपयोगकर्ता को उसके उपयोगकर्ता नाम के आधार पर पुनर्प्राप्त करें और SQL के बजाय कोड में पासवर्ड की तुलना करें।
बार्ट

1

मैंने हमेशा एक एन्क्रिप्टेड स्ट्रिंग की मैक्स स्ट्रिंग लंबाई को खोजने के लिए परीक्षण किया है और निर्धारित किया है कि वर्ण प्रकार की वर्ण लंबाई के रूप में। आपके पास कितने रिकॉर्ड हैं, इसके आधार पर, यह वास्तव में डेटाबेस के आकार में मदद कर सकता है।


0

md5 vARCHAR (32) के लिए उपयुक्त है। AES का उपयोग करने वालों के लिए बेहतर है कि वेर्बिनरी का उपयोग करें।


1
न तो एमडी 5 एईएस उपयुक्त नहीं है एक पासवर्ड हैश हैर।
गिलेस एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.