हैश का निरूपण उसके पाठ को फिर एन्कोड करने से अलग है

SHA-256 परिणाम 256 बिट यानी 32 बाइट है। RFC 4648 का Base16 हर बाइट को दो हेक्साडेसिमल अंकों से दिखाता है, इसलिए 64 अक्षर बनते हैं। पैडिंग वाला मानक Base64 उन्हीं 32 बाइट को 44 अक्षरों में दिखाता है। लेकिन 64-अक्षर की हेक्स स्ट्रिंग को UTF-8 पाठ के रूप में एन्कोड करने पर इनपुट 64 बाइट और परिणाम 88 Base64 अक्षर होते हैं। यह परिणाम हैश दिखाने वाले पाठ का एन्कोडिंग है, कच्चे हैश बाइट का नहीं।

कच्चा हैश: 32 बाइट से 44 Base64 अक्षर; HEX पाठ: 64 बाइट से 88 अक्षर
स्वयं बनाया बाइट प्रवाह आरेख। A कच्चे हैश बाइट हैं; B 64-अक्षर HEX पाठ है। Base64 की 44 और 88 संख्या में पैडिंग शामिल है।

RFC 6234: SHA-256 digest size

RFC 4648 §4, §8: Base64 / Base16

टूल इस्तेमाल करने से पहले इनपुट जाँचें

हमने abc का SHA-256 निकाला और दोनों रास्ते कोड में दोहराए। Moyoutil का हैश टूल हेक्साडेसिमल पाठ देता है। इसे Base64 टूल में चिपकाने पर पाठ के UTF-8 बाइट एन्कोड होते हैं और 88 अक्षर मिलते हैं। यह टूल HEX को कच्चे हैश बाइट नहीं मानता। अलग Web Crypto उदाहरण बाइट और HEX पाठ का अंतर तथा दोनों लंबाइयाँ दिखाता है।

const raw = new Uint8Array(await crypto.subtle.digest(
  'SHA-256', new TextEncoder().encode('abc')));
const hex = Array.from(raw,
  n => n.toString(16).padStart(2, '0')).join('');
const rawBase64 = btoa(String.fromCharCode(...raw));
const textBase64 = btoa(hex); // ASCII HEX text
console.log(raw.length, hex.length,
            rawBase64.length, textBase64.length);
// 32 64 44 88

प्राप्त करने वाले सिस्टम के दस्तावेज़ में आवश्यक निरूपण जाँचें। Base64 या Base64url, पैडिंग और एन्कोड होने वाला डेटा अलग शर्तें हैं। सही स्ट्रिंग लंबाई से समान चेकसम सिद्ध नहीं होता। यह लेख निरूपण बदलना समझाता है, हस्ताक्षर सत्यापन या फ़ाइल की सुरक्षा का निर्णय नहीं देता।

अक्सर पूछे जाने वाले प्रश्न

क्या Base64 में बदलना हैश फिर से निकालना है?

नहीं। कच्चे हैश बाइट एन्कोड करने से निरूपण बदलता है। HEX पाठ एन्कोड करने में इनपुट डेटा अलग है। दोनों को मूल डेटा का SHA-256 फिर से निकालने से अलग रखें।