Вопрос:

проверить md5 base64_encode, чтобы показать значение

php

18 просмотра

2 ответа

26 Репутация автора

Я сравниваю два base64_encode md5ключа, созданные с одинаковыми значениями (IP, время, путь и пароль) в разных доменах.

Создать зашифрованный ключ на 1-м домене

    $secret = "PASSWORD";
    $expires = time()+3600; 
    $uri = '/video1/';
    $ip = $_SERVER['REMOTE_ADDR'];
    $md5 = base64_encode(md5($secret . $expires . $uri . $ip, true)); 
    $md5 = strtr($md5, '+/', '-_'); 
    $md5 = str_replace('=', '', $md5); 
    $rtmp = "?md5=".$md5;
    $urls= 'http://example.com'.$uri .$rtmp;

    echo '<a href="' . $urls . '">' .$urls . '</a>';

Создайте зашифрованный ключ на втором домене и сравните его с полученным URL-адресом.

    function getAddress() {
        $protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
        return $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    }
    $url = getAddress();
    $path = (parse_url($url, PHP_URL_PATH));    // recive path here '/video1/'
    $verify = substr(parse_url($url, PHP_URL_QUERY),4); //recive md5 encoded key from URL 

    /* create again md5 encoded key to match with URL key */
    $secret = "PASSWORD";
    $expires = time()+3600; 
    $uri = $path;
    $ip = $_SERVER['REMOTE_ADDR'];
    $md5 = base64_encode(md5($secret . $expires . $uri . $ip, true)); 
    $md5 = strtr($md5, '+/', '-_'); 
    $md5 = str_replace('=', '', $md5); 
    $rtmp = $md5;

    if ($rtmp===$verify){     // Matching both, local key with URL key
        echo '<h1>Welcome</h1>';
    }
    else {
        echo '<h1>Password,Time,Path or IP Not Match</h1>';
    }

Я использовал время (3600) в Шифровании, так что ifутверждение должно показывать значение в течение 3600 секунд. Но это всегда показывает elseценность.

Как это будет ifзначение печати для времени (3600)? После этого времени распечататьelse

Автор: F.A Источник Размещён: 11.08.2019 07:07

Ответы (2)


1 плюс

19781 Репутация автора

Я не скопировал все части вашего кода, но это принцип.
Хэш-пароль и время отдельно, так что вы можете убедиться, что пароль правильный и смотреть на время независимо.

$secret = "PASSWORD";
$expires = time()+3600; 
$urls= 'http://example.com?md5=" . md5($secret) . "&t=" . md5($expires);

Это передаст их независимо друг от друга, и на принимающей стороне вы сопоставите пароль с паролем и зациклите время, чтобы убедиться в его действительности.

if($_GET['md5'] == $password) $validM = true;

for($i = time()+3600; $i>time(); $i--){
    if(md5($i) == $_GET['t']) $validT = true;
 }

if($validM && $validT){
    echo "within 3600 seconds and correct password";
}

Это безопасный метод для примерно 95% населения мира, но, поскольку мы передаем пароли и временные переменные с помощью GET, нетрудно понять, как получить нелегальный доступ.
Если вам нужны безопасные транзакции, для которых вы не используете этот метод.

Автор: Andreas Размещён: 11.08.2019 07:38

0 плюса

19729 Репутация автора

Возможно, что выходит за рамки вопроса, но весь MD5подход был ошибочным, так почему бы не пойти на «всю свинью» (как говорится) и фактически использовать шифрование, а не хеширование, как в вопросе?

Функции encryptи decryptоснованы на функциях из руководства по PHP

function encrypt( $data=false, $pubkey=false, $cipher='AES-128-CBC' ){
    if( !empty( $data ) && in_array( $cipher, openssl_get_cipher_methods() ) ){
        $ivlen = openssl_cipher_iv_length( $cipher );
        $iv = openssl_random_pseudo_bytes( $ivlen );

        $encrypted = openssl_encrypt( $data, $cipher, $pubkey, $options=OPENSSL_RAW_DATA, $iv );
        $hash = makehash( $encrypted, $pubkey );
        return base64_encode( $iv . $hash . $encrypted );
    }
    return false;
}
function decrypt( $data, $pubkey=false, $cipher='AES-128-CBC' ){
    if( !empty( $data ) && in_array( $cipher, openssl_get_cipher_methods() ) ){
        $shalength=32;
        $data = base64_decode( $data );
        $ivlen = openssl_cipher_iv_length( $cipher );
        $iv = substr( $data, 0, $ivlen );
        $hash = substr( $data, $ivlen, $shalength );

        $encrypted = substr( $data, $ivlen + $shalength );
        $decrypted = openssl_decrypt( $encrypted, $cipher, $pubkey, $options=OPENSSL_RAW_DATA, $iv );

        if( $decrypted && hash_equals( $hash, makehash( $encrypted, $pubkey ) ) ){
            return $decrypted;
        }
    }
    return false;
}
function makehash( $data, $key ){
    return hash_hmac( 'sha256', $data, $key, true );
}

Затем, чтобы использовать это:

$key='A complex secret string - ideally this will be the contents of an ssl cert perhaps obtained using file_get_contents etc';
$cipher='AES-128-CBC';


/* Create the payload of items to be encrypted and passed in the url */
$payload=array(
    'file'      =>  'my_secret_video.mp4',
    'expires'   =>  time() + 3600,
    'ip'        =>  $_SERVER['REMOTE_ADDR']
);
/* create a nice string to be encrypted */
$data=urldecode( http_build_query( $payload ) );

/* create the encrypted data string */
$encrypted=encrypt( $data, $key, $cipher );

/* construct the url to be presented to the user */
$url=sprintf( '%s://%s/downloads/?hash=%s', $_SERVER['REQUEST_SCHEME'], $_SERVER['HTTP_HOST'], $encrypted );
printf('<a href="%1$s" target="_blank">%1$s</a>', $url);



/* At the Server - To process the url and check validity */
$querystring = parse_url( $url, PHP_URL_QUERY );
if( !empty( $querystring ) ){

    list( $param, $data )=explode( '=', $querystring );

    /* decrypt data */
    $decrypted=decrypt( $data, $key, $cipher );
    if( $decrypted ){

        /* process initial querystring we created - create an array $out */
        parse_str( $decrypted, $out );

        /* for simplicity, cast as an object to use object notation */
        $obj=(object)$out;
        $file=$obj->file;
        $expires=$obj->expires;
        $ip=$obj->ip;

        /* perform logic tests on the decrypted data and act accordingly */
        if( time() > $expires ){
            /* too late */
        } else {
            /* all good */
            echo $file;
        }
    }
}
Автор: RamRaider Размещён: 11.08.2019 08:02
Вопросы из категории :
32x32