Достаточно ли SHA для проверки дублирования файлов? (sha1_file в PHP) - PullRequest
6 голосов
/ 19 февраля 2010

Предположим, что вы хотите создать сайт для размещения файлов, чтобы люди могли загружать их файлы и отправлять ссылку своим друзьям, чтобы позже их найти, и вы хотите убедиться, что файлы дублируются там, где мы их храним, - достаточно ли PHP sha1_file для задачи ? Есть ли причина не использовать вместо этого md5_file?

Что касается внешнего интерфейса, он будет скрыт, используя исходное хранилище имен файлов в базе данных, но некоторые дополнительные проблемы могут возникнуть, если это покажет что-нибудь об исходном плакате. Унаследует ли файл какую-либо мета-информацию с ним, как в последний раз измененную, или кто ее опубликовал, или этот материал основан на файловой системе?

Кроме того, является ли использование соли несерьезным, поскольку безопасность в отношении атаки на радужном столе ничего не значит для этого, и хэш может позже использоваться в качестве контрольной суммы?

Последнее, масштабируемость? Первоначально, он будет использоваться только для маленьких файлов пару мегабайт, но в конечном итоге ...

Редактировать 1: Основная цель хэша - избежать дублирования файлов, а не создавать затенение.

Ответы [ 4 ]

4 голосов
/ 08 ноября 2015

достаточно ли 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) )

Результаты: 2 файла по 1,2 МБ каждый сравнивали 100 раз, я получил следующие результаты:

--------------------------------------------------------
 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 быстрее, чем sha1, но это не эффективно с памятью.

Sha1_file и md5_file эффективно используют память, они используют около 5% памяти, используемой file_get_contents.

md5_file может быть лучшим вариантом, потому что он немного быстрее, чем sha1.

Таким образом, вывод состоит в том, что все зависит от того, хотите ли вы сравнить быстрее или использовать меньше памяти.

3 голосов
/ 19 февраля 2010

Согласно моему комментарию к ответу @ ykaganovich, SHA1 (на удивление) немного быстрее, чем MD5.

Из вашего описания проблемы вы не пытаетесь создать безопасный хеш - просто скрываете файлбольшое пространство имен - в этом случае использование таблиц соль / радуга не имеет значения - единственное соображение - это вероятность ложного столкновения (где 2 разных файла дают одинаковый хэш).Вероятность этого с md5 очень и очень мала.Это еще более отдаленно с sha1.Однако вам нужно подумать о том, что происходит, когда 2 независимых пользователя загружают один и тот же товар на ваш сайт.Кому принадлежит файл?

На самом деле, похоже, нет никакой причины использовать хеш - просто сгенерируйте достаточно длинное случайное значение.

2 голосов
/ 19 февраля 2010

SHA должен нормально работать в любой "нормальной" среде. Хотя это то, что Бен Линн - автор «Git Magic» должен сказать:

A.1. Слабые стороны SHA1 Со временем криптографы обнаруживают все больше и больше SHA1 недостатки. Уже, находя хеш столкновения осуществимы для хорошо финансируемых организаций. В лет, возможно, даже типичный ПК будет иметь достаточно вычислительной мощности, чтобы молча испортить Git-репозиторий. Надеюсь, что Git перейдет к лучшей хэш-функции, прежде чем дальше исследование уничтожает SHA1.

Вы всегда можете проверить SHA256 или другие, которые еще длиннее. Обнаружение столкновения MD5 легче, чем с SHA1.

0 голосов
/ 19 февраля 2010

Оба должны быть в порядке.sha1 - более безопасная хеш-функция, чем md5, что также означает, что она медленнее, что, вероятно, означает, что вы должны использовать md5 :).Вы по-прежнему хотите использовать соль, чтобы предотвратить атаки открытого текста или радуги в случае очень маленьких файлов (не делайте предположений о том, что люди решили загрузить на ваш сайт).Разница в производительности будет незначительной.Вы все еще можете использовать его в качестве контрольной суммы, пока знаете соль.

Что касается масштабируемости, я бы предположил, что вы, скорее всего, будете связаны с IO, а не с CPU, поэтомуне думайте, что вычисление контрольной суммы принесло бы вам большие накладные расходы, особенноесли вы делаете это в потоке во время загрузки.

...