2015-09-08 12 views
7

Od wielu lat używam mcrypt w mojej aplikacji php zarówno na win/IIS, jak i na linuksie. Chociaż używam PHP 5.4.28 na moim serwerze linuksowym, właśnie uaktualniłem do PHP 5.6.11 na moim Windows 8.1. I mcrypt już nie działa. Nie rzuca żadnych błędów, które widzę; to po prostu nie działa. Oto moja funkcja szyfrowania:mcrypt nie działa w PHP 5.6 na windows/IIS

function Encrypt($text){ 
    global $salt; 
    if($text != "") 
     return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
    else 
     return ""; 
} 

Działa to dobrze na moim serwerze Linux, ale zwraca puste pole w moim lokalnym oknie. Z tego, co przeczytałem, mcrypt jest wbudowany w php 5.6 dla Windows, więc nie powinno być skrzypiec z rozszerzeniami lub plikiem ini.

Czego mi brakuje?

+0

Czy mcrypt nie używa '/ dev/urandom'? – ScottMcGready

+0

Testowany z PHP 5.6.12 na Windows 8 i działa ... nie może być tak prosty jak twój "$ text" jest pusty? próbowałeś 'var_dump ($ text)'? –

+0

Mam nadzieję, że zdajesz sobie sprawę, jak niepewna jest funkcja 'Encrypt'. –

Odpowiedz

5

PHP 5.6 ma silniejsze wymagania szyfrowania niż 5.4. W 5,6 dostaniesz ostrzeżenie to, co jest naprawdę błąd, ponieważ w rzeczywistości powoduje szyfrowanie i decryptions na niepowodzenie:

Warning: mcrypt_encrypt(): Kluczowe wielkości xx nie jest obsługiwana przez tego algorytmu. Obsługiwane są tylko klucze o rozmiarach 16, 24 lub 32.

... gdzie "xx" to długość waszej wartości soli. Wartość soli musi więc wynosić dokładnie 16, 24 lub 32 znaki.

3

Nie mam odpowiedzi, ale jest to dość długie na komentarz.

To nie rzucać żadnych błędów, co mogę zobaczyć

Czy testowano konfigurację, aby sprawdzić, czy można zobaczyć błędy, kiedy występują?

ale zwraca puste okna na moim lokalnym polu

Jeśli to powrót to nie jest przyczyną błędu krytycznego. Stąd funkcje mcrypt są zdefiniowane. Czy sprawdziłeś, że stałe są zdefiniowane? Czy sprawdziłeś, że wersja libmcrypt odpowiada wymaganiom rozszerzenia PHP?

Czy sprawdziłeś, że dane wejściowe do funkcji mcrypt _ *() wyglądają rozsądnie?

return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 

Nawet jeśli powyższe zadziałało, jest to okropne trochę kodu. Powodem pisania kodu i za pomocą języków wysokiego poziomu jest nie tak komputer może je zrozumieć, ale tak ludzie mogą zrozumieć kod:

$iv=mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
$encypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB 
       , $iv, MCRYPT_RAND); 
$encoded=base64_encode($encrypted); 
return $encoded; 

(r kodu się tak również upraszcza wstrzyknąć kontrole, punkty przerwania i inne narzędzia do debugowania).

+0

"Powód pisania kodu i używania języków wysokiego poziomu nie jest taki, aby komputer mógł je zrozumieć, ale aby ludzie mogli zrozumieć kod" == cytat dnia. – sitilge

8

Spójrzmy na twój kod kawałek po kawałku. (Z większością kosmetycznych/białych znaków.)

function Encrypt($text) 
{ 
    global $salt; // Why not make this a second parameter? 
    if($text != "") { // An unusual check, for sure 
     return trim(// base64_encode doesn't leave whitespace 
      base64_encode(
       mcrypt_encrypt(
        MCRYPT_RIJNDAEL_256, // This is a non-standard variant of the 
             // Rijndael cipher. You want to use the 
             // MCRYPT_RIJNDAEL_128 constant if you 
             // wanted to use AES here. 
        $salt, // This is a key, not a salt! 
        $text, 
        MCRYPT_MODE_ECB, // ECB mode is the worst mode to use for 
            // cryptography. Among other reasons, it 
            // doesn't even use the IV. Search for 
            // ECB penguins for an idea of why ECB 
            // mode is such a bad idea. 
        mcrypt_create_iv(
         mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), 
         MCRYPT_RAND // You're using ECB mode so this is a waste 
            // anyway, but you should use 
            // MCRYPT_DEV_URANDOM instead of MCRYPT_RAND 
        ) 
       ) 
      ) 
     ); 
    } 
    return ""; 
} 

Zdecydowanie zaleca się, aby nie używać tej funkcji do czegokolwiek. To nie jest bezpieczne. Don't use ECB mode.

Ponadto unauthenticated encryption is dangerous i libmcrypt is abandonware.

+0

Scott, jeśli możesz dać mi przykład pracy zgodnie ze wszystkimi twoimi zaleceniami, nagrodzę cię nagrodą, na wszelki wypadek. – HerrimanCoder

+0

Tak, to łatwe. Użyj [defuse/php-encryption] (https://github.com/defuse/php-encryption) zamiast pisać własne. –

+0

Hmmm ... używanie encr-libów zawartych w/php nie jest dokładnie pisaniem własnym. Również moja aplikacja internetowa nie jest bankowością lub bezpieczeństwem narodowym ... tylko wpisy sportowe sprawdzają ich harmonogram. – HerrimanCoder

0

Jak SweatCoder stwierdzono wcześniej, klucz do MCRYPT_RIJNDAEL_256 musi mieć długość równą 32. Aby kontynuować pracę ze starym kluczem jest mniejszy niż 32 (o nazwie $ oldkey) używać

$key = str_pad($oldkey, 32, chr(0)); 

($ key jest co nazywacie $ salt)