Как расширить хэш md5?

  • Автор темы Светлана PHP
  • Дата начала

Светлана PHP

Guest
Как расширить хэш md5?

Здравствуйте!

Вопрос. md5 выдаёт хэш в виде 32 символьного значения. Приэтом каждый символ: 0-9a-z.

Сусчествует ли механизм ассиметричного кодирования, подобный md5, при котором эти символы лежат в диапозоне от chr(0) до chr(255)?
 

SelenIT

IT-лунатик :)
AFAIK, md5 выдает хэш в виде 16 байт (очевидно, в диапозоне от chr(0) до chr(255) каждый), при выводе эти байты преобразуются в их шестнадцатеричное представление (00 - FF). В PHP5 есть опциональный параметр, позволяющий этого избежать.
С sha1 ситуация в целом аналогична, но выдаются 20 байт.
 

Светлана PHP

Guest
A! Блин! Туплю!
Спасибо!

-~{}~ 06.05.05 22:43:

Кто-нибудь поизящнее сможет?

$a = md5("value"); $a1='';
for($i=0; $i<32; $i+=2){
$a0 = hexdec($a[$i].$a[$i+1]);
$a1 .= chr($a0);}
 

Светлана PHP

Guest
век живи, как гится, век учись!.

-~{}~ 07.05.05 00:34:

Написала такую штуку: делает бэкап в виде одного файла, при этом в файл могут легко быть загнаны целые директории с файлами подкаталагами... Сжимает всё gzdeflat'om:



Допустим есть каталог сайта www с подкаталогами. Пишем в файле backup.php (который помещаем в www):
<?
include_once("compress.php"); // он такой один
$c = new Compress("emanuel"); // emanuel - это код,
//обязательный параметр, который необходимо давать как при
//архивации так и при деархивации. Суть - он должен быть
//одинаковен как в первом так и во втором случае
$c->AddDirectory("../www");
$c->Compress("../a2c-cms.myrar");
// компрессия произведена, web-сайт c бэкапирован и
// зархивирован за 2 секунды!
?>


Как разархивировать? Файл comeback.php
<?
include_once("compress.php");
$c = new Compress("emanuel");
$c->UnCompress('../a2c-cms.myrar', 'www'); // скажем, если
// папка оказалась пустой после взлома :)
// Первый аргумент - где архив, второй - куда выгружать
?>

Плюсы архиватора:
- восстанавливает права на файлы и каталоги при деархивации
- процессорное пространство (оперативная память) максимально занимаемая: список путей к файлам и каталогам + 64 килобайта. В среднем 150 Kb
- шустрый и быстрый

Кому нужно, пишите emails - скину. Спасибо всем, кто отвечает мне на мои порой тупые вопросы!
 

valyala

Новичок
Светлана, попробуйте воспользоваться программой tar для бэкапа.
Создание бэкапа:
tar -cjf ./a2c-cms.tar.bz2 ./www
Восстановление из бэкапа:
tar -xjf ./a2c-cms.tar.bz2

Если вам нужно запаролить бэкап, можно воспользоваться программой rar:
Создание запароленного бэкапа с максимальной степенью сжатия (пароль emanuel):
rar a -m5 -s -hpemanuel ./a2c-cms.rar ./www
Восстановление из бэкапа:
rar x -pemanuel ./a2c-cms.rar

Обе эти программы сохраняют права доступа к файлам и папкам.
Самый простой способ вызвать эти программы из ПХПшного скрипта - заключить вышеприведенные строчки в обратные кавычки (обычно это левая верхняя клавиша на клавиатуре):
PHP:
<?php
// создание каждодневного бэкапа папки www,
// находящейся в каталоге /var/www/a2c-cms
$root_dir = '/var/www/a2c-cms';
$backup_dir = '/var/backups/a2c-cms';

chdir($root_dir);
$date = date('Ymd');
`tar -cjf {$backup_dir}/{$date}.tar.bz2 ./www`;
?>
Светлана, а для чего вы используете функцию md5? Если для контроля целостности, то лучше воспользуйтесь функцией crc32. Она работает намного быстрее, чем md5, т.к. специально предназначена для таких задач.
 

Светлана PHP

Guest
1) В виндах тара нет.
2) Бывает так, что хостится webсайт под виндами
3) Бывает, что провайдер запрещает вызывать какие либо серверные утилиты
4) md5 используется для двух целей, и НЕ для контроля целостности.

Compressor весит 6 KB - чудо программка. Делает бэкапы в виде архивов.

<?
include_once("compressor.php");
$c = new Compressor("a2c-cms-password");
$c->AddDirectory("../www");
$c->Compress("../a2c-cms.myrar");
?>

<?
include_once("compressor.php");
$c = new Compressor("a2c-cms-password");
$c->UnCompress('../a2c-cms.myrar', 'www');
?>
 

Kelkos

Сам себе программер
Хм.. а зипом почему никто не пользуется.. есть архиватор/разархиватор на пхп. Вроде ничего скорость. да и прост в обращении примерно как работа с compressor.php.
 

Kelkos

Сам себе программер
да обычным. Есть библиотека по работе с зипами. хех. Преимущества перед Вашим самопальным compressor.php - известный формат. Можно выгружать пользователю.. пусть у себя хранит архивы.. да и вообще в хозяйстве пригодится.
 

Светлана PHP

Guest
Kelkos
Какой обычный? Нет ни одной встроенной библиотеки, которая бы позволяла тебе так просто взять всё и заархивировать... Наверное... Покажи, что ты имеешь ввиду, какие функции?
 

Kelkos

Сам себе программер
А разве я говорил про встроенную? Что то не припоминаю..
 

Светлана PHP

Guest
Так о чём ты вообще говоришь. Понкректнее можешь? Схему, твоё видение?
 

Kelkos

Сам себе программер
Свет.. ну может хватит? Я просто абсолютным тупицей себя чувствую предлагая использовать несколько классов по работе с zip вместо каких то самопальных или других решений. Ведь zip - это так знакомо обычному пользователю.
Щас поищу файлик с этими классами на винте.. я его последний раз год назад использовал. Сжимал несколько папок этими классами и выгружл юзеру. там и принимать от юзера можно архивы.. и распакоовывать можно. И всё просто и понятно. Щас.. если только найду...
 

Светлана PHP

Guest
Kelkos
У меня не стояла задача принимать что-то от пользователя. Есть задача перегонять группы файлов, модули, к примеру.

В поиске по форуму вышла на класс tar.php Но он не мог заархивировать весь сайт; он тупо грузил в себя все файлы и процесс обрывался у провайдеров, которые не выделяли достаточного пространства оперативной памяти под процесс. И директории не мог пихать в себя. И паролировать. ну и прочее прочее...

Чем твои самопальные классы лучше моего класса?
 

Kelkos

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

neko

tеam neko
под виндой есть tar
другое дело конечно, что его установить сначала нужно
а это и так будет работать
 

Светлана PHP

Guest
по-поводу 1 ссылки: возможно функционально, но мутарно

по поводу 2 ссылки: интерсует только OOП
 

valyala

Новичок
Наш ответ Чемберлену! Ой, я имел ввиду Светлану :)

Раз вы отказываетесь использовать tar и rar, вот вам библиотека archive_dir, содержащая функции archive_dir и unarchive_dir, предназначенные для создания бэкапов директорий и восстановления содержимого директорий из бэкапа. Библиотека является самодостаточной и не нуждается в дополнительных модулях. Объем - 3кб.

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

Использование:

Cоздание бэкапа директории ./www и помещение его в файл ./a2c-cms.my_bzip2
PHP:
<?php
require_once('archive_dir.php');
archive_dir('./a2c-cms.my_bzip2', './www');
?>
Восстановление директории ./www из бэкапа ./a2c-cms.my_bzip2:
PHP:
<?php
require_once('archive_dir.php');
unarchive_dir('./a2c-cms.my_bzip2', './www');
?>
А вот, собственно, и сама библиотека archive_dir.php:
PHP:
<?

function unarchive_dir($archive_file, $dst_dir)
{
    if (!is_file($archive_file)) {
	exit("cannot find arhive file [{$archive_file}]\n");
    }
    if (!is_dir($dst_dir)) {
	exit("cannot find destination directory [{$dst_dir}]\n");
    }
    
    $not_eof = 1;
    $src_fp = fopen("compress.bzip2://{$archive_file}", 'rb');
    if ($src_fp === NULL) {
	exit("cannot open archive file [{$archive_file}]\n");
    }
    while ($not_eof) {
        switch (fgetc($src_fp)) {
	case 'f' : // file
	    $file = substr(fgets($src_fp, 0x10000), 0, -1);
	    $tmp = unpack('Vsize/vmode', fread($src_fp, 6));
	    $size = $tmp['size'];
	    $mode = $tmp['mode'];
	    $filename = $dst_dir . '/' . $file;
	    $dst_fp = fopen($filename, 'wb');
	    if ($dst_fp === NULL) {
		echo "Cannot create file [${filename}]\n";
	    } else {
		copy_file_fp($src_fp, $dst_fp, $size);
	    }
	    fclose($dst_fp);
	    chmod($filename, $mode);
	    break;
	case 'd' : // directory
	    $file = substr(fgets($src_fp, 0x10000), 0, -1);
	    $dirname = $dst_dir . '/' . $file;
	    if (!is_dir($dirname)) {
	        mkdir($dirname);
	    }
	    break;
	case false : // end of file;
	    $not_eof = 0;
	    break;
	default : // error
	    exit("fatal error: unexpected char in file {$archive_file}. Expected 'f' or 'd'\n");
	    break;
	}
    }
    fclose($src_fp);
}

function archive_dir($archive_file, $src_dir)
{
    if (!is_dir($src_dir)) {
	exit("cannot find directory for archiving [{$src_dir}]\n");
    }
    if (is_file($archive_file)) {
	unlink($archive_file);
    }

    $files = get_filelist($src_dir);
    $dst_fp = fopen("compress.bzip2://{$archive_file}", 'wb');
    if ($dst_fp === NULL) {
        exit("cannot create bzip2 file [{$archive_file}]\n");
    }
    $n = sizeof($files);
    for ($i = 0; $i < $n; $i++) {
	$file = $files[$i];
	$filename = $src_dir . '/' . $file;
	if (is_dir($filename)) {
	    fwrite($dst_fp, "d{$file}\n");
	} else {
	    $src_fp = fopen($filename, 'rb');
    	    if ($src_fp === NULL) {
	        echo "Cannot open file [{$filename}]\n";
		continue;
	    }
	    $stat = stat($filename);
	    $size = $stat['size'];
	    $mode = $stat['mode'] & 0777;
            $tmp = pack('Vv', $size, $mode);
	    fwrite($dst_fp, "f{$file}\n{$tmp}");
	    copy_file_fp($src_fp, $dst_fp, $size);
	    fclose($src_fp);
	}
    }
    fclose($dst_fp);
}

function copy_file_fp($src_fp, $dst_fp, $file_size, $buffer_size = 0x10000)
{
    while (!feof($src_fp) && $file_size) {
	if ($buffer_size > $file_size) {
	    $buffer_size = $file_size;
	}
	$file_size -= fwrite($dst_fp, fread($src_fp, $buffer_size));
    }
}

function get_filelist($dir)
{
    $filelist = array();
    $dh = opendir($dir);
    if ($dh === NULL) {
	return $filelist;
    }
    while (($file = readdir($dh)) !== false) {
	if ($file == '.' || $file == '..') {
	    continue;
	}
	$filelist[] = $file;
	$filename = $dir . '/' . $file;
	if (is_dir($filename)) {
	    $tmp = get_filelist($filename);
	    $n = sizeof($tmp);
	    for ($i = 0; $i < $n; $i++) {
		$filelist[] = $file . '/' . $tmp[$i];
	    }
	}
    }
    return $filelist;
}

?>
 
Сверху