Szyfrowanie danych
Czasem zachodzi potrzeba zaszyfrowania pewnych danych w taki sposób by można było je bezpiecznie przechowywać w bazie danych i później w razie potrzeby łatwo odszyfrować.
Z pomocą przychodzi nam rozszerzenie php o nazwie mcrypt, która obsługuje większość z dostępnych algorytmów szyfrowania symetrycznego.
Ja w implementacji swojej klasy szyfrującej posłużę się algorytmem Rijndael_128, gdzie główną role w całej klasie odgrywają funkcje mcrypt_encrypt() i mcrypt_decrypt(), które przyjmują 5 parametrów:
1 - rodzaj algorytmu użyty do szyfrowania
2 - klucz który będzie użyty do szyfrowania,
3 - dane do szyfrowania (odszyfrowania)
4 - typ porównania
5 - wektor inicjalizacji (IV)
Algorytm szyfrowania przy użyciu mcryp można opisać w takich krokach:
Szyfrowanie
1. Przekształcamy IV w tablicę bajtów
2. Szyfrujemy dane za pomocą Rijndael_128 dostarczając IV w postaci tablicy bajtów
3. Przekształcamy zaszyfrowane dane z tablicy bajtów do łańcucha zawierającego wartości szesnastkowe.
Odszyfrowanie
1. taki sam jak w szyfrowaniu
2. Przekształcamy z łańcucha szesnastkowego w tablicę bajtów
3. Odszyfrowujemy dostarczając IV
W przypadku Rijndael_128 klucz szyfrujący i wektor inicjalizacji (IV- zawiera wartości szesnastkowe) muszą mieć 32 znaki długości.
A oto i klasa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?php /** * Klasa do symetrycznego szyfrowania danych * * @name Crypt * @author M.D. <md.mateusz.dabrowski@gmail.com> * @see http://mdabrowski.net */ class Crypt { /** * Tajny klucz użyty do szyfrowania nie więcej niż 32 znaki */ const SECRET_KEY = "Tajny klucz uzyty do szyfrowania"; /** * Wektor inicjalizacji musi mieć dokładnie 32 znaki szesnastkowe */ const IV = "ad57fe84d60b79c2d7e2a1bde36dcfe0"; const CIPHER = MCRYPT_RIJNDAEL_128; /** * Metoda koduje stringa i zwraca zakodowany string w postaci szesnastkowej * * @param string $stringData * @return string hex string */ public static function encrypt($stringData) { return bin2hex(mcrypt_encrypt(self::CIPHER, self::SECRET_KEY, $stringData, MCRYPT_MODE_CBC, self::packToBin(self::IV))); } /** * Metoda odkodowuje stringa * * @param string $stringData hex string * @return string */ public static function decrypt($stringData) { return trim(mcrypt_decrypt(self::CIPHER, self::SECRET_KEY, self::packToBin($stringData), MCRYPT_MODE_CBC, self::packToBin(self::IV))); } /** * Prywatna metoda pakująca stringa do wartości binarnej * * @param string $data hex string * @return bin */ private static function packToBin( $data ) { return pack("H*", $data); } } //Zastosowanie $m=Crypt::encrypt('Jakiś string'); Crypt::decrypt($m); ?> |
Statyczna metoda encrypt zakodowuje dane i zwraca je w postaci szesnastkowej dzięki czemu możemy zapisać je np w bazie.
Statyczna metoda decrypt odszyfrowuje dane z postaci szesnastkowej (po drodze konwertuje je do postaci binarnej) i zwraca je w postaci odszyfrowanego łańcucha znaków.
Sama klasa jest dosyć prosta i mechanizm działania, też jest mało skomplikowany. Wszystko sprowadza się do wykorzystania mcrypt_encrypt() i mcrypt_decrypt.
Powiązane wpisy: