2010-02-19 5 views
5

Supponiamo di voler creare un sito di hosting di file per caricare i propri file e inviare un link ai loro amici per recuperarlo in un secondo momento e si vuole assicurare che i file siano duplicati dove li archiviamo, è il file sha1_file di PHP abbastanza per il compito? C'è qualche ragione per non usare invece md5_file?SHA è sufficiente per controllare la duplicazione dei file? (sha1_file in PHP)

Per il frontend, verrà oscurato utilizzando l'archivio del nome file originale in un database ma alcuni ulteriori dubbi sarebbero se questo rivelasse qualcosa sul poster originale. Un file eredita qualsiasi meta informazione con esso come ultima modifica o chi lo ha pubblicato o è basato sul file system?

Inoltre, sta usando un sale frivolo in quanto la sicurezza in relazione all'attacco con tavolo arcobaleno non significa nulla per questo e l'hash potrebbe essere utilizzato successivamente come checksum?

Un'ultima cosa, scalabilità? inizialmente, verrà utilizzato solo per i file di piccole dimensioni un paio di meg grande ma alla fine ...

Modifica 1: Il punto dell'hash è principalmente per evitare la duplicazione dei file, non per creare l'oscurità.

risposta

0

Entrambi dovrebbero andare bene. sha1 è una funzione di hash più sicura di md5, il che significa anche che è più lento, il che probabilmente significa che dovresti usare md5 :). Continuare a utilizzare salt per impedire attacchi di testo normale/arcobaleno in caso di file molto piccoli (non fare ipotesi su ciò che le persone decidono di caricare sul proprio sito). La differenza di prestazioni sarà trascurabile. Puoi ancora usarlo come checksum se conosci il sale.

Per quanto riguarda la scalabilità, direi che probabilmente sarà legato all'IO, non alla CPU, quindi non penso che il calcolo del checksum ti possa dare un grande sovraccarico, esp. se lo fai nello stream mentre viene caricato.

+0

No, anche se l'algoritmo sha1 è più complesso/ha un ordine superiore, l'effettiva implementazione in PHP crea sha1 shade leggermente più veloce di md5 (almeno l'ultima volta che ho controllato su PHP 5.1 o qualcosa del genere) – symcbean

+0

@symcbean sei probabilmente giusto, non conosco le specifiche PHP. – ykaganovich

1

SHA dovrebbe funzionare bene in qualsiasi ambiente "normale". Sebbene questo sia ciò che Ben Lynn - l'autore di "Git Magic" ha da dire:

A.1. Debolezze SHA1 Con il passare del tempo, i crittografi scoprono sempre più debolezze SHA1 . Già, la ricerca di hash collisioni è fattibile per le organizzazioni ben finanziate. Entro lo anni, forse anche un tipico PC sarà avere una potenza di calcolo sufficiente a corrompere silenziosamente un repository Git. Si spera che Git esegua la migrazione verso una migliore funzione di hash prima che ulteriori ricerche distruggano SHA1.

È sempre possibile controllare SHA256 o altri ancora più lunghi. Trovare la collisione MD5 è più semplice che con SHA1.

2

Come da mio commento sulla risposta di @ykaganovich, SHA1 è (sorprendentemente) leggermente più veloce di MD5.

Dalla descrizione del problema, non si sta tentando di creare un hash sicuro, ma semplicemente nascondere il file in uno spazio dei nomi di grandi dimensioni, nel qual caso l'uso di una tabella salina/arcobaleno è irrilevante - l'unica considerazione è la probabilità di una falsa collisione (dove 2 file diversi danno lo stesso hash). La probabilità che ciò accada con md5 è molto, molto remota. È ancora più remoto con Sha1. Tuttavia, devi pensare a cosa succede quando 2 utenti indipendenti caricano lo stesso warez sul tuo sito. Chi è il proprietario del file?

In effetti, non sembra esserci alcuna ragione per utilizzare un hash - basta generare un valore casuale sufficientemente lungo.

+0

Ho pensato che il vantaggio di un checksum giustificasse l'hash? – wag2639

+0

+1 buon punto, basta fare un valore casuale :) Se si desidera un checksum, utilizzare CRC, anche se non è chiaro il motivo per cui è necessario un checksum. – ykaganovich

+0

Volevo evitare i file duplicati. Avrò una tabella sql per associare i proprietari ai file. – wag2639

1

sha1_file abbastanza buono?

L'utilizzo di sha1_file è abbastanza frequente, c'è una possibilità molto piccola di collisione, ma ciò non accadrà quasi mai. Per ridurre la possibilità di quasi 0 confrontare i file di dimensioni troppo:

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 è più veloce di SHA1 ma genera output meno unico, la possibilità di collisione quando si utilizza MD5 è ancora molto piccolo pensiero.

Scalabilità?

Ci sono diversi metodi per confrontare i file, il metodo da utilizzare dipende da ciò che i tuoi problemi di prestazioni sono, ho fatto piccolo test su metodi diversi:

1- file di diretto confronto:

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)) 

I risultati: 2 file di 1,2 MB ciascuno sono stati confrontati 100 volte, ho ottenuto i seguenti risultati:

-------------------------------------------------------- 
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 stato il più veloce 3.7 più veloce di SHA1 , ma non è efficiente in termini di memoria.

Sha1_file e md5_file sono efficienti in termini di memoria, hanno utilizzato circa il 5% della memoria utilizzata da file_get_contents.

md5_file potrebbe essere un'opzione migliore perché è un po 'più veloce di sha1.

Quindi la conclusione è che dipende, se si desidera un confronto più veloce o meno utilizzo della memoria.

Problemi correlati