Home > PHP > Szyfrowanie danych

Szyfrowanie danych

luty 25th, 2009

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:

admin PHP , , , ,

  1. No comments yet.
  1. No trackbacks yet.
agencja reklamowa lublin ślub i wesele senniki