PHP

Хэш

Хэш, хэширование (от английского hashing) - один из способов преобразования, кодирования входящих данных, разной длины. На выходе выдаётся битовая строка. Это принцип, но способы и сложность функций выдающих хэш разнообразны. Хэш называют отпечаток файла . Нет 100% гарантии того, что хэш у всех файлов разный, но степень совпадения ничтожно мала. Поэтому, если hash, у одного и того же файла разница, через промежуток времени, можно с большей уверенностью сказать, что он был изменён.
В данном уроке мы используем функцию PHP md5_file , которая чаще всего применяется для снятия отпечатка.
Синтаксис функции:
string md5_file (string filename)

Функция в качестве аргумента получает имя файла или путь до него и выдаёт строку хэш кода на выходе.

Листинг № 1 - Сравнение хэша файлов.

<style>
h1{
	color:#036;
	font-size:1.2em;
	font-family: Georgia, "Times New Roman", Times, serif;
	font-weight: lighter;
	}
legend{
	color: #036;
	font-family: Tahoma, Geneva, sans-serif;
	font-size: 0.9em;
	margin-right: 10px;
	margin-left: 10px;
}
fieldset{
	width: 500px;
	border: 1px solid #036;
	margin: 40px;
	padding-top: 15px;
	padding-right: 15px;
	padding-bottom: 15px;
	padding-left: 25px;
}
.red{
	color:#F33;
	font-family: Tahoma, Geneva, sans-serif;
	font-size: 1em;
	font-weight: bolder;
	}
.green{
	color:#090;
	font-family: Tahoma, Geneva, sans-serif;
	font-size: 1em;
	font-weight: bolder;
	}
#button{
	height: 22px;
	border: 1px solid #CCC;
	background-color: #FFF;
	width: 198px;
	}
#fileField{
	height: 22px;
	border: 1px none #CCC;
	background-color: #FFC;
	color: #F39;
	padding-left: 3px;
	}
</style>


<?php
$as = "Вставьте хэш для сравнения";

// Очищаем директория от файлов  
// Текущий каталог.
$dir = ".";
// Если каталог успешно открыт...
if ($dh = opendir($dir))
{
        // ... считываем содержимое в переменную $file.
        while (($file = readdir($dh)) !== false) 
        {
            // Если это файл и он не index.php
            if(is_file($file) && ($file != "index.php") )
            {
                // ...удаляем его.
                unlink("$file");
            }
        }
        // Закрываем директорию.
        closedir($dh); 
}

if($_POST['button'] == "Узнать ХЭШ" && !empty($_FILES["filename"]["name"]))
{
    $hash = htmlspecialchars($_POST['hash']); // получаем исходный хэш из формы
    if(!empty($hash) && $hash != $as)
    {
       $as = $hash;    
    }
    if($_FILES["filename"]["size"] < 1024*2*1024)
    {
        if (copy($_FILES["filename"]["tmp_name"], "../hash/".$_FILES["filename"]["name"]))
        {
            $rz = "Размер файла: ".round( (($_FILES["filename"]["size"]/1024)/1024),3)." МБ";
            $q = md5_file("../hash/".$_FILES["filename"]["name"]);
            if($hash !== $q)
            {
                   $q =  "<div class='red'>". $q."</div>";
            }
        } 
        else
        {
            echo "Ошибка загрузки файла: " . $_FILES['filen']['name'];
        }
    }
    else
    {
       $rz = "Ошибка. Файл превышает 2МБ";    
    }
}
?>

<fieldset>
  <legend>Проверить файл до 2МБ</legend>
  <h1>Хэш файла</h1>

<?php
   echo $rz;
   echo "<div class='green'>".$q . "</div><br>";
?>

<form name="form1" enctype="multipart/form-data" method="post" action="">

    <input type="text" name="hash" id="fileField" size="50%" value="

<?php echo $as;?>

">
<br>
<br>
<input name="filename" type="file" id="fileField" size="50%">
<br>
<br>
<input type="submit" name="button2" id="button" value="Очистить">
 <input type="submit" name="button" id="button" value="Узнать ХЭШ">
</form>
</fieldset>


Принцип работы программы следующий.

Вы выбираете файл на своём компьютере, который нужно проверить на соответствие хэш коду полученному с этим же файлом.
В строку где написано "Вставьте хэш для сравнения", вводите соответственно проверочный код, т.е. присланный вместе с файлом.
Нажимаете кнопку "Узнать ХЭШ".
Если файл не менялся то получите зелёный хэш код, в противном случаи он будет красный.

Хочу отметить, что проверять следует хэш закодированный таким же способом, т.е. с помощью алгоритма md5 - это важно!
Этот код проверяет файлы весом не более 2МБ.Этот код проверяет файлы весом не более 2МБ.Этот код проверяет файлы весом не более 2МБ. Если требуется проверить больше этого объёма, надо править немного код. Строку ["size"] < 1024*2*1024 двойку между звёздочек исправить на сколько мегабайт вам надо. Плюс к этому, обязательно нужно на сервере (я использую Apache) изменить директивы отвечающие за размер обработки файлов (post_max_size и upload_max_filesize). Прописать им в байтах сколько можно обрабатывать. Иногда следует увеличить время обработки скрипта на сервере, по умолчанию оно равно 30 сек (apache). Ну и в заключение, все эти директивы находятся в конфигурационном файле httpd.conf. Кто использует Denwer, путь такой: usrlocalapacheconfhttpd.conf
Скачать программу проверки хэш файла можно здесь.
Установка приложения.

Распаковать архив в корень сайта.
Затем в адресной строке наберите URL http://домен вашего сайта/hesh/
Откроется приложение.
Пользуйтесь на здоровье.
Добавлено: 14 Августа 2013 09:01:06 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...