मेरे पास एक साधारण प्रश्न है जो तब हुआ जब मैं एक MySQL डेटाबेस में SHA1 हैश के परिणाम को संग्रहीत करना चाहता था:
कब तक VARCHAR फ़ील्ड होना चाहिए जिसमें मैं हैश का परिणाम संग्रहीत करता हूं?
मेरे पास एक साधारण प्रश्न है जो तब हुआ जब मैं एक MySQL डेटाबेस में SHA1 हैश के परिणाम को संग्रहीत करना चाहता था:
कब तक VARCHAR फ़ील्ड होना चाहिए जिसमें मैं हैश का परिणाम संग्रहीत करता हूं?
जवाबों:
मैं VARCHAR
चर लंबाई डेटा के लिए उपयोग करूंगा , लेकिन निश्चित लंबाई डेटा के साथ नहीं। क्योंकि SHA-1 मान हमेशा 160 बिट लंबा होता है, इसलिए VARCHAR
यह निर्धारित लंबाई वाले क्षेत्र की लंबाई के लिए अतिरिक्त बाइट बर्बाद करेगा ।
और मैं भी मूल्य नहीं SHA1
लौटा रहा हूँ। क्योंकि यह प्रति वर्ण केवल 4 बिट का उपयोग करता है और इस प्रकार 160/4 = 40 वर्णों की आवश्यकता होगी। लेकिन यदि आप प्रति वर्ण 8 बिट का उपयोग करते हैं, तो आपको केवल 160/8 = 20 वर्ण लंबे क्षेत्र की आवश्यकता होगी।
तो मैं आपको उपयोग करने की सलाह देता हूं BINARY(20)
और मान को बाइनरी में बदलने के लिए UNHEX
फ़ंक्शन करता हूं SHA1
।
मैंने BINARY(20)
और उसके लिए भंडारण आवश्यकताओं की तुलना की CHAR(40)
।
CREATE TABLE `binary` (
`id` int unsigned auto_increment primary key,
`password` binary(20) not null
);
CREATE TABLE `char` (
`id` int unsigned auto_increment primary key,
`password` char(40) not null
);
मिलियन रिकॉर्ड्स binary(20)
में 44.56M लगते हैं, जबकि char(40)
64.57M लगते हैं।
InnoDB
यन्त्र।
UNHEX()
मैन्युअल रूप से वर्ग में जोड़ते हैं तो ही काम करेगा ।
एक SHA1 हैश 40 वर्ण लंबा है!
नीचे हैशिंग एल्गोरिथ्म की एक सूची दी गई है जिसमें इसकी आवश्यकता बिट आकार के साथ है:
CHAR (n) की आवश्यकता के साथ एक नमूना तालिका बनाई गई:
CREATE TABLE tbl_PasswordDataType
(
ID INTEGER
,MD5_128_bit CHAR(32)
,SHA_160_bit CHAR(40)
,SHA_224_bit CHAR(56)
,SHA_256_bit CHAR(64)
,SHA_384_bit CHAR(96)
,SHA_512_bit CHAR(128)
);
INSERT INTO tbl_PasswordDataType
VALUES
(
1
,MD5('SamplePass_WithAddedSalt')
,SHA1('SamplePass_WithAddedSalt')
,SHA2('SamplePass_WithAddedSalt',224)
,SHA2('SamplePass_WithAddedSalt',256)
,SHA2('SamplePass_WithAddedSalt',384)
,SHA2('SamplePass_WithAddedSalt',512)
);
Sha1 का आउटपुट साइज़ 160 बिट्स है। जो 160/8 == 20 वर्ण (यदि आप 8-बिट चार्ट का उपयोग करते हैं) या 160/16 = 10 (यदि आप 16-बिट चार्ट का उपयोग करते हैं)।
आप अभी भी उन मामलों में वर्च का उपयोग करना चाहते हैं, जहाँ आप हमेशा उपयोगकर्ता के लिए हैश नहीं जमा करते हैं (अर्थात खातों को प्रमाणित करना / लॉगिन यूआरएल भूल जाना)। एक बार जब कोई उपयोगकर्ता अपनी लॉगिन जानकारी को प्रमाणित / बदल देता है, तो उन्हें हैश का उपयोग करने में सक्षम नहीं होना चाहिए और इसका कोई कारण नहीं होना चाहिए। आप अस्थायी हैश -> उपयोगकर्ता संघों को संग्रहीत करने के लिए एक अलग तालिका बना सकते हैं जिसे हटाया जा सकता है लेकिन मुझे नहीं लगता कि अधिकांश लोग ऐसा करने के लिए परेशान होते हैं।
यदि आपको sha1 कॉलम पर एक इंडेक्स की आवश्यकता है, तो मैं प्रदर्शन कारणों से CHAR (40) का सुझाव देता हूं। मेरे मामले में sha1 कॉलम एक ईमेल पुष्टिकरण टोकन है, इसलिए लैंडिंग पृष्ठ पर क्वेरी केवल टोकन के साथ प्रवेश करती है। इस मामले में, INDEX के साथ CHAR (40), मेरी राय में, सबसे अच्छा विकल्प है :)
यदि आप इस विधि को अपनाना चाहते हैं, तो $ raw_output = false को याद रखें।