Как вы URL Base64 кодировать и декодировать объединенную строку в Perl? - PullRequest
2 голосов
/ 06 марта 2012

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

выход

   [i] original string > 05cee990c62ca2ce5dfe6cd77115a96d|1331012040|1331004840|7200
   [i] encoded string > MDVjZWU5OTBjNjJjYTJjZTVkZmU2Y2Q3NzExNWE5NmR8MTMzMTAxMjA0MHwxMzMxMDA0ODQwfDcyMDA=
   [i] decoded string > Ó{ßts­kgå×ÞéÇ{ï]ykÞ

Печально то, что те же функции могут анализировать закодированную в base64url информацию, полученную из Facebook.

Функция

   sub timeoutStringGen{
    my ($name,$seconds) = @_;

    my $uuid    = uniqueID(); #generates random string
    my $timeStr = time();
    my $timeEnd = $timeStr + $seconds;

    my $timeoutString = "$uuid|$timeEnd|$timeStr|$seconds";

    my $encodedString = encode_base64url( $timeoutString );
    my $decodedString = decode_base64url( $timeoutString );

    _info "original string > $timeoutString"; #interal log function outputs to STDERR
    _info "encoded string > $encodedString";
    _info "decoded string > $decodedString";

    return $timeoutString;
  }


  sub timeoutStringParse{
    my ($timeoutString) = @_;
    return 0 unless $timeoutString;

    my ($uuid,$end,$start,$secs) = split /\Q|/,$timeoutString;

    my $curr  = time();
    my $left  = $end - $curr;

    my $isExpired = ($left > 0) ? 1 : 0;

    my $timeHash  = {
      uuid  => $uuid,
      end   => $end,
      start => $start,
      secs  => $secs,
      exp   => $isExpired,
      left  => $left,
      curr  => $curr
    };

    return $timeHash;

  }



but maybe you can help me understand why these dont work to encode and decode the string properly

          #--------

          sub encode64{
             my($data) = @_;
             return MIME::Base64::encode_base64($data);
          }

          #--------

          sub decode64{
             my($data) = @_;
             return MIME::Base64::decode_base64($data);
          }

          #--------

          sub encode_base64url{
             my($data) = @_;
             return 0 unless $data;
             $data = encode64($data);
             $data =~ tr#\-_#+/#;
             return($data);
          }

          #--------

          sub decode_base64url{
             my($data) = @_;
             return 0 unless $data;
             $data =~ tr#+/#\-_#;
             $data = decode64($data);
             return($data);
          }

1 Ответ

4 голосов
/ 06 марта 2012

Это:

my $decodedString = decode_base64url( $timeoutString );

Должно быть:

my $decodedString = decode_base64url( $encodedString );
                                      ^^^^^^^^^^^^^^

Как написано, вы декодируете исходное значение, не закодированное.

...