Szyfrowanie danych – CustomCipher
Przy opracowywaniu pewnego projektu web’owego jakiś czas temu zetknąłem się z musem napisania szyfranta (ang. cipher), który zastąpić miał zwykłe szyfrowanie base64 lub inszej klasy szyfranta zrobionego na kolanie. Pierwszy przykład, może być taki:
<?php /** * @author Mateusz Manaj * @company Firma Softgraf * @see http://www.mateuszmanaj.pl/szyfrowanie-danych/ */ class Cipher { protected $_key = "wertJhcv3JF2u4s6jDdyhnm="; protected $_mc_mod; protected $_mc_iv; public function __construct($cipher_type = 'tripledes') { $this->_mc_mod = mcrypt_module_open($cipher_type, '', 'ecb', ''); $this->_mc_iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($this->_mc_mod), MCRYPT_RAND); } public function __destruct() { mcrypt_generic_deinit($this->_mc_mod); mcrypt_module_close($this->_mc_mod); } public function Encode($STR) { mcrypt_generic_init($this->_mc_mod, $this->_key, $this->_mc_iv); $encoded = mcrypt_generic($this->_mc_mod, $STR); return base64_encode($encoded); } public function Decode($HASH) { mcrypt_generic_init($this->_mc_mod, $this->_key, $this->_mc_iv); $decoded = mdecrypt_generic($this->_mc_mod, base64_decode($HASH)); return trim($decoded); } } ?>
Proste, prawda ? Cały skrypt opiera się na szyfrowaniu poprzez mcrypt-generic zatem rozszerzenie MCRYPT musi być odblokowane w Twoim pliku php.ini. Jeśli nie wiesz czy tak jest stwórz sobie dowolnej nazwy plik php a w nim umieść funkcję phpinfo(), wyświetl w przeglądarce i szukaj tekstu MCRYPT. Jeśli występuje na tej stronie znaczy to, że masz odblokowane to rozszerzenie.
... protected $_key = "wertJhcv3JF2u4s6jDdyhnm="; ...
Definiujemy klucz służący do szyfrowania i odszyfrowywania
... public function __construct($cipher_type = 'tripledes') { $this->_mc_mod = mcrypt_module_open($cipher_type, '', 'ecb', ''); $this->_mc_iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($this->_mc_mod), MCRYPT_RAND); } ...
Konstruktor posiada w swoim parametrze określenie typu szyfranta ($CIPHER_TYPE). Domyślnie został ustawiony na wartość tripledes podaną jako pierwszy parametr funkcji mcrypt_module_open. W starej wersji tej funkcji, która jest już przestarzała mcrypt_ecb podawaliśmy podobny parametr MCRYPT_3DES, który określał rodzaj szyfranta podobnie jest i w tym przypadku.
W zmiennej członkowskiej $_mc_mod przechowujemy handler (uchwyt) do modułu PHP, który otworzyliśmy za pomocą tej funkcji.
Natomiast w zmiennej $_mc_iv tworzymy wektor inicjalizacyjny dla algorytmu szyfrującego stworzonego w kroku poprzednim.
Idąc dalej
... public function __destruct() { mcrypt_generic_deinit($this->_mc_mod); mcrypt_module_close($this->_mc_mod); } ...
W desktruktorze, czyli metodzie magicznej wywoływanej podczas niszczenia obiektu klasy (innymi słowy mówiąc podczas zakończenia pracy na obiekcie) czyścimy po sobie zużyte zasoby systemu deinicjalizując oraz zamykając szyfranta MCRYPT.
Metoda Encode…
... public function Encode($STR) { mcrypt_generic_init($this->_mc_mod, $this->_key, $this->_mc_iv); $encoded = mcrypt_generic($this->_mc_mod, $STR); return base64_encode($encoded); } ...
… szyfruje podany w jej parametrze ciąg znakowy ($STR) i zwraca wynik w postaci kodu base64 tylko dlatego iż to co zwróci funkcja szyfrująca nie wyświetla się jako standardowy zestaw znaków w przeglądarce i ciężko by się na tym pracowało dalej. Z uwagi na to zrobimy z niego na końcu hash base64 i problem kodowania z głowy.
Wywołujemy funckję mcrypt_generic_init i podajemy do niej paramtery uchwyt otwartego modułu szyfrującego, klucz którym zakodowaliśmy ciąg znakowy oraz wektor inicjalizacji szyfranta (IV).
Jeśli coś zakodowaliśmy musimy mieć możliwość aby przywrócić temu pierwotny stan. Można to zrealizować za pomocą metody Decode()
... public function Decode($HASH) { mcrypt_generic_init($this->_mc_mod, $this->_key, $this->_mc_iv); $decoded = mdecrypt_generic($this->_mc_mod, base64_decode($HASH)); return trim($decoded); } ...
Na jej wejściu podajemy wygenerowany hash poprzez metodę Encode() a w rezutacie otrzymujemy ciąg znaków sprzed zakodowania. Przynajmniej w teorii :)
Standardowo musimy wywołać funckję mcrypt_generic_init i podać do niej odpowiednio uchwyt otwartego modułu szyfrującego, klucz którym zakodowaliśmy ciąg znakowy oraz wektor inicjalizacji szyfranta (IV).
W zmiennej $decoded i funkcji mdecrypt_generic przesyłamy uchwyt do otwartego modułu szyfranta a jako drugi parametr umieszczamy nasz zakodowany ciąg lecz uprzednio musimy go wstępnie odkodować za pomocą base64_decode.
Przykładowy kod wygląda następująco:
<?php $str = "MojaTajna wiadomość_do-+-zaszyfrowania+"; $ci = new Cipher(); $encoded = $ci->Encode($str); // Szyfrowanie $decoded = $ci->Decode($encoded); // Odszyfrowanie echo "Encoded: ".$encoded.""; echo "
"; echo "Decoded: ".$decoded.""; ?>
Po wykonaniu tego skryptu, w przeglądarce zobaczymy coś takiego:
Encoded: hVnXFL0F8YnyekpkJPULnsFDK2ikAhYmqoogpWeG1nSj3ZZ8ybgwPUNpBv+nsKvN Decoded: MojaTajna wiadomość_do-+-zaszyfrowania+
s’il vous plaît i smacznego :)
0 komentarzy - Kliknij, aby skomentować