Autor Zpráva
potom
Profil
Dobrý den, data mám šifrována na úrovni PHP pomocí funkce

function encr($data) {
$key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$encryption_key = base64_decode($key);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);}

a následně jsou uložena do databáze.


Chci se zeptat, zda je reálne data dešifrovat na úrovni MYSQL, abych v nich mohl vyhledávat.


Zkoušel jsem to pomocí AES_ENCRYPT, ale asi něco dělám špatně, nebo tomu moc nerozumím, možná mám použít DECRYPT, nebo to možná ani nejde? Vlastně mi tam chybí ještě dekodování base64. Poradí mi prosím někdo, jak ten dotaz naformulovat, pokud to vůbec jde?


$sql =  "SELECT * FROM `reservation` WHERE  email = AES_ENCRYPT('".$vyhledavany_nesifrovany_retezec."', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  ";


Děkuji za případné rady.
lionel messi
Profil
potom:
Vlastně mi tam chybí ještě dekodování base64.

S tým by ti mala pomôcť funkcia FROM_BASE64.

možná mám použít DECRYPT

Áno, určite treba v tvojom prípade AES_DECRYPT. Pomocou funkcie ENCRYPT ich ešte raz zašifruješ.

Čo robia funkcie decode/decrypt a encode/encrypt (platí aj pre PHP, nielen SQL) sa dá ľahko zapamätať aj bez znalosti angličtiny:

• Ak chcem niečo dešifrovať či dekódovať, potrebujem funkciu de*.
• Inak potrebujem funkciu en*.
Kajman
Profil
Nemůže se takto klíč objevit v lozích serveru?
potom
Profil
Asi určitě, snažím se vytvářet překážky k vykradení osobních údajů. Toto je taková rychlovka, která mě napadla a kterou jsem byl schopný rychle realizovat, ale neumím v takto šifrovaných datech vyhledávat.

Resp. jsem smolil něco ve smyslu....

.... WHERE email = AES_DECRYPT(FROM_BASE64('".$vyhledavany_nesifrovany_retezec."'), 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') USING 'utf8'   )

ale to nefunguje.


Poradíte lepší řešení, aby byla zachována možnost třeba fulltextového vyhledávání v databázi? Potřebuji mít šifrována jen tři pole v tabulce - jmeno, email, telefon. Ostatní bych měl rád nešifrované.

Není to bankovnictví, ale v dnešní době GDPR se snažím být opatrný...

Díky za rady
potom
Profil
Tak se s tím stále peru, začal jsem šifrovat takto

UPDATE `reservation` SET `name_encrypted`= HEX(AES_ENCRYPT ('Novák', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')) WHERE (`id`='20604')

ale nedaří se mi to vypsat. Poradíte, kde dělám chybu?

SELECT name_encrypted, UNHEX(AES_DECRYPT(name_encrypted, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')) FROM reservation;
Kajman
Profil
Přijde mi to nesmyslné. Stejně ten tajný klíč máte jak v aplikaci, co se připojuje k databázi, tak v dotazech, co děláte. Jen to bude nesmyslně pomalé, ale bezpečnost se tím zrovna moc nezvýší.

Smysl by dávalo snad jen šifrování celé databáze nebo disku. Samozřejmě na vlastním stroji, ale pokud to myslíte s bezpečnostní vážně, jiste nepoužíváte sdílený webhosting.
Keeehi
Profil
potom:
Souhlasím s Kajmanem, že je to zbytečnost co děláš.

Co se chyby týče, tak funkce pro rozšifrování musíš volat v opačném pořadí, než při šifrování.
SELECT name_encrypted, AES_DECRYPT(UNHEX(name_encrypted, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')) FROM reservation;

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0