अपडेट करें
PR 31721 लारवेल 7.0.8 में विलय कर दिया गया है, जो जेसन एन्कोडिंग में बची हुई फॉरवर्ड स्लैश को ठीक करता है। इससे पहले, समान डेटा को एन्क्रिप्ट करने से आपको परिवर्तनशील आकार के परिणाम प्राप्त होंगे। अब, 7.0.8 से, समान डेटा को एन्क्रिप्ट करने से आपको हर बार समान आकार का परिणाम मिलेगा।
TL;DR:
लैरावेल की एन्क्रिप्ट विधि एक स्ट्रिंग लौटाएगी, इसलिए डेटाटाइप एक वर्चर या टेक्स्ट वेरिएशन होना चाहिए, जो एन्क्रिप्ट किए जा रहे डेटा के आकार पर निर्भर करता है।
अनुमानित आकार निर्धारित करने के लिए, आप गणनाओं की निम्नलिखित श्रृंखला का उपयोग कर सकते हैं:
लारावेल>=7.0.8
चलो a
=क्रमबद्ध अनएन्क्रिप्टेड डेटा का आकार (strlen(serialize($data))
)
चलो b
=a + 16 - (a MOD 16)
(एन्क्रिप्टेड डेटा के आकार की गणना करें)
चलो c
=(b + 2 - ((b + 2) MOD 3)) / 3 * 4
(बेस 64 एन्कोडेड डेटा के आकार की गणना करें)
चलो d
=c + 117
(मैक, IV और जोंस एन्कोडिंग का आकार जोड़ें)
चलो e
=(d + 2 - ((d + 2) MOD 3)) / 3 * 4
(बेस 64 एन्कोडेड डेटा के आकार की गणना करें)
भले ही मान नियतात्मक नहीं है, परिणाम का आकार है। उदाहरण के लिए, यदि आप 9 अंकों की सामाजिक सुरक्षा संख्या को एन्क्रिप्ट करना चाहते हैं, तो परिणाम हमेशा 216 वर्णों का होगा।
लारावेल <7.0.8
चलो a
=क्रमबद्ध अनएन्क्रिप्टेड डेटा का आकार (strlen(serialize($data))
)
चलो b
=a + 16 - (a MOD 16)
(एन्क्रिप्टेड डेटा के आकार की गणना करें)
चलो c
=(b + 2 - ((b + 2) MOD 3)) / 3 * 4
(बेस 64 एन्कोडेड डेटा के आकार की गणना करें)
चलो d
=c + 117 + 8 + ((c + 2 - ((c + 2) MOD 3)) / 3)
(मैक, IV, और जेसन एन्कोडिंग का आकार जोड़ें, साथ ही संभावित बची हुई स्लैश के लिए अतिरिक्त बफर)
चलो e
=(d + 2 - ((d + 2) MOD 3)) / 3 * 4
(बेस 64 एन्कोडेड डेटा के आकार की गणना करें)
उदाहरण के लिए, यदि आप 9 अंकों की सामाजिक सुरक्षा संख्या को एन्क्रिप्ट करना चाहते हैं, तो परिणाम न्यूनतम 216 वर्णों और अधिकतम 308 वर्णों का होगा (हालांकि यह संभवतः एक सांख्यिकीय असंभवता है)। यदि आप 100000+ एन्क्रिप्शन का लूप चलाते हैं, तो आप देखेंगे कि आकार आमतौर पर 216 - 224 रेंज में होता है। ऊपर दिया गया सूत्र आपको अपने क्षेत्र को 248 वर्णों पर सेट करने के लिए कहेगा, जो अपेक्षित सीमा से ऊपर एक स्वस्थ बफर है, लेकिन सांख्यिकीय रूप से हिट करना असंभव नहीं है।
विवरण:
एन्क्रिप्ट विधि से लौटाया गया मान केवल एन्क्रिप्टेड टेक्स्ट नहीं है, बल्कि एक जेसन एन्कोडेड पेलोड सरणी का बेस 64 एन्कोडेड प्रतिनिधित्व है जिसमें (1) क्रमबद्ध डेटा का बेस 64 एन्कोडेड एन्क्रिप्टेड मान, (2) बेस 64 एन्कोडेड प्रारंभिक वेक्टर ( IV), और (3) संदेश प्रमाणीकरण कोड (MAC)। इसलिए, आवश्यक फ़ील्ड के आकार को निर्धारित करने के लिए, आपको डेटा के अधिकतम आकार को जानना होगा जो एन्कोड किया जाएगा, और फिर इन अतिरिक्त जानकारी के लिए कुछ अतिरिक्त जगह जोड़ें जो लौटाई गई स्ट्रिंग में भरी हुई हैं।पी>
सबसे पहले, आइए आपके एन्क्रिप्ट किए गए मान के अधिकतम आकार की गणना करें। चूंकि आपका एन्क्रिप्शन एल्गोरिथम (AES-256-CBC) एक ब्लॉक सिफर है, यह बहुत आसानी से एक सूत्र के साथ किया जाता है। AES 16 बाइट ब्लॉक का उपयोग करता है और इसके लिए कम से कम एक बाइट पैडिंग की आवश्यकता होती है, इसलिए एन्क्रिप्टेड मान का आकार 16 का अगला गुणक होगा। इसलिए, यदि आपका मूल डेटा 30 बाइट्स है, तो आपका एन्क्रिप्टेड डेटा 32 बाइट्स होगा। यदि आपका मूल डेटा 32 बाइट्स है, तो आपका एन्क्रिप्टेड डेटा 48 बाइट्स होगा (चूंकि एईएस को कम से कम एक बाइट पैडिंग की आवश्यकता होती है, आपके 32 बाइट्स 33 हो जाते हैं, और फिर वह 16 से 48 के अगले गुणक तक चला जाता है)। इसके लिए सूत्र होगा x + 16 - (x MOD 16)
. तो, 30 बाइट्स के लिए आपको 30 + 16 - (30 MOD 16) = 32
. मिलता है ।
एन्क्रिप्टेड मान के आकार की गणना करते समय, ध्यान रखें कि एन्क्रिप्ट किए जा रहे डेटा को पहले क्रमबद्ध किया जाता है। इसलिए, उदाहरण के लिए, यदि आप किसी सामाजिक सुरक्षा नंबर को एन्क्रिप्ट कर रहे हैं, तो सादा मान केवल 9 वर्णों का है, लेकिन क्रमबद्ध मान वास्तव में 16 वर्णों का है (s:9:"xxxxxxxxx";
) चूंकि क्रमबद्ध मान वह है जो वास्तव में एन्क्रिप्ट किया गया है, और यह 16 बाइट्स है, एन्क्रिप्टेड मान का आकार 32 बाइट्स होगा (16 + 16 - (16 MOD 16) = 32
)।
इसके अलावा, openssl_encrypt
फ़ंक्शन एन्क्रिप्टेड डेटा पहले से ही बेस 64 एन्कोडेड देता है। बेस 64 एन्कोडिंग मान के आकार को लगभग 4/3 बढ़ा देता है। मूल डेटा में प्रत्येक 3 बाइट्स के लिए, बेस 64 एन्कोडिंग 4 बाइट (वर्ण) प्रतिनिधित्व उत्पन्न करेगा। तो, एसएसएन उदाहरण के लिए, एन्क्रिप्टेड परिणाम 32 बाइट्स है। बेस 64 में अनुवाद करते समय, 32 बाइट्स हमें (32 / 3) = 10.6
. देता है 3 बाइट खंड। चूंकि बेस 64 पैड अगले बाइट में हैं, इसलिए सीलिंग लें, और 4 से गुणा करें, जो 11 * 4 = 44
देता है। बाइट्स। तो, हमारा मूल 32 बाइट एन्क्रिप्टेड मान 44 वर्ण स्ट्रिंग बन जाता है। यदि आपको इसके लिए एक सूत्र की आवश्यकता है, तो आप (x + 2 - ((x + 2) MOD 3)) / 3 * 4
का उपयोग कर सकते हैं। . तो, (32 + 2 - ((32 + 2) MOD 3)) / 3 * 4 = 44
।
सूचना का अगला भाग मैक है। MAC एक SHA256 हैशेड मान है, इसलिए हम जानते हैं कि यह 64 वर्णों का होगा।
सूचना का अंतिम भाग IV है। सादा IV 16 यादृच्छिक बाइट्स है। पेलोड सरणी में संग्रहीत IV सादा IV का बेस 64 एन्कोडेड मान है। तो, हम बेस 64 एन्कोडेड IV के आकार की गणना करने के लिए उपरोक्त सूत्र का उपयोग कर सकते हैं:(16 + 2 - ((16 + 2) MOD 3)) / 3 * 4 = 24
।
इन तीन सूचनाओं को एक सरणी में संकलित किया जाता है, और फिर json_encoded। जेसन प्रतिनिधित्व और सरणी में मानों के नाम के कारण, यह एक और 29 बाइट्स जोड़ता है।
इसके अतिरिक्त, Laravel <7.0.8 में, बेस 64 एन्कोडेड डेटा में कोई भी फ़ॉरवर्ड स्लैश जोंस स्ट्रिंग में बैकस्लैश के साथ बच जाते हैं, इसलिए यह कितने फ़ॉरवर्ड स्लैश मौजूद हैं, इसके आधार पर बाइट्स की एक चर संख्या जोड़ता है। SSN उदाहरण के लिए, बेस 64 एन्कोडेड डेटा के 68 वर्ण हैं (एन्क्रिप्टेड डेटा के लिए 44, IV के लिए 24)। आइए मान लें कि फॉरवर्ड स्लैश की अधिकतम संख्या शायद परिणामों का लगभग 1/3 या लगभग 23 अतिरिक्त बाइट्स है। Laravel>=7.0.8 में, ये फ़ॉरवर्ड स्लैश बच नहीं गए हैं, इसलिए कोई अतिरिक्त बाइट नहीं हैं।
अंत में, यह json_encoded मान base64_encoded है, जो फिर से आकार को लगभग 4/3 के कारक से बढ़ा देगा।
तो, यह सब एक साथ रखने के लिए, आइए फिर से कल्पना करें कि आप एक सामाजिक सुरक्षा नंबर एन्क्रिप्ट कर रहे हैं। openssl_encrypt
परिणाम 44 वर्णों का होगा, MAC 64 वर्ण का होगा, IV 24 वर्ण का होगा, और json प्रतिनिधित्व अन्य 29 वर्ण जोड़ता है।
लारवेल <7.0.8 में, अतिरिक्त 23 वर्णों का बफर भी है। यह हमें देता है (44 + 64 + 24 + 29 + 23 = 184
) पात्र। यह परिणाम बेस 64 एन्कोडेड हो जाता है, जो हमें देता है ((184 + 2 - ((184 + 2) MOD 3)) / 3 * 4 = 248
) वर्ण।
Laravel>=7.0.8 में, कोई अतिरिक्त बफर नहीं है। यह हमें देता है (44 + 64 + 24 + 29 = 161
) पात्र। यह परिणाम बेस 64 एन्कोडेड हो जाता है, जो हमें देता है ((161 + 2 - ((161 + 2) MOD 3)) / 3 * 4 = 216
) वर्ण।