Šifrování dat v databázi – jak správně udělat insert

n.u.r.v.
Člen | 485
+
0
-

Ahoj, v naší aplikaci budeme zavádět šifrování některých dat v DB. Zkoušel jsem AES_ENCRYPT/AES_DECRYPT (potřebujeme obousměrné šifrování)…

Načítání mi funguje dobře, ale nevím jak správně udělat ukládání.

V původní verzi máme ukládání takto:

public function addNeco($data){ //$data = array
	return $this->db->table("cilova_tabulka")->insert($data);
}

Ale jak to mám provést, když šifruji data takto:

AES_ENCRYPT("text", SHA2('muj_supertajny_kod',512));

Zkusil jsem to takto – funguje:

$data["BODY"] = new \Nette\Database\SqlLiteral("AES_ENCRYPT('text', SHA2('muj_supertajny_kod',512))");

Funguje to, ale asi to není správně – např není ošetřený text (který je z formuláře).

Jak by se to mělo dělat správně? díky

Edit:
Pokud myslíte, že takhle by se data něměla šifrovat, nebo se to dělá jinak, klidně to sem napište – potřebujeme obousměrné šifrování, mohou se vyskytovat delší texty s diakritikou… Nic lepšího než mysql AES_ENCRYPT/AES_DECRYPT jsem nenašel zatím…

Editoval n.u.r.v. (19. 2. 2018 14:30)

jiri.pudil
Nette Blogger | 1028
+
+1
-

Nezvažovali jste možnost šifrovat v aplikaci a posílat do databáze už zašifrovaná data?

n.u.r.v.
Člen | 485
+
0
-

Taky možnost, právě se rozhodujem – myslel jsem, že DB bude rychlejší…

+ ještě jeden problém – teď běží aplikace na php 5.6 – použil by se mcrypt, ale pokud budeme v budoucnu nasazovat nové php tak to bude php 7.2 (hosting dával php 5.6 a 7 a 7.1 vynechal, teď dává 7.2), a tam už mcrypt nenía používá se něco jiného (sodium? pro které ani ještě není dokumentace) – takže to budeme zase předělávat… Nebo se pletu?

Editoval n.u.r.v. (19. 2. 2018 15:55)

Jan Endel
Člen | 1016
+
+2
-

Pokud chceš šifrovat aplikačně, kouknul bych na toto: https://github.com/…gonie/halite jednoduše a bezpečně.

(Zdroj: https://twitter.com/…978917085186)

n.u.r.v.
Člen | 485
+
0
-

@JanEndel Takže myslíž že lepší je šifrovat přes php než přímo přes DB?

n.u.r.v.
Člen | 485
+
0
-

Zapomněl jsem jednu důležitou věc – data do DB potřebuji uložit šifrovaně ale pak k nim bude přistupovat desktopová aplikace a ta to musí dešifrovat – takže proto bude lepší použít k šifrování přímo funkce databáze…

leninzprahy
Člen | 150
+
0
-

Taky jsme používali šifrování v databázi (AES_ENCRYPT/AES_DECRYPT), ale párkrát se stalo, že po aktualizaci databáze se dekódování úplně nezdařilo. Přešli jsme na šifrování v aplikaci a spokojenost.

Nikdy jsme pořádně nepřišli na to, čím to bylo, o stroj s databází se staral někdo jiný. Jednalo se o MySql/MariaDB.

David Matějka
Moderator | 6445
+
+2
-

k puvodnimu dotazu k sql literal: mely by fungovat parametry

$data["BODY"] = new \Nette\Database\SqlLiteral("AES_ENCRYPT(?, SHA2('muj_supertajny_kod',512))", ['foo']);
n.u.r.v.
Člen | 485
+
0
-

@DavidMatějka Díky moc – funguje to :-)

n.u.r.v.
Člen | 485
+
0
-

Ahoj, abych nezakládal nové téma tak to dám sem protože to souvisí…

Zasekl jsem se na zápisu select()když potřebuji použít AES_DECRYPT

Například:

return $this->db->table("user")->where(...)->select(AES_DECRYPT(EMAIL, SHA2("'.$muj_tajny_kod.'",512)) AS EMAIL)->fetch();

Dostávám chybu No reference found for $user->y8G

Problém je v tom SHA2 $muj_tajny_kod – obsahuje speciální znaky který dělají problém, protože když to nahradím řetězcem např xyz tak dotaz funguje…

Zkoušel jsem různé kombinace SqlLiteral(), ale zatím se taky nedaří – většinou dostanu chybu že nesedí počet parametrů…

Jak to správně zapsat? díky za pomoc

Editoval n.u.r.v. (7. 3. 2018 14:13)

David Matějka
Moderator | 6445
+
+2
-

pouzij parametry:

->select('AES_DECRYPT(EMAIL, SHA2(?,512)) AS EMAIL', $muj_tajny_kod)
n.u.r.v.
Člen | 485
+
0
-

@DavidMatějka Díky, zachránil si mě… funguje to :-) Jsem si říkal k čemu tam ten druhý parametr v selectu je ale tohle mě nějak nenapadlo…