Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szyfrowanie i odszyfrowywanie danych z bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
piotras
Witam,

mam zaszyfrowane dane w bazie (za pomocą mcrypt). Dane do tej bazy wstawiałem poprzez skrypt PHP, w której była taka funkcja:

  1. function encrypt($string, $key) {
  2. $enc = "";
  3. global $iv;
  4. $enc=mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_ENCRYPT, $iv);
  5. return base64_encode($enc);
  6. }


Następnie probuję odczytać te dane w innym skrypcie PHP, który korzysta z takiej funkcji:

  1. function decrypt($string, $key) {
  2. $dec = "";
  3. $string = trim(base64_decode($string));
  4. global $iv;
  5. $dec = mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_DECRYPT, $iv);
  6. return $dec;
  7. }



Mam ustawione $key. Nie ustawiam $iv bo nie wiem co to jest. Jakieś 70% danych deszyfruje się ok. W pozostałych mam jednak dziwne znaki, np.: ��r���

Baza ma kodowanie utf8. W sktypcie odczytującym (deszyfrującym) mam ustawienie:

  1. mysql_query('SET NAMES utf8');
  2. mysql_query("SET CHARACTER_SET utf8_unicode_ci");


Kodowanie strony też ustawione na utf-8.

Uprzejmie proszę o pomoc. Z góry dziękuję.

Pozdr
Piotr
Crozin
1. Wywal tego trima, który może usunąć Ci część wartościowych danych.
2. Dlaczego korzystasz z funkcji, której użycie jest oficjalnie odradzane? http://php.net/manual/en/function.mcrypt-cbc.php
piotras
Wywalenie trima pomogło. Deszyfruje poprawnie.

Dzięki za pomoc.

Jakiej funkcji powinienem użyć w takim razie?
sowiq
Tak ciężko kliknąć w linka podanego na tacy?

Cytat
This function should not be used anymore, see mcrypt_generic() and mdecrypt_generic() for replacements.
piotras
tak, teraz zauważyłem.

Przepraszam, ze idiotyczne pytanie.

Skorzystałem z przykładu zamieszczonego na powyższych stronach:

  1. $cc = 'my secret text';
  2. $key = 'my secret key';
  3. $iv = '12345678';
  4.  
  5. $cipher = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');
  6.  
  7. mcrypt_generic_init($cipher, $key, $iv);
  8. $encrypted = mcrypt_generic($cipher,$cc);
  9. mcrypt_generic_deinit($cipher);
  10.  
  11. mcrypt_generic_init($cipher, $key, $iv);
  12. $decrypted = mdecrypt_generic($cipher,$encrypted);
  13. mcrypt_generic_deinit($cipher);
  14.  
  15. echo "encrypted : ".$encrypted;
  16. echo "<br>";
  17. echo "decrypted : ".$decrypted;


Jednak tym razem też dostaję krzaki: �[p�q�H�����

Co robić?
sowiq
A mi Twój kod pokazuje coś takiego
Kod
encrypted : ë[pÈq“HãˆÝÔã–
decrypted : my secret text


Podejrzewam, że Twoja przeglądarka ustawiła sobie domyślne kodowanie znaków inne niż UTF-8.
piotras
Mam ustawione domyślnie na UTF-8

Dla testu zmieniłem ustawienie na nasze ISO środkowoeuropejskie i krzaki zniknęły (pojawiło się to, co tobie).

Zmieniłem więc kodowanie pliku php na ISO-8859-2 w nadziei, że zadziała przy domyślnych ustawieniach przeglądarki ale to nie pomogło.

Co zrobić, aby wyświetlało się to poprawnie przy domyślnym ustawieniu przeglądarki na UTF?

Z góry dziękuję za pomoc.
sowiq
Kolego, ale co Cię obchodzi jakie krzaki otrzymasz po zakodowaniu? To mogą być jakieś binarne dane, które przeglądarka próbuje zinterpretować jako znaki. W zależności od rodzaju kodowania, przeglądarka może to wyświetlać jako znaki typu ã bądź �. Dla Ciebie najważniejsze jest, czy po użyciu tego ciągu jesteś w stanie odkodować ciąg wejściowy.

PS. nie dość, że u siebie masz krzaczki, to jeszcze i na forum popsułeś polskie znaki wink.gif
piotras
Czyli jeżeli chce te zaszyfrowane dane wstawić do bazy to pola w bazie nie mogą być varchar/test tylko blob, tak?


Crozin
Masz dwie opcje:
1. Skorzystać z jakiegoś typu kolumny przeznaczonego na dane binarne, np. wspomniany przez Ciebie BLOB.
2. Potraktować dane base64_encode po zaszyfrowaniu i base64_decode przed ich odszyfrowaniem.

Pierwsze rozwiązanie może być nieco uciążliwe w przypadku gdy będziesz chciał te dane gdzieś przesyłać/przechowywać w przypadku gdzie środowisko jest nastawione do pracy z danymi tekstowymi, nie binarnymi. Drugie generuje nieco obciążenia dla maszyny i dysku/sieci (związane jest to z koniecznością za(od)kodowania base64 oraz zwiększonym rozmiarem (w bajtach) danych zakodowanych base64).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.