2011-04-22 5 views
11

Wprowadzam do prostego schematu autoryzacji. Myślę, że najłatwiejszym sposobem na zrobienie tego bez SSL lub innego uwierzytelnienia HTTP byłoby szyfrowanie za pomocą klucza wspólnego. Adaptacja prosty przykład z podręcznika PHP, wpadłem na następujący:Wysyłanie zaszyfrowanych zaszyfrowanych ciągów za pomocą parametru adresu URL - zdekodowany tekst jest zniekształcony

$text = "boggles the invisible monkey will rule the world"; 
$key = "This is a very secret key"; 

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv); 

$iv = base64_encode($iv); 
$enc = base64_encode($enc); 

echo '<a href="temp2.php?iv='.$iv.'&text='.$enc.'">link</a><br />'; 

strony, która odbiera to żądanie (temp2.php) wygląda następująco:

$key = "This is a very secret key"; 

$iv = base64_decode($_GET["iv"]); 
$enc = base64_decode($_GET["text"]); 

$crypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv); 

echo "$crypttext<br>"; 

To staje się bardzo blisko, ale nie dekodować properly-- to echa

boggles the invisible monkey will rule t—;eôügJë

nie jestem pewien co odwieszenie ma, próbowałem urlencode/urldecode i htmlentities, myśląc Może char Aktor został zmanipulowany we wniosku, ale bez różnicy.

Czy jest coś jeszcze, czego mi brakuje? Być może dopełnienie?

Dzięki

+3

Ciągi Base64 często kończą się znakiem '='. Założę się, że tracisz jeden podczas analizy adresu URL (ponieważ = jest to coś specjalnego). Spróbuj 'urlencode (base64_encode())'? –

+1

Plus, powinieneś publikować te dane, ponieważ istnieją ograniczenia dotyczące rozmiaru łańcucha pobierania (jest tam na nowoczesnych serwerach, ale one istnieją) – ircmaxell

+0

@Frank Farmer - Próbowałem trasy urlencode/decode. Nie pomogło. @ Ircmaxwell-- masz rację, ale początkowo jest to całkiem mały ciąg. – julio

Odpowiedz

29

Zdarza się, że zaszyfrowany tekst będzie w końcu wygląda mniej więcej tak:

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7 

Zobacz, że znak plus tam? Znaki plus w adresach URL zamieniają się w spacje.

Po ręcznym przekształceniu znaku plus w spację i odszyfrowaniu wyniku, wynikiem jest uszkodzenie wiadomości śmieciowej, której byłeś świadkiem.

Należy uruchomić zarówno IV i zaszyfrowany tekst przez rawurlencode (nieurlencode) przed trzymać go w link. To odpowiednio zakoduje znak plus, który zachowa go w procesie. Nie musisz (i nie powinien) być napisany po drugiej stronie - PHP zrobi to za Ciebie.

+1

@Frank, zdarza się, że implementacja PHP dekodowania base64 ignoruje brakujące lub dodatkowe znaki równości na końcu. Inne implementacje mogą nie być tak liberalne, aby w innych okolicznościach stanowiły problem. – Charles

Powiązane problemy