Criptare date tabel in c#

Sa spunem ca am un fisier excel cu 10.000 linii si 10 coloane, pe care vreau sa-l import in baza de date (SQL Server)

Initial, pentru fiecare coloana ii iau top1000 linii si ii aflu tipul (int, decimal, string, date, bool - cam la astea m-am rezumat), dupa care creez tabelul dinamic cu tipurile respective, si din nou, citesc fiecare linie a fisierului pentru a o adauga intr-o lista de obiecte (cu parametrii convertiti la tipurile de mai sus). Pentru inserare, lista asta o adaug intr-un DataTable, apoi folosesc SqlBulkCopy.

Mi se pare ca sunt deja destule operatiuni care, momentan nu dureaza foarte mult, maxim 2 secunde, dar vreau ca toate aceste date sa fie criptate. Deci, inca o actiune in plus (si inca una la citirea datelor din tabela / decriptare). Separat, am un alt tabel, in care salvez id-ul coloanei si tipul ei (aflat din cele 1000 randuri).

Exemplu:
Excel:
Id | Nume | Data
1 | Gigi | 20.07.1995
2 | Raluca | 14.05.2001

  1. citire coloane: Id, Nume, Data (de pe primul rand al Excelului)
  2. aflare tip coloana: calcul pentru top1000 id-uri, top1000 nume, top1000 data
  3. citire fisier si adaugare date intr-o lista de obiecte cu “n” parametri : rows = List
  4. compunere query si creare tabelul dinamic, coloanele avand tipurile de la pasul 2.
  5. trecere rows in DataTable, unde fiecare valoare o convertesc la tipul ei. Deci, ar fi 100000 convertiri doar la pasul asta)
  6. bulk insert in tabela.

Eh, la pasul 5 ar trebui sa se produca o schimbare. In locul convertirii la tipul respectiv, valoarea sa fie criptata (folosind o cheie locala, de pe server, sau setata de client, care la randul ei trebuie criptata) si sa fie salvata cu tipul nvarchar/byte[] … sau byte, aici sunt mai mult ca sigur ca gresesc, scriu doar din imaginatie :))) nu m-am documentat destul inca, ma gandesc totusi ca ar fi ceva asemanator cu criptarea parolei folosite pentru Identity User.

Ca exemplu … pentru criptarea tokenului, folosesc o cheie salvata in setarile serverului. Pentru parole am vazut ca se salveaza hash si salt in tabela, dar daca baza de date este sparta, prin combinarea celor doua nu se poate afla parola? :thinking:

Apoi, la citirea din tabela, ar trebui ca fiecare valoare sa fie decriptata + convertita la tipul ei (stocat in alta tabela).

Problema mea cea mare este ca nu stiu unde si sub ce forma sa stochez cheia. Pe langa asta,e loc mult de optimizat pentru operatiile de mai sus, dar astea fac parte dintr-un alt subiect

~ asta cred ca e una din regulile GDPR care trebuie aplicata pentru datele cu caracter personal?!?

merci :crazy_face:

Salut,

Sa lamurim cateva chestii:

Criptarea/decriptarea si hash-ul nu sunt aceleasi lucru.

Daca ai nevoie sa recuperezi informatia intr-un mod “citibil” atunci folosesti criptare/decriptare.

Daca ai nevoie sa stochezi o informatie confidentiala dar pe care nu ai vrea sa o stii (gen parole) folosesti hash-uri.

Daca ai nevoie sa criptezi atunci cheia de criptare nu ar trebui sa fie pe acelasi sistem (gen daca tii datele criptate in db, cheia de criptare nu o tii tot in DB, ci iti vine din alta parte)

Cheia poti sa o stochezi intr-o variabila de system, sau o trimiti ca o variabila temporara, sau o folosesti dintr-un fisier extern (gen ssh-keys) etc.

Vezi ca la nivel de baza de date poti sa folosesti criptarea in mai multe moduri: tot db-ul sa fie criptat, doar anumite tabele, sau doar anumite inregistrari din tabela (asta e cel mai “costisitor” ca si nivel de performanta).

Daca te referi strict la GDPR, poti sa faci si altfel, gen sa respecti data minimization + pseudo-anonimization, gen faci o tabela unde tii datele personale (nume, prenume, etc) pe baza de id-uri/indecsi si in celelalte tabele folosesti doar acele id-uri si doar aceea tabela o criptezi. Avantaj la performanta, doar aceea tabela e criptata dpdv baza de date. Dezavantaj: daca aplicatia care citeste din baza de date nu e securizata, atunci datele sunt decriptate de aplicatie si se pot pierde date.

Poti sa spui mai multe despre ce vrei sa faca exact aplicatia ta?

In functie de scopul aplicatiei se vor lua deciziile.

5 Likes

multumesc, foarte bine explicat :grin:

ca exemplu, utilizatorul importa o statistica tinuta in excel (date de vanzare, salarii, etc) si vreau sa ii las libertatea sa aleaga ce coloane contin date sensibile pentru a le cripta … sunt convins ca nimeni nu isi incarca evolutia vanzarilor pe un site cu credibilitate aproape 0 sau macar lipsa unei facilitati de genul acesteia. Iar pe baza datelor incarcate, isi va putea construi dashboarduri simple care sa-i releve evolutia. Ca o prima metoda de import m-am gandit la Excel, este cea mai la indemana pentru un punct de inceput. Pe urma, m-am gandit la importuri de la api-uri externe.

Deci ar fi a treia varianta spusa de tine “doar anumite inregistrari din tabela

Da,

Cam asa merg lucrurile, trebuie sa categorisesti datele dpdv utilitate/scop: date personale, date personale cu caracter special (Gen medicale, religioase, etnie, sex, etc) si date care daca ar fi decuplate nu ar insemna nimic.

Sa fie inteles mai bine o sa lum un exemplu de un csv cu nume prenume si salarii, si avem urmatoarele coloane:

nume, prenume, salariu, functie baza

cu inregistrari:
Ioan, Ionescu, programator, 2400
George, Popescu, programator, 2700
Alina, Grigore, programator, 2600

Daca o sa facem doua tabele: 1, cu date_salariat, 2 cu salarii, iar date_salariat ar fi encriptat, atunci nu ai deduce cine ce salariu ar avea. Gen:

date_salariat:
id, nume, prenume
1, Ioan, Ionescu
3, George, Popescu
5, Alina, Grigore

salarii
id, suma, functia
1, 2400, programator
3, 2700, programator
5, 2600, programator

Sper sa te ajute, tine cont unde si cand folosesti cheia de decriptare + decizii de performanta.