Šifrování dat v databázi – jak správně udělat insert
- n.u.r.v.
- Člen | 485
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 | 1032
Nezvažovali jste možnost šifrovat v aplikaci a posílat do databáze už zašifrovaná data?
- n.u.r.v.
- Člen | 485
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
Pokud chceš šifrovat aplikačně, kouknul bych na toto: https://github.com/…gonie/halite jednoduše a bezpečně.
(Zdroj: https://twitter.com/…978917085186)
- leninzprahy
- Člen | 150
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
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
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
pouzij parametry:
->select('AES_DECRYPT(EMAIL, SHA2(?,512)) AS EMAIL', $muj_tajny_kod)