Poprzedni artykuł o Evercookie ( http://darkgl.pl/index.php/2014/04/10/evercookie-prawie-niezniszczalne-ciasteczka/ )
W całym poście będę używał jQuery , php wraz z biblioteką mcrypt.
Cały proces można opisać bardzo łatwo zamiast przechowywać w ciasteczkach wrażliwe dane w postaci łatwej do odczytania zaszyfrujemy je po stronie serwera algorytmem RIJNDAEL 128 ( podam też link do kodu aes ).
Kod JavaScript zapisanie ciasteczka
var ec = new evercookie(); $.ajax({ type: "POST", url: "encode.php" }).done(function( msg ) { ec.set( "secret" , msg ); });
Kod PHP zakodowanie ciasteczka
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM); $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3"); $text = "Very secret text !"; echo mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
Kod JavaScript odczytanie ciasteczka
var ec = new evercookie(); ec.get( "secret", function(value) { $.ajax({ type: "POST", url: "some.php", data: { data: value } }) });
Kod PHP odkowanie ciasteczka
$iv = '';//wektory inicializujący $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3"); $text = $_POST[ 'data' ]; $decryptedText = mcrypt_decrypt( MCRYPT_RIJNDAEL_128 , $key, $text, MCRYPT_MODE_CBC, $iv );
Wektor inicjalizujący ( $iv ) musi być ten sam podczas kodowania i dekodowania dlatego $iv z pierwszego skryptu musimy gdzieś zapisać np. w bazie danych.
Linki z których korzystałem
http://php.net/manual/en/book.mcrypt.php
http://stackoverflow.com/questions/6770370/aes-256-encryption-in-php
Implementacja aes
http://www.movable-type.co.uk/scripts/aes-php.html
Nie wiedziałem, żę tak się da dzięki!
Przecież to nie ma sensu. Już lepiej w ciasteczku trzymać tylko jakiś session_id, a na serwerze zamiast szyfrować i tracić na to czas zostawić resztę danych.
1. w takim przypadku session_id jest łatwe do modyfikowania
2. Nie zawsze wszystko trzeba robić w jeden jedyny słuszny sposób