2010-02-19 11 views
5

Supongamos que quiere crear un sitio de alojamiento de archivos para que las personas carguen sus archivos y envíen un enlace a sus amigos para recuperarlo más adelante y desea asegurarse de que los archivos estén duplicados donde los almacenamos, es un archivo sha1_file de PHP. suficiente para la tarea? ¿Hay alguna razón para no usar md5_file en su lugar?¿Es SHA suficiente para verificar la duplicación de archivos? (sha1_file en PHP)

Para la interfaz, se oscurecerá utilizando el almacén de nombre de archivo original en una base de datos, pero algunas preocupaciones adicionales serían si esto revela algo sobre el cartel original. ¿Un archivo hereda alguna metainformación como la última modificación o quién la publicó o está basada en el sistema de archivos?

Además, ¿está usando una sal frívola ya que la seguridad en cuanto a ataque de tabla arcoíris no significa nada para esto y el hash podría usarse más tarde como una suma de comprobación?

Una última cosa, la escalabilidad? inicialmente, solo se usará para archivos pequeños un par de megas grandes pero finalmente ...

Edición 1: El objetivo del hash es principalmente evitar la duplicación de archivos, no crear oscuridad.

Respuesta

0

Ambos deberían estar bien. sha1 es una función hash más segura que md5, lo que también significa que es más lenta, lo que probablemente significa que debes usar md5 :). Todavía desea utilizar sal para evitar ataques de texto sin formato/arcoiris en el caso de archivos muy pequeños (no haga suposiciones sobre qué personas deciden cargar en su sitio). La diferencia de rendimiento será insignificante. Todavía puede usarlo como una suma de comprobación siempre que sepa la sal.

Con respecto a la escalabilidad, supongo que es probable que vayas a estar vinculado a IO, no a CPU, por lo que no creo que el cálculo de la suma de comprobación te dé una gran sobrecarga, especialmente. si lo haces en la transmisión mientras se está cargando.

+0

No - aunque el algoritmo sha1 es más complejo/tiene un orden superior, la implementación real en PHP crea hashes sha1 marginalmente más rápido que md5 (al menos la última vez que verifiqué en PHP 5.1 o algo así) – symcbean

+0

@symcbean eres probablemente sea cierto, no sé detalles de PHP. – ykaganovich

1

SHA debería funcionar perfectamente en cualquier entorno "normal". Aunque esto es lo que Ben Lynn - el autor de "Git Magic" tiene que decir:

A.1. SHA1 Debilidades A medida que pasa el tiempo, los criptógrafos descubren cada vez más debilidades SHA1 . Ya es posible encontrar colisiones hash para organizaciones bien financiadas. Dentro de años, tal vez incluso una PC típica tendrá tiene potencia de cómputo suficiente para corromper silenciosamente un repositorio de Git. Con suerte, Git migrará a una mejor función hash antes de que la investigación destruya SHA1.

Siempre puede verificar SHA256, u otros que son aún más largos. Encontrar una colisión MD5 es más fácil que con SHA1.

2

Según mi comentario sobre la respuesta de @ ykaganovich, SHA1 es (sorprendentemente) ligeramente más rápido que MD5.

Según su descripción del problema, no está tratando de crear un hash seguro, simplemente ocultar el archivo en un espacio de nombres grande, en cuyo caso el uso de una tabla salt/rainbow es irrelevante; la única consideración es la probabilidad de una colisión falsa (donde 2 archivos diferentes dan el mismo hash). La probabilidad de que esto ocurra con md5 es muy, muy remota. Es aún más remoto con sha1. Sin embargo, debe pensar en qué sucede cuando 2 usuarios independientes cargan el mismo warez en su sitio. ¿A quién pertenece el archivo?

De hecho, no parece haber ninguna razón para usar un hash, solo genere un valor aleatorio suficientemente largo.

+0

Supuse que el beneficio adicional de una suma de comprobación garantiza el hash? – wag2639

+0

+1 buen punto, simplemente haz un valor aleatorio :) Si quieres una suma de comprobación, usa CRC, aunque no está claro por qué se necesita una suma de comprobación. – ykaganovich

+0

Quería evitar archivos duplicados. Voy a tener una tabla sql para asociar propietarios con archivos. – wag2639

1

sha1_file lo suficientemente bueno?

El uso de sha1_file es más que suficiente, hay una posibilidad muy pequeña de colisión, pero eso casi nunca ocurrirá. Para reducir la probabilidad de casi el 0 comparar los tamaños de archivo demasiado:

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 es más rápido que sha1 pero genera la producción menos único, la posibilidad de colisión cuando se utiliza MD5 es todavía muy pequeño pensamiento.

escalabilidad?

Hay varios métodos para comparar archivos, el método a utilizar depende de cuáles son sus problemas de rendimiento son, hice pequeña prueba en diferentes métodos:

1- directa de archivos comparar:

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

Los resultados: 2 archivos 1,2 MB cada uno se compararon 100 veces, me dieron los siguientes resultados:

-------------------------------------------------------- 
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 3.7 fue el más rápido más rápido que sha1 , pero no es eficiente en la memoria.

sha1_file y md5_file son eficiente de la memoria, se utilizan aproximadamente 5% de la memoria utilizada por file_get_contents.

md5_file podría ser una mejor opción porque es un poco más rápido que sha1.

Por lo tanto, la conclusión es que depende, si desea una comparación más rápida, o menos uso de memoria.

Cuestiones relacionadas