SHA256 हैश कब तक है?


246

मैं SHA256एक पासवर्ड + नमक पर चलने जा रहा हूं , लेकिन मुझे नहीं पता कि VARCHARMySQL डेटाबेस को सेट करते समय मुझे कब तक बनाना है। एक अच्छी लंबाई क्या है?


9
इससे पहले कि कोई भी इसे पढ़े, इस सलाह का पालन करें और SHA-*हैश पासवर्ड का उपयोग करें, कृपया इसे पहले पढ़ें
c00000fd

2
जब तक आप पासवर्ड पर SHA-256 का उपयोग नहीं कर रहे हैं, जो आपको नहीं करना चाहिए, हैश की लंबाई 256 बिट्स, या 64 हेक्साडेसिमल वर्ण या 43 अल्फ़ान्यूमेरिक वर्ण या 32 बाइट्स होती है।
caw

जवाबों:


334

एक sha256 256 बिट लंबा है - जैसा कि इसके नाम से संकेत मिलता है।

चूँकि sha256 एक हेक्साडेसिमल निरूपण देता है, 4 बिट्स प्रत्येक वर्ण को एन्कोड करने के लिए पर्याप्त हैं (8 के बजाय, ASCII के लिए), इसलिए 256 बिट 64 हेक्स वर्णों का प्रतिनिधित्व करेंगे, इसलिए आपको एक varchar(64)या एक की आवश्यकता है char(64), क्योंकि लंबाई हमेशा समान होती है , बिल्कुल अलग नहीं है।

और डेमो:

$hash = hash('sha256', 'hello, world!');
var_dump($hash);

तुम्हे दूंगा :

$ php temp.php
string(64) "68e656b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728"

यानी 64 अक्षरों वाला एक तार।


7
क्या हम चार (64) का उपयोग प्राथमिक कुंजी के रूप में कर सकते हैं या बाइनरी (32) उसके लिए बेहतर होगा? (access_token)
फ्रैंक

3
अगर आपको लगता है कि आप भविष्य में किसी उपयोगकर्ता को ब्लॉक करना चाह सकते हैं, तो मैं सुझाव देता हूं कि varchar(65)एक अग्रणी !... का उपयोग करके ।
मैनटैक्स

103
... या केवल एक स्तंभ 'अवरुद्ध' जोड़ें?
स्टिजेन डे विट

5
जैसा कि आप प्रत्येक पासवर्ड के लिए एक अलग नमक रखना चाहते हैं, आपको इसे हैश के बगल में स्टोर करना होगा। इसके लिए आप एक अतिरिक्त फ़ील्ड का उपयोग कर सकते हैं या इसे हैश में जोड़ सकते हैं, इसलिए आपको 64 से अधिक वर्णों की आवश्यकता होगी
पैट्रिक कॉर्निसेलेन

4
आप इसे चुनने के लिए इस कथन का उपयोग कर सकते हैं: SELECT length(to_base64(unhex(sha2('say hello to my little friend',256))))यह हमेशा 44 होता है जो मूल स्ट्रिंग की लंबाई है।
DrAhmedJava 13

72

SHA256 के 256 बिट्स के लिए एन्कोडिंग विकल्प:

  1. बेस 64: प्रति वर्ण 6 बिट = CHAR(44)पैडिंग कैरेक्टर सहित
  2. हेक्स: 4 बिट्स प्रति चार = CHAR(64)
  3. बाइनरी: 8 बिट प्रति बाइट = BINARY(32)

30
Base64 3 बाइट्स प्रति 4 वर्ण है, इसलिए भले ही 32 बाइट 43 वर्णों में फिट हो, आपको वास्तव में 44 की आवश्यकता है। अंतिम वर्ण के रूप में एक अतिरिक्त = जोड़ा जाता है
Wilco

2
खैर, =छीन लिया जा सकता है और फिर से जोड़ा जा सकता है।
रिक जेम्स

28

मैं BINARY (32) का उपयोग करना पसंद करता हूं क्योंकि यह अनुकूलित तरीका है!

आप उस 32 हेक्स अंकों को (00 से एफएफ) में रख सकते हैं।

इसलिए BINARY (32)!


8
+1 - मुझे यह पसंद है ... इस पर किसी और को ... MySQL के साथ उपयोग करने के लिए ... आप उपयोग कर सकते हैं UPDATE...SET hash_column=UNHEX(sha256HexString)। फिर, जब इसे पुनः प्राप्त करते हैं, तो आप SELECT HEX(hash_column) AS hash_column
केविन नेल्सन

22

आप इसे VARCHAR क्यों बनाएंगे? यह अलग नहीं है। यह हमेशा 64 वर्णों का होता है, जिसे ऑनलाइन SHA-256 कैलकुलेटर में से कुछ में चलाकर निर्धारित किया जा सकता है ।


क्या चार (64) एक वैध mysql कथन है?
टोनी स्टार्क 23

28
@hatorade: नहीं, यह एक बयान नहीं है, लेकिन यह एक मान्य स्तंभ प्रकार है।
मार्क बायर्स

10
varchar भी स्पेस तब तक आवंटित नहीं करता है जब तक कि उसका उपयोग नहीं किया जाता है, char के विपरीत यह कुल वर्णों की संख्या को आवंटित करता है, भले ही वह डेटा भरने वाला हो।
क्लेनलैंड

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.