2010-02-19 15 views
5

मान लीजिए कि आप लोगों के लिए अपनी फाइल अपलोड करने के लिए एक फ़ाइल होस्टिंग साइट बनाना चाहते हैं और बाद में इसे पुनर्प्राप्त करने के लिए अपने दोस्तों को एक लिंक भेजना चाहते हैं और आप बीमा करना चाहते हैं कि फाइलें डुप्लिकेट की गई हैं जहां हम उन्हें स्टोर करते हैं, PHP का sha1_file अच्छा है कार्य के लिए पर्याप्त है? क्या इसके बजाय md5_file का उपयोग करने का कोई कारण नहीं है?क्या एसएचए फाइल डुप्लिकेशन की जांच के लिए पर्याप्त है? (PHP में sha1_file)

फ्रंटेंड के लिए, यह डेटाबेस में मूल फ़ाइल नाम स्टोर का उपयोग करके अस्पष्ट हो जाएगा, लेकिन कुछ अतिरिक्त चिंताएं होंगी यदि यह मूल पोस्टर के बारे में कुछ भी प्रकट करेगी। क्या किसी फ़ाइल को इसके साथ किसी भी मेटा जानकारी का उत्तराधिकारी मिलता है जैसे अंतिम संशोधित या इसे पोस्ट किया गया या यह सामग्री फाइल सिस्टम में आधारित है?

इसके अलावा, इंद्रधनुष तालिका हमले के संबंध में सुरक्षा के बाद से नमक बेकार का उपयोग कर रहा है इसका मतलब कुछ भी नहीं है और हैश को बाद में चेकसम के रूप में उपयोग किया जा सकता है?

एक आखिरी बात, मापनीयता? शुरुआत में, यह केवल छोटी फाइलों के लिए उपयोग किया जा रहा है, लेकिन कुछ ...

संपादित करें 1: हैश का बिंदु प्राथमिक रूप से फ़ाइल डुप्लिकेशन से बचने के लिए है, न कि अस्पष्टता पैदा करने के लिए।

उत्तर

0

दोनों ठीक होना चाहिए। sha1 md5 की तुलना में एक सुरक्षित हैश फ़ंक्शन है, जिसका अर्थ है कि यह धीमा है, जिसका शायद मतलब है कि आपको md5 का उपयोग करना चाहिए :)। आप अभी भी बहुत छोटी फाइलों के मामले में सादे टेक्स्ट/इंद्रधनुष हमलों को रोकने के लिए नमक का उपयोग करना चाहते हैं (लोगों को आपकी साइट पर अपलोड करने का निर्णय लेने के बारे में धारणा न करें)। प्रदर्शन अंतर नगण्य होगा। जब तक आप नमक को जानते हैं तब भी आप इसे चेकसम के रूप में उपयोग कर सकते हैं।

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

+0

नहीं - हालांकि sha1 एल्गोरिदम अधिक जटिल है/उच्च आदेश है, PHP में वास्तविक कार्यान्वयन sha1 हैश बनाता है md5 से कम से कम तेज़ है (कम से कम पिछली बार जब मैंने PHP 5.1 या कुछ पर चेक किया था) – symcbean

+0

@symcbean आप हैं शायद सही, मैं PHP विनिर्देशों को नहीं जानता। – ykaganovich

1

SHA को किसी भी "सामान्य" वातावरण में ठीक करना चाहिए। यद्यपि बेन लिन - "गिट मैजिक" के लेखक को यह कहना है:

ए .1। SHA1 कमजोरियों समय बीतने के बाद, क्रिप्टोग्राफ़रों को अधिक से अधिक SHA1 कमजोरियों की खोज होती है। पहले से ही हैश टकराव अच्छी तरह से वित्त पोषित संगठनों के लिए व्यवहार्य है। वर्षों के भीतर, शायद एक सामान्य पीसी भी को गिट रिपोजिटरी को चुपचाप भ्रष्ट करने के लिए पर्याप्त कंप्यूटिंग पावर है। आशा है कि गिट आगे अनुसंधान से पहले एक बेहतर हैश फ़ंक्शन में माइग्रेट करेगा SHA1 को नष्ट कर देगा।

आप हमेशा SHA256, या अन्य जो अब भी लंबे समय तक जांच सकते हैं। एसएचए 1 के मुकाबले एमडी 5 टक्कर ढूँढना आसान है।

2

@ ykaganovich के उत्तर पर मेरी टिप्पणी के अनुसार, SHA1 (आश्चर्यजनक रूप से) MD5 से थोड़ा तेज है।

समस्या के आपके विवरण से, आप एक सुरक्षित हैश बनाने की कोशिश नहीं कर रहे हैं - केवल एक बड़े नामस्थान में फ़ाइल को छुपाएं - इस मामले में नमक/इंद्रधनुष तालिकाओं का उपयोग अप्रासंगिक है - केवल विचार ही संभावना है एक झूठी टक्कर (जहां 2 अलग-अलग फाइलें एक ही हैश देती हैं)। एमडी 5 के साथ ऐसा होने की संभावना बहुत ही दूरस्थ है। यह sha1 के साथ और भी दूरस्थ है। हालांकि आपको यह सोचने की ज़रूरत है कि क्या होता है जब 2 स्वतंत्र उपयोगकर्ता आपकी साइट पर वही वेयरज़ अपलोड करते हैं। फाइल का मालिक कौन है?

असल में, हैश का उपयोग करने के लिए कोई कारण नहीं लगता है - बस पर्याप्त लंबे यादृच्छिक मूल्य उत्पन्न करें।

+0

मुझे लगता है कि चेकसम के अतिरिक्त लाभ हैश वारंट करता है? – wag2639

+0

+1 अच्छा बिंदु, बस एक यादृच्छिक मूल्य करें :) यदि आप चेकसम चाहते हैं, तो सीआरसी का उपयोग करें, हालांकि यह स्पष्ट नहीं है कि चेकसम की आवश्यकता क्यों है। – ykaganovich

+0

मैं डुप्लिकेट फ़ाइलों से बचना चाहता था। मैं फ़ाइलों के साथ मालिकों को जोड़ने के लिए एक एसक्यूएल टेबल होने जा रहा हूँ। – wag2639

1

sha1_file काफी अच्छा है?

sha1_file का उपयोग करना काफी अधिक है, टक्कर का एक बहुत छोटा मौका है, लेकिन यह लगभग कभी नहीं होगा। संभावना को कम करने के लिए लगभग 0 फ़ाइल तुलना करने के लिए भी आकार:

function is_duplicate_file($file1, $file2) 
{ 
    if(filesize($file1) !== filesize($file2)) return false; 

    if(sha1_file($file1) == sha1_file($file2)) return true; 

    return false; 
} 

md5 SHA1 की तुलना में तेजी है, लेकिन इसे कम अद्वितीय उत्पादन, टकराव की संभावना को जब md5 का उपयोग कर अभी भी बहुत छोटा सोचा है उत्पन्न करता है।

स्केलेबिलिटी?

1- डायरेक्ट फ़ाइल तुलना:

हैं फ़ाइलों की तुलना करने के है, जो विधि का उपयोग करने के लिए कई तरीके हैं कि आपके प्रदर्शन चिंताएं हैं, मैं अलग अलग तरीकों पर छोटे से परीक्षण किए गए पर निर्भर करती है

if(file_get_contents($file1) != file_get_contents($file2)) 

2- Sha1_file

if(sha1_file($file1) != sha1_file($file2)) 

3 md5_file

if(md5_file($file1) != md5_file($file2)) 

परिणाम:

-------------------------------------------------------- 
method     time(s)   peak memory 
-------------------------------------------------------- 
file_get_contents   0.5    2,721,576 
sha1_file     1.86    142,960 
mdf5_file     1.6    142,848 

file_get_contents तेजी SHA1 से सबसे तेजी से 3.7 था: 2 फ़ाइलें 1.2MB प्रत्येक 100 बार की तुलना में कर रहे थे, मैं निम्नलिखित परिणाम मिला , लेकिन यह स्मृति कुशल नहीं है।

Sha1_file और md5_file स्मृति कुशल हैं, उन्होंने file_get_contents द्वारा उपयोग की जाने वाली स्मृति का लगभग 5% उपयोग किया।

md5_file एक बेहतर विकल्प हो सकता है क्योंकि यह sha1 से थोड़ा तेज है।

तो निष्कर्ष यह है कि यह निर्भर करता है, यदि आप तेजी से तुलना करना चाहते हैं, या कम स्मृति उपयोग चाहते हैं।