Rozszerzenie mcrypt jest przestarzałe i zostanie usunięte w PHP 7.2 zgodnie z komentarzem zamieszczonym tutaj . Dlatego szukam alternatywnego sposobu szyfrowania haseł.
W tej chwili używam czegoś takiego
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)
Potrzebuję Twojej opinii na temat najlepszego / najsilniejszego sposobu szyfrowania haseł, zaszyfrowane hasło powinno oczywiście być obsługiwane przez PHP 7.xx i powinno być również możliwe do odszyfrowania, ponieważ moi klienci chcą mieć opcję `` odzyskania '' swoich haseł bez generowania nowego jeden.
password_hash
i nie weryfikowaćpassword_verify
?Odpowiedzi:
Najlepszą praktyką jest haszowanie haseł, aby nie można było ich odszyfrować. To sprawia, że osoby atakujące, które mogły uzyskać dostęp do Twojej bazy danych lub plików, są nieco trudniejsze.
Jeśli musisz zaszyfrować swoje dane i umożliwić ich odszyfrowanie, przewodnik dotyczący bezpiecznego szyfrowania / deszyfrowania jest dostępny pod adresem https://paragonie.com/white-paper/2015-secure-php-data-encryption . Podsumowując ten link:
źródło
Sodium-compat
( github.com/paragonie/sodium_compat ), która działa w PHP> = 5.2.4Jak sugeruje @rqLizard , możesz zamiast tego użyć funkcji
openssl_encrypt
/openssl_decrypt
PHP, które zapewniają znacznie lepszą alternatywę dla implementacji AES (The Advanced Encryption Standard), znanego również jako szyfrowanie Rijndael.Zgodnie z poniższym komentarzem Scotta na php.net :
Dalsze czytanie:
Przykłady kodu
Przykład 1
Przykład nr 2
Przykład nr 3
W oparciu o powyższe przykłady zmieniłem następujący kod, który ma na celu zaszyfrowanie identyfikatora sesji użytkownika:
w:
Aby wyjaśnić, powyższa zmiana nie jest prawdziwą konwersją, ponieważ te dwa szyfrowania wykorzystują inny rozmiar bloku i inne zaszyfrowane dane. Ponadto domyślne wypełnienie jest inne,
MCRYPT_RIJNDAEL
obsługuje tylko niestandardowe wypełnienie zerowe. @zaphDodatkowe uwagi (z komentarzy @ zaph):
MCRYPT_RIJNDAEL_128
) jest odpowiednikiem AES , jednak Rijndael 256 (MCRYPT_RIJNDAEL_256
) nie jest AES-256, ponieważ 256 określa rozmiar bloku 256-bitów, podczas gdy AES ma tylko jeden rozmiar bloku: 128-bitów. Zasadniczo więc Rijndael z blokiem o rozmiarze 256 bitów (MCRYPT_RIJNDAEL_256
) został błędnie nazwany z powodu wyborów dokonanych przez programistów mcrypt . @zaphSzyfrowanie z różnymi rozmiarami bloków dla Rijndael daje różne zaszyfrowane dane.
Na przykład
MCRYPT_RIJNDAEL_256
(nie równoważneAES-256
) definiuje inny wariant szyfru blokowego Rijndael o rozmiarze 256 bitów i rozmiarze klucza opartym na przekazanym kluczu, gdzieaes-256-cbc
jest Rijndael o rozmiarze bloku 128-bitów i rozmiarze klucza 256-bitowe. Dlatego używają różnych rozmiarów bloków, które generują zupełnie inne zaszyfrowane dane, ponieważ mcrypt używa liczby do określenia rozmiaru bloku, gdzie OpenSSL użył liczby do określenia rozmiaru klucza (AES ma tylko jeden rozmiar bloku o długości 128 bitów). A więc w zasadzie AES to Rijndael z rozmiarem bloku 128-bitów i kluczami o rozmiarach 128, 192 i 256 bitów. Dlatego lepiej jest używać AES, który w OpenSSL nazywa się Rijndael 128.źródło
$session_id = rtrim($decryptedSessionId, "\0");
? Czy w końcu możnaopenssl_decrypt
zwrócić jakieś niechciane postacie? Co się stanie, jeśli zaszyfrowana zmienna kończy się na 0 (tj.encrypt("abc0")
?"\0"
to nie"0"
tylko znak NULL, którego kod ASCII to 0x00 (szesnastkowo 0).Implementacja Rijndael w czystym PHP istnieje z phpseclib dostępnym jako pakiet kompozytora i działa na PHP 7.3 (przetestowane przeze mnie).
W dokumentacji phpseclib znajduje się strona, która generuje przykładowy kod po wprowadzeniu podstawowych zmiennych (szyfr, tryb, rozmiar klucza, rozmiar w bitach). Wyprowadza następujące dane dla Rijndael, ECB, 256, 256:
kod z mycrypt
działa tak z biblioteką
*
$term
byłbase64_decoded
źródło
Zgodnie z innymi odpowiedziami tutaj, najlepszym rozwiązaniem, które znalazłem, jest użycie OpenSSL. Jest wbudowany w PHP i nie potrzebujesz żadnej zewnętrznej biblioteki. Oto proste przykłady:
Aby zaszyfrować:
Aby odszyfrować:
Link referencyjny: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/
źródło
Możesz użyć pakietu pollyfill phpseclib. Nie możesz użyć otwartego ssl lub libsodium do szyfrowania / deszyfrowania za pomocą rijndael 256. Kolejna kwestia, nie potrzebujesz zastępować żadnego kodu.
źródło
mcrypt_compat
przez uruchomienie,composer require phpseclib/mcrypt_compat
ale nadalPHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124
używam7.2.26
framwork php i Kohana. Czy trzeba wykonać więcej czynności po zainstalowaniu go w programie Composer?require APPPATH . '/vendor/autoload.php';
na dolebootstrap.php
.Powinieneś używać OpenSSL ponad,
mcrypt
ponieważ jest aktywnie rozwijany i utrzymywany. Zapewnia lepsze bezpieczeństwo, łatwość konserwacji i przenośność. Po drugie, znacznie szybciej wykonuje szyfrowanie / deszyfrowanie AES. Domyślnie używa dopełnienia PKCS7, ale możesz określić,OPENSSL_ZERO_PADDING
czy jest to potrzebne. Aby użyć 32-bajtowego klucza binarnego, możesz określić,aes-256-cbc
który jest bardziej oczywisty niżMCRYPT_RIJNDAEL_128
.Oto przykład kodu wykorzystujący Mcrypt:
A oto wersja napisana przy użyciu OpenSSL:
Źródło: Jeśli wpisujesz słowo MCRYPT w swoim kodzie PHP, robisz to źle .
źródło
Używam tego na PHP 7.2.x, działa dobrze dla mnie:
a następnie uwierzytelnij skrót za pomocą następującej funkcji:
Przykład:
i aby uwierzytelnić ten hash, użyj następującego kodu:
To wszystko.
źródło
Jak wspomniano, nie należy przechowywać haseł użytkowników w formacie, który można odszyfrować. Odwracalne szyfrowanie zapewnia hakerom łatwą drogę do znalezienia haseł użytkowników, co obejmuje również narażenie kont użytkowników w innych witrynach, jeśli używają tam tego samego hasła.
PHP udostępnia parę potężnych funkcji do losowego, jednokierunkowego szyfrowania mieszającego -
password_hash()
ipassword_verify()
. Ponieważ skrót jest automatycznie losowany, hakerzy nie mają możliwości wykorzystania wstępnie skompilowanych tabel skrótów haseł do odtworzenia hasła. Ustaw tęPASSWORD_DEFAULT
opcję, a przyszłe wersje PHP będą automatycznie używać silniejszych algorytmów do generowania skrótów haseł bez konieczności aktualizowania kodu.źródło
Powinieneś użyć
openssl_encrypt()
funkcji.źródło
Udało mi się przetłumaczyć mój obiekt Crypto
Uzyskaj kopię php za pomocą mcrypt, aby odszyfrować stare dane. Poszedłem do http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , skompilowałem go, a następnie dodałem rozszerzenie ext / mcrypt (konfiguracja; make; make install). Myślę, że musiałem dodać linię extenstion = mcrypt.so do pliku php.ini. Seria skryptów służących do tworzenia pośrednich wersji danych z niezaszyfrowanymi danymi.
Zbuduj klucz publiczny i prywatny dla openssl
Aby zaszyfrować (używając klucza publicznego) użyj openssl_seal. Z tego, co przeczytałem, openssl_encrypt przy użyciu klucza RSA jest ograniczone do 11 bajtów mniej niż długość klucza (patrz http://php.net/manual/en/function.openssl-public-encrypt.php komentarz Thomasa Horstena)
Prawdopodobnie mógłbyś przechowywać surowy plik binarny.
Aby odszyfrować (używając klucza prywatnego)
PS Nie możesz zaszyfrować pustego ciągu („”)
PPS Dotyczy to bazy danych haseł, a nie sprawdzania poprawności użytkownika.
źródło