- php md5, который дает тот же результат, что и c #
- base64_encode
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 37 notes
- Php header(«Content-MD5: » . base64_encode(md5_file($filename)));
- Examples
- Related
- Php header(‘Content-MD5: ‘.base64_encode(md5_file($full_path)));
- Examples
- Related
php md5, который дает тот же результат, что и c #
У меня есть алгоритм хеширования в C #, в двух словах:
string input = "asd"; System.Security.Cryptography.MD5 alg = System.Security.Cryptography.MD5.Create(); System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); byte[] hash = alg.ComputeHash(enc.GetBytes(input)); string output = Convert.ToBase64String(hash); // outputs: eBVpbsvxyW5olLd5RW0zDg== Console.WriteLine(output);
Теперь мне нужно воспроизвести это поведение в php,
$input = "asd"; $output = HashSomething($input); echo $output;
- md5
- utf8_decode
- utf8_encode
- base64_encode
- base64_decode
- url_decode
но я заметил, что php md5 не получает == на конце … что мне не хватает?
ПРИМЕЧАНИЕ . Я не могу изменить поведение C #, потому что он уже реализован и пароли, сохраненные в моем db с помощью этого алгоритма.
Проблема в функции PHP md5() по умолчанию возвращает шестнадцатеричную вариацию хэша, где C # возвращает исходный выходной байт, который затем должен быть сделан с текстом с кодировкой base64. Если вы используете PHP5, вы можете использовать base64_encode(md5(‘asd’, true)) . Обратите внимание, что второй параметр md5() – true, что делает md5() возвращать необработанные байты вместо шестнадцатеричного.
Вы помните, что base64 кодирует хеш md5 в php?
$result = base64_encode(md5($password, true));
Второй параметр делает md5 return raw output, который аналогичен функциям, которые вы используете в C #
Ваш код C # берет байты UTF8 из строки; вычисляет md5 и сохраняет в кодировке base64. Поэтому вы должны сделать то же самое в php, что должно быть:
$hashValue = base64_encode(md5(utf8_decode($inputString)))
это должно быть как указано ниже для php
php -r "echo base64_encode(md5(utf8_encode('asd'),true));"
У меня была такая же проблема … с использованием только md5 ($ myvar) это сработало. Я получаю тот же результат C # и PHP.
Рассказ Гавина Кендалла помог мне. Надеюсь, это поможет другим.
public static string MD5Hash(string text)
base64_encode
Эта кодировка предназначена для корректной передачи бинарных данных по протоколам, не поддерживающим 8-битную передачу, например, для отправки тела письма.
Данные, закодированные base64 занимают на 33% больше места по сравнению с оригинальными данными.
Список параметров
Возвращаемые значения
Кодированные данные в виде строки.
Примеры
Пример #1 Пример использования base64_encode()
Результат выполнения данного примера:
0K3RgtC+INC30LDQutC+0LTQuNGA0L7QstCw0L3QvdCw0Y8g0YHRgtGA0L7QutCw
Смотрите также
- base64_decode() — Декодирует данные, закодированные MIME base64
- chunk_split() — Разбивает строку на фрагменты
- convert_uuencode() — Кодирует строку в формат uuencode
- » RFC 2045 раздел 6.8
User Contributed Notes 37 notes
For anyone interested in the ‘base64url’ variant encoding, you can use this pair of functions:
function base64url_encode ( $data ) <
return rtrim ( strtr ( base64_encode ( $data ), ‘+/’ , ‘-_’ ), ‘=’ );
>
function base64url_decode ( $data ) <
return base64_decode ( str_pad ( strtr ( $data , ‘-_’ , ‘+/’ ), strlen ( $data ) % 4 , ‘=’ , STR_PAD_RIGHT ));
>
?>
gutzmer at usa dot net’s ( http://php.net/manual/en/function.base64-encode.php#103849 ) base64url_decode() function doesn’t pad longer strings with ‘=’s. Here is a corrected version:
function base64url_encode ( $data ) return rtrim ( strtr ( base64_encode ( $data ), ‘+/’ , ‘-_’ ), ‘=’ );
>
function base64url_decode ( $data ) return base64_decode ( strtr ( $data , ‘-_’ , ‘+/’ ) . str_repeat ( ‘=’ , 3 — ( 3 + strlen ( $data )) % 4 ));
>
// proof
for( $i = 0 , $s = » ; $i < 24 ; ++ $i , $s .= substr ( " $i " , - 1 ))$base64_encoded = base64_encode ( $s );
$base64url_encoded = base64url_encode ( $s );
$base64url_decoded = base64url_decode ( $base64url_encoded );
$base64_restored = strtr ( $base64url_encoded , ‘-_’ , ‘+/’ )
. str_repeat ( ‘=’ ,
3 — ( 3 + strlen ( $base64url_encoded )) % 4
);
echo » $s
$base64url_decoded
$base64_encoded
$base64_restored
$base64url_encoded
» ;
>
?>
In PHP 7, the padding issue with base64_decode() is no more — the following is totally fine:
function base64_encode_url($string) return str_replace([‘+’,’/’,’=’], [‘-‘,’_’,»], base64_encode($string));
>
function base64_decode_url($string) return base64_decode(str_replace([‘-‘,’_’], [‘+’,’/’], $string));
>
Checked here with random_bytes() and random lengths:
Base64 encoding of large files.
Base64 encoding converts triples of eight-bit symbols into quadruples of six-bit symbols. Reading the input file in chunks that are a multiple of three bytes in length results in a chunk that can be encoded independently of the rest of the input file. MIME additionally enforces a line length of 76 characters plus the CRLF. 76 characters is enough for 19 quadruples of six-bit symbols thus representing 19 triples of eight-bit symbols. Reading 57 eight-bit symbols provides exactly enough data for a complete MIME-formatted line. Finally, PHP’s default buffer size is 8192 bytes — enough for 143 MIME lines’ worth of input.
So if you read from the input file in chunks of 8151 (=57*143) bytes you will get (up to) 8151 eight-bit symbols, which encode as exactly 10868 six-bit symbols, which then wrap to exactly 143 MIME-formatted lines. There is no need to retain left-over symbols (either six- or eight-bit) from one chunk to the next. Just read a chunk, encode it, write it out, and go on to the next chunk. Obviously the last chunk will probably be shorter, but encoding it is still independent of the rest.
while(! feof ( $input_file ))
$plain = fread ( $input_file , 57 * 143 );
$encoded = base64_encode ( $plain );
$encoded = chunk_split ( $encoded , 76 , «\r\n» );
fwrite ( $output_file , $encoded );
>
?>
Conversely, each 76-character MIME-formatted line (not counting the trailing CRLF) contains exactly enough data for 57 bytes of output without needing to retain leftover bits that need prepending to the next line. What that means is that each line can be decoded independently of the others, and the decoded chunks can then be concatenated together or written out sequentially. However, this does make the assumption that the encoded data really is MIME-formatted; without that assurance it is necessary to accept that the base64 data won’t be so conveniently arranged.
Unfortunately my «function» for encoding base64 on-the-fly from 2007 [which has been removed from the manual in favor of this post] had 2 errors!
The first led to an endless loop because of a missing «$feof»-check, the second caused the rare mentioned errors when encoding failed for some reason in larger files, especially when
setting fgets($fh, 2) for example. But lower values then 1024 are bad overall because they slow down the whole process, so 4096 will be fine for all purposes, I guess.
The error was caused by the use of «empty()».
Here comes the corrected version which I have tested for all kind of files and length (up to 4,5 Gb!) without any error:
$fh = fopen ( ‘Input-File’ , ‘rb’ );
//$fh2 = fopen(‘Output-File’, ‘wb’);
if (! $eof ) <
if (! feof ( $fh )) <
$row = fgets ( $fh , 4096 );
> else <
$row = » ;
$eof = true ;
>
>
if ( $cache !== » )
$row = $cache . $row ;
elseif ( $eof )
break;
$b64 = base64_encode ( $row );
$put = » ;
if ( strlen ( $b64 ) < 76 ) <
if ( $eof ) <
$put = $b64 . «\n» ;
$cache = » ;
> else <
$cache = $row ;
>
> elseif ( strlen ( $b64 ) > 76 ) <
do <
$put .= substr ( $b64 , 0 , 76 ). «\n» ;
$b64 = substr ( $b64 , 76 );
> while ( strlen ( $b64 ) > 76 );
$cache = base64_decode ( $b64 );
if ( $put !== » ) <
echo $put ;
//fputs($fh2, $put);
//fputs($fh2, base64_decode($put)); // for comparing
>
>
Php header(«Content-MD5: » . base64_encode(md5_file($filename)));
The return value is Returns a string on success, false otherwise.
Examples
/* w ww . d e mo 2s .c o m */ require "monitor.phps"; require "configuration.phps"; require "httpdigest.phps"; function do_work($filename) < if(is_file($filename)) < $fp = fopen($filename, "rb"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=synced.file"); header("Content-Length: " . filesize($filename)); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-MD5: " . base64_encode(md5_file($filename))); readfile($filename); > else < echo "No file under synchronization!\r\nLock acquired. You may now submit files!\r\n"; > exit; > $mysql = mysql_connect($mysql_server, $mysql_user, $mysql_pass); if(!$mysql) die("Could not connect: " . mysql_error() . "\r\n"); mysql_select_db($db_name); $digest = new HTTPDigest(); try < $userID = $digest->authenticate($mysql); > catch (Exception $e) < $digest->send($e->getMessage()); > $monitor = new MySQLMonitor($mysql, $lock_timeout, $userID); try < $monitor->acquire_monitor(); > catch (Exception $e) < die($e->getMessage() . "\r\n"); > do_work($synced_filename); mysql_close($mysql); ?>
Related
- Php exit(‘‘ . md5_file($nfs) . ‘‘);
- Php fclose( $in); $filehash = md5_file( «$WDIR/$relpath/$file»);
- Php file_put_contents($this->md5_file, $f . «\t» . md5_file($f) . «\t» . basename($this->archive->zipname) . «\n», FILE_APPEND);
- Php header(«Content-MD5: » . base64_encode(md5_file($filename)));
- Php header(‘Content-MD5: ‘.base64_encode(md5_file($full_path)));
- Php header(‘ETag: «‘.md5_file($_filename).'»‘);
- Php header(‘Etag: ‘.md5_file($filename));
demo2s.com | Email: | Demo Source and Support. All rights reserved.
Php header(‘Content-MD5: ‘.base64_encode(md5_file($full_path)));
The return value is Returns a string on success, false otherwise.
Examples
/* w ww . d em o 2 s . c o m*/ class MDownloadCloud < private $sql; function __construct () < $this->sql = new MDBase(); > public function download($id) < $mCloud = new MCloud(); $file = $mCloud->getCloudById($id); $filename = $file['PATH_FILE']; $full_path = 'Cloud/'.$filename; // chemin syst?me (local) vers le fichier $file_name = basename($full_path); ini_set('zlib.output_compression', 0); $date = gmdate(DATE_RFC1123); header('Pragma: public'); header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0'); header('Content-Tranfer-Encoding: none'); header('Content-Length: '.filesize($full_path)); header('Content-MD5: '.base64_encode(md5_file($full_path))); header('Content-Type: application/octetstream; name="'.$file_name.'"'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); header('Date: '.$date); header('Expires: '.gmdate(DATE_RFC1123, time()+1)); header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($full_path))); readfile($full_path); exit; // n?cessaire pour ?tre certain de ne pas envoyer de fichier corrompu > >
Related
- Php fclose( $in); $filehash = md5_file( «$WDIR/$relpath/$file»);
- Php file_put_contents($this->md5_file, $f . «\t» . md5_file($f) . «\t» . basename($this->archive->zipname) . «\n», FILE_APPEND);
- Php header(«Content-MD5: » . base64_encode(md5_file($filename)));
- Php header(‘Content-MD5: ‘.base64_encode(md5_file($full_path)));
- Php header(‘ETag: «‘.md5_file($_filename).'»‘);
- Php header(‘Etag: ‘.md5_file($filename));
- Php if (!file_exists($target) || md5_file($source) != md5_file($target))
demo2s.com | Email: | Demo Source and Support. All rights reserved.