Podręcznik użytkownika CodeIgniter wersja 2.2.1


Klasa Encryption

Klasa Encryption zapewnia dwukierunkowe szyfrowanie danych. Wykorzystuje bibliotekę Mcrypt. Aby działać poprawnie, biblioteka Encryption potrzebuje rozszerzenia Mcrypt zainstalowanego na serwerze.

Ustawianie klucza

Klucz jest częścią informacji, która kontroluje proces kryptograficzny i pozwala na zdeszyfrowanie wcześniej zaszyfrowanego ciągu. Klucz, który zostanie wybrany będzie stanowił jedyny sposób na zdeszyfrowanie danych, które zostały zaszyfrowane przy pomocy tego klucza. Dlatego też, klucz należy wybierać ostrożnie i nigdy go nie zmieniać, jeśli mamy zamiar używac go do stałych danych.

Nie trzeba chyba wspominać, że klucz powinien być starannie strzeżony. Jeśli ktoś uzyska dostęp do Twojego klucza, będzie mógł w bardzo łatwy sposób zdeszyfrować dane. Jeśli serwer nie jest całkowicie pod Twoją kontrolą nie jest możliwe zapewnienie całkowitego bezpieczeństwa dla klucza, dlatego powinieneś zastanowić się dwa razy zanim będziesz chciał wykorzystać szyfrowanie do czegokolwiek, co wymaga zapewnienia wysokiego bezpieczeństwa - np. składowania numerów kart kredytowych.

Aby maksymalnie wykorzystać algorytm szyfrowania, Twój klucz powinien mieć długośc 32 znaków (128 bitów). Klucz powinien być losowym ciągiem znaków i składać się z liczb oraz małych i wielkich liter. Twój klucz nie powinien być prostym tekstem. W celu zapewnienia kryptograficznego bezpieczeństwa, powinien być losowy, najbardziej jak się tylko da.

Twój klucz może być przechowywany albo w pliku application/config/config.php lub możesz zaprojektować swój własny mechanizm przechowywania i przypisywać klucz dynamicznie podczas szyfrowania/deszyfrowania.

Aby zachować swój klucz w pliku application/config/config.php, otwórz go i ustaw:

$config['encryption_key'] = "TWÓJ KLUCZ";

Długość wiadomości

Ważne jest abyś wiedział, że zaszyfrowana wiadomość będzie w przybliżeniu 2.6 razy dłuższa niż wiadomość oryginalna. Dla przykładu, jeśli zaszyfrujesz ciąg "my super secret data", który składa się z 21 znaków, to otrzymasz wiadomość, która będzie miała około 55 znaków (około, ponieważ zakodowany ciąg znaków zwiększa swoją długość w klastrach co 64 bity, nie jest to więc do końca przyrost liniowy). Weź to pod uwagę, kiedy wybierasz metodę składowania swoich danych. Dla przykładu, pliki cookies mogą pomieścić tylko 4K informacji.

Inicjalizowanie klasy

Tak jak większość innych klas w CodeIgniterze, klasa Encryption jest inicjalizowana w Twoim kontrolerze poprzez funkcję $this->load->library:

$this->load->library('encrypt');

Po załadowaniu, obiekt klasy Encrypt będzie dostępny poprzez wywołanie: $this->encrypt

$this->encrypt->encode()

Dokonuje szyfrowania danych i zwraca wynik w postaci ciągu. Przykład:

$msg = 'My secret message';

$encrypted_string = $this->encrypt->encode($msg);

Opcjonalnie, jako drugi parametr możesz przypisać klucz, jeśli nie chcesz skorzystać z tego przechowywanego w pliku config:

$msg = 'My secret message';
$key = 'super-secret-key';

$encrypted_string = $this->encrypt->encode($msg, $key);

$this->encrypt->decode()

Deszyfruje zakodowany ciąg. Przykład:

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';

$plaintext_string = $this->encrypt->decode($encrypted_string);

Opcjonalnie, jako drugi parametr możesz przypisać klucz, jeśli nie chcesz skorzystać z tego przechowywanego w pliku config:

$msg = 'My secret message';
$key = 'super-secret-key';

$encrypted_string = $this->encrypt->decode($msg, $key);

$this->encrypt->set_cipher();

Pozwala na ustawienie rodzaju szyfru dla biblioteki Mcrypt. Domyślnie używany jest MCRYPT_RIJNDAEL_256. Przykład:

$this->encrypt->set_cipher(MCRYPT_BLOWFISH);

Odwiedź stronę php.net aby poznac listę dostępnych szyfrów.

Jeśli chciałbyś ręcznie sprawdzić, czy Twój serwer obsługuje bibliotekę Mcrypt, możesz zrobić to tak:

echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';

$this->encrypt->set_mode();

Pozwala na ustawienie trybu biblioteki Mcrypt. Domyślnie używany jest MCRYPT_MODE_CBC. Przykład:

$this->encrypt->set_mode(MCRYPT_MODE_CFB);

Odwiedź stronę php.net aby poznac listę dostępnych trybów.

$this->encrypt->sha1();

Jednokierunkowa funkcja skrótu SHA1. Po dostarczeniu ciągu, zwraca jednokierunkowy, 160 bitowy hash. Uwaga: SHA1, tak samo jak MD5 nie można zdeszyfrować. Przykład:

$hash = $this->encrypt->sha1('Some string');

Wiele instalacji PHP domyślnie obsługuje SHA1, więc łatwiej skorzystać z natywnej funkcji:

$hash = sha1('Some string');

W przypadku, kiedy serwer nie obsługuje SHA1, możesz skorzystać z tej funkcji.

$this->encrypt->encode_from_legacy($orig_data, $legacy_mode = MCRYPT_MODE_ECB, $key = '');

Pozwala na zdeszyfrowanie danych, które oryginalnie były zaszyfrowane z wykorzystaniem CodeIgnitera w wersji 1.x - dzięki temu możemy zachować kompatybilność z biblioteką Encryption w CodeIgniterze w wersji 2.x. Funkacja jest potrzebna tylko wtedy jeśli posiadasz zaszyfrowane dane zachowane na stałe, np. w pliku lub bazie danych, a serwer którego używasz wspiera bibliotekę Mcrypt. "Lekkie" użycie szyfrowania, jak szyfrowanie sesji lub zaszyfrowane dane flashdata będą wymagać interwencji z Twojej strony. Jednak istniejące zaszyfrowane sesje zostaną zniszczone, w związku z tym, że dane zaszyfrowane przed wersją 2.x nie zostaną zdeszyfrowane.

Dlaczego dostarczona jest tylko metoda do odszyfrowania danych, zamiast opcja do szyfrowania i deszyfrowywania? Algorytm w biliotece Encryption w CodeIgniterze 2.x został ulepszony pod względem wydajności i bezpieczeństwa, nie chcemy więc zachęcać do dalszego wykorzystania starych metod. Oczywiście możesz rozszerzyć klasę Encryption i zastąpić nowe metody, starymi - uzyskując tym samym całkowitą kompatybilność z CodeIgniterem 1.x, ale jest to decyzja, którą developer powinien podjąć ostrożnie i świadomie, o ile w ogóle.

$new_data = $this->encrypt->encode_from_legacy($old_encrypted_string);
Parametr Wartość domyślna Opis
$orig_data Brak Oryginalnie zaszyfrowane dane poprzez bibliotekę Encryption w CodeIgniterze 1.x
$legacy_mode MCRYPT_MODE_ECB Tryb Mcrypt który został użyty do wygenerowania zaszyfrowanych danych W CodeIgniterze 1.x, domyślnie był to MCRYPT_MODE_ECB i tak samo będziemy zakładać tutaj o ile nie zostanie ustawiona inna wrtość w tym parametrze.
$key Brak Klucz. Zazwyczaj określony w pliku config, tak jak przedstawiono to powyżej.