मैं सर्वर और क्लाइंट कंप्यूटर के बीच फ़ाइल की सामग्री को सत्यापित करने के लिए एक बाइनरी फ़ाइल (FLV/f4v, आदि) का चेकसम बनाने की कोशिश कर रहा हूं। क्लाइंट कंप्यूटर पर चल रहा एप्लिकेशन पाइथन-आधारित है, जबकि सर्वर PHP का उपयोग कर रहा है।एमडी 5 हैश विसंगति?
$fh = fopen($filepath, 'rb');
$contents = fread($fh, filesize($filepath));
$checksum = md5(base64_encode($contents));
fclose($fh);
अजगर कोड इस प्रकार है:: इस प्रकार
PHP कोड है
def _get_md5(filepath):
fh = open(filepath, 'rb')
md5 = hashlib.md5()
md5.update(f.read().encode('base64'))
checksum = md5.hexdigest()
f.close()
return checksum
विशेष फ़ाइल मैं परीक्षण कर रहा हूँ पर
, PHP और अजगर MD5 हैश तार इस प्रकार हैं, क्रमश:
cfad0d835eb88e5342e843402cc42764
0a96e9cc3bb0354d783dfcb729248ce0
सर्वर सेंटोस चला रहा है, जबकि क्लाइंट एक मैकोज़क्स वातावरण है। मैं यह समझने में किसी भी मदद की सराहना करता हूं कि दोनों अलग हैंश परिणाम क्यों उत्पन्न कर रहे हैं, या अगर मैंने इसे अनदेखा किया है (मैं पाइथन के लिए अपेक्षाकृत नया हूं ...)। धन्यवाद!
[पोस्ट मॉर्टम: समस्या अंततः पायथन और PHP की बेस 64 एन्कोडिंग किस्मों के बीच का अंतर था। एमडी 5 दो स्क्रिप्टिंग प्लेटफॉर्म (कम से कम .hexdigest() का उपयोग पाइथन में करता है)।]
मुझे पूरा यकीन है कि फाइल का बेस 64 प्रतिनिधित्व अलग है, एमडी 5 एल्गोरिदम नहीं, क्या आप इसे देख सकते हैं? – htf
बेस 64 के साथ परेशान क्यों है? क्यों कच्चे बाइनरी md5 नहीं? –
किसी भी कारण से आप बेस 64-एन्कोडिंग फ़ाइल की सामग्री पहले कर रहे हैं? एमडी 5 कार्य खुशी से कच्चे बाइनरी डेटा पर भी चले जाएंगे। जैसा कि एचटीएफ सुझाव देता है, समीकरण से बेस 64 हटाएं और देखें कि क्या होता है। यदि, किसी भी कारण से, पायथन और PHP लाइन बेस 64 डेटा (जैसे ईमेल सम्मिलन के लिए) को लपेटती है, और एक अलग लपेट बिंदु चुना है, जो हैश को फेंक देगा और आप कभी नहीं जानते क्योंकि आप बेस 64 आउटपुट की जांच नहीं कर रहे हैं समानता के लिए पहले। –