sql >> Database teknologi >  >> RDS >> Oracle

Oracle Database Security – Kryptering og dekryptering

Datakryptering er meget vigtig, fordi det er en måde at beskytte de aktuelle og de arkiverede data på for at sikre deres fortrolighed. Dette forhindrer uautoriseret adgang og brug. I denne artikel vil jeg kort præsentere nogle vigtige aspekter af datakryptering og dekryptering.

Krypteringssystemer

I et krypteringssystem er der to hovedkomponenter:krypteringsalgoritmen, som er den metode, der bruges til at ændre værdien, og krypteringsnøglen , hvis sikkerhed afhænger af sårbarheden af ​​de krypterede data.

Oracle understøtter to typer krypteringsalgoritmer:symmetriske algoritmer (brug den samme nøgle til kryptering og dekryptering af data) til kryptering af lagrede data og asymmetriske algoritmer (2 nøgler genereres:en privat nøgle, der bruges til dekryptering og en offentlig nøgle, der vil blive brugt af meddelelsesafsenderen til at kryptere meddelelsen) bruges til databaselogin og til kommunikation mellem en database og en klient.

Symmetriske krypteringsalgoritmer, tilgængelige i Oracle er som følger:Data Encryption Standard (DES ) som krypterer en blok på 64 bit af teksten til 64 bit af den krypterede tekst ved hjælp af en nøgle på 56 bit, Triple Data Encryption Standard (3-DES ), en mere avanceret version af DES og Advanced Encryption Standard (AES ), som krypterer en blok på 128 bit af teksten til 128 bit af den krypterede tekst ved hjælp af en nøgle på 128, 129 eller 256 bit.

Man kan bemærke, at de ovenfor nævnte krypteringsalgoritmer bruger blokke med fast dimension, og derfor vil teksten, der skal krypteres, blive opdelt i blokke af en bestemt dimension, som kræves af den brugte algoritme, og derefter vil algoritmen blive anvendt på hver opnået blokere.

Men hvad hvis datadimensionen ikke er et multiplum af den påkrævede dimension af blokken? polstringsteknikken skal bruges for at udfylde det sidste segment af teksten, indtil det når dimensionen af ​​en blok. Man kan vælge at udfylde med nuller eller at bruge udfyldningsskemaet kaldet PKCS#5. Skemaet beregner forskellen for det sidste tekstsegment

d =dim_block – dim_data MOD dim_block

og udfylder hver manglende byte med hexaværdien 0x0d ,

hvor dim_block er dimensionen i bytes for blokken, som kræves af algoritmen

og udfylder hver manglende byte med hexaværdien 0x0d ,

hvor dim_block er dimensionen i bytes for blokken, som kræves af algoritmen

Men hvad nu hvis den almindelige tekst består af flere blokke, der skal krypteres? kædeteknikken bruges, som fastslår, om krypteringen af ​​en blok er afhængig eller ej af krypteringen af ​​de tidligere blokke.

Følgende typer af kæde er tilgængelig i Oracle:

  • Elektronisk kodebog (CHAIN_ECB):hver blok er krypteret uafhængigt af resten af ​​blokkene. Ulempen er, at man kan identificere gentagne mønstre i tekstfragmentet.
  • Cipher Block Chaining (CHAIN_CBC):for hver blok, før kryptering, anvendes en XOR-operator med en vektor. For den første blok fra sekvensen bruges en initialiseringsvektor, mens for en blok fra resten af ​​sekvensen bruges krypteringsresultatet af den foregående blok som en vektor af bit
  • Ciferfeedback (CHAIN_CFB):det ligner CBC, bortset fra det faktum, at XOR-operatøren anvendes efter blokkrypteringen.
  • Outputfeedback (CHAIN_OFB):det ligner CFB, bortset fra det faktum, at resultatet af den forrige blok er krypteret, før XOR-operatøren anvendes

For at kryptere og dekryptere data kan vi bruge DBMS_CRYPTO-pakken, der er tilgængelig i ORACLE. For at bruge denne pakke skal SYSDBA give brugere execute-rettigheder ved at bruge kommandoen:

GRANT EXECUTE  ON dbms_crypto TO username;

For kryptering, dbms_crypto.encrypt bruges, som har følgende parametre:

dbms_crypto.encrypt(
clear_text IN RAW,
operating_mode IN PLS_INTEGER,
key IN RAW,
initialization_vector IN RAW DEFAULT NULL)
RETURN RAW;

Til dekryptering, dbms_crypto.decrypt bruges, som har følgende parametre:

dbms_crypto.decrypt(
clear_text IN RAW,
operating_mode IN PLS_INTEGER,
key IN RAW,
initialization_vector IN RAW DEFAULT NULL)
RETURN RAW;

En driftstilstand er dannet af:

algoritmekode + udfyldningskode + kædekode

Her er nogle eksempler på kryptering og dekryptering af data:

create or replace PROCEDURE encryption(text IN VARCHAR2, encrypted text OUT VARCHAR2) AS  
raw_set RAW(100);  
raw_password RAW(100);  
encryption_result RAW(100);  
encryption_password VARCHAR2(100) := '[email protected]%5,:QxV';  
operation_mode NUMBER; 
    BEGIN    
        raw_set:=utl_i18n.string_to_raw(text,'AL32UTF8');    
        raw_password := utl_i18n.string_to_raw(encryption_password,'AL32UTF8');        
        operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB;        
        encryption_result:=DBMS_CRYPTO.ENCRYPT(raw_set,operation_mode,raw_password);           
        dbms_output.put_line(encryption_result);    
        encryptedtext := RAWTOHEX (encryption_result);  
END; 

variable result_encryption varchar2(200) 
exec encryption('Text to be encrypted', :result_encryption); 
print result_encryption

create or replace PROCEDURE decryption (encrypted_text IN VARCHAR2, decrypted_text OUT VARCHAR2) AS   
raw_set RAW(100);   
raw_password RAW(100);   
decryption_result RAW(100);   
decryption_password VARCHAR2(100) := '[email protected]%5,:QxV';   
operation_mode NUMBER; 
    BEGIN   
        raw_set:=HEXTORAW(encrypted_text);   
        raw_password :=utl_i18n.string_to_raw(decryption_password,'AL32UTF8');   
        operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB;      
        decryption_result:=DBMS_CRYPTO.DECRYPT(raw_set,operation_mode,raw_password);   
        dbms_output.put_line(decryption_result);   
        decrypted_text := utl_i18n.raw_to_char (decryption_result,'AL32UTF8'); 
    END;  
variable result_decryption varchar2(200) 
exec decryption(:result_encryption,:result_decryption) 
print result_decryption 

Datakrypteringsudfordringer

Styring af krypteringsnøgler til data

Det er svært for databasebrugerne manuelt at generere effektive krypteringsnøgler, som har den nødvendige længde til krypteringsalgoritmen. Med hensyn til den manuelle levering af krypteringsnøglen som et strengsæt (derefter konverteret til RAW), beregnes længden af ​​sættet ved hjælp af følgende formel:

L_set =Length_key_in_bits / 8 (tegn)

For eksempel, for ENCRYPT_AES128, har nøglen 128 bit, og sættet vil have længden L_set =128/8 =16 tegn.

Hvis nøglen '1234567890123456' er leveret, vil den blive accepteret, mens nøglen '1234' vil kaste undtagelsen 'nøglelængde for kort'.

For resten af ​​algoritmerne giver følgende tabel den effektive nøglelængde:

Nøglegenerering og -transmission

Data er sikkert krypteret, så længe nøglen, der bruges til kryptering, er sikker. Derfor skal krypteringsnøglen være sikkert genereret. Funktionspakken RANDOMBYTES af DBMS_CRYPTO tilbyder en sikker generering af tilfældige tal og implementerer algoritmen til generering af tilfældige tal. Udviklere må ikke bruge DBMS_RANDOM-pakken, fordi den genererer pseudo-tilfældige tal, hvilket kan resultere i pseudo-sikkerhed.

RANDOMBYTES-funktionen bruges som følger:

nøgle RAW (nr_bytes);

key:=DBMS_CRYPTO.randombytes (nr_bytes);

hvor nr_bytes repræsenterer antallet af bytes af krypteringsnøglen

Når nøglen overføres fra en applikation til databasen, skal den krypteres for ikke at blive stjålet, når den transmitteres. Oracle Advanced Security leverer netværkskryptering, som beskytter dataene og de kryptografiske nøgler i deres netværkstransit.

Når nøglerne er genereret, skal de opbevares sikkert, fordi deres offentliggørelse kan kompromittere sikkerheden af ​​de krypterede data. Der er tre muligheder for at beholde nøglen:

  • på databaseniveau:gemt i databasen (i en speciel tabel) eller i en ekstern databasefil
  • på postniveau:gemt i databasen (i en speciel tabel)
  • en kombination mellem de to foregående typer:der er en hovednøgle på databaseniveau, og for hver post er der en nøgle. En hybridnøgle bruges til både kryptering og dekryptering:hybrid_key =master_key XOR record_key (til XOR-funktion er der en PL/SQL-funktion – UTL_RAW.bit_xor).

Hvad er den mest effektive nøgle? Det er hybridnøglen. Hvis hele databasen bliver stjålet, kan dataene ikke dekrypteres, når hovednøglen er gemt i filsystemet. Hvis hovednøglen eller en nøglepost bliver stjålet, vil resten af ​​posten stadig være beskyttet.

Transparent Data Encryption (TDE)

En anden sikkerhedsfacilitet, som Oracle tilbyder, er Transparent Data Encryption (TDE) , en facilitet tilgængelig fra Oracle 10g. TDE tillader at erklære en krypteret kolonne på tabelniveau i databasen. Når du indsætter data i den krypterede kolonne, krypterer Oracle automatisk dataene og gemmer deres kryptering i databasen.

Enhver SELECT-forespørgsel vil automatisk dekryptere dataene. Det er vigtigt at huske, at Transparent Data Encryption gør ikke forskel mellem brugere og giver de dekrypterede data, uanset hvem der udspørger databasen. Ikke nogen kolonne kan krypteres af TDE:kolonner fra den eksterne nøgle (fremmed nøgle) kan ikke krypteres ved hjælp af denne metode.

For eksempel:Overvej en tabel kaldet KONTO med relationsskemaet KONTO (id_konto#, kortserie, besidder, beløb), hvor id_konto betragtes som den primære nøgle, faktum angivet med '#' tegnet. Lad os antage, at vi ønsker at erklære kortserien og balance kolonner, der skal krypteres. Dette kan gøres med følgende:

ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128');
ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');

For at denne metode kan fungere, skal der oprettes og konfigureres en tegnebog.

Hvorfor gør Transparent Data Encryption forhindre dekryptering af data i tilfælde af at databasen bliver stjålet? Nå, alle de krypterede kolonner fra en tabel T bruger den samme private nøgle Key_T. Hvis vi har flere tabeller, ,..., der har krypterede kolonner, så er der n private nøgler, Key_,..., Key_. Hver privat nøgle Key_, j=1,n krypteres med hovednøglen, Key_Master, og resultatet af denne kryptering lagres i dataordbogen. Hovednøglen er eksternt gemt i en tegnebog.

Lad os nu se på trinene til denne automatiske kryptering. De er:

  • hentning af master Key_Master fra den eksterne tegnebog
  • dekryptering af den private nøgle, Key_, ved hjælp af hovednøglen
  • kryptering af de data, der skal indsættes ved hjælp af den private nøgle, Key_
  • lagring af de krypterede data i tabelkolonnerne

Trinnene til automatisk dekryptering er:

  • hentning af hovednøglen, Key_Master, fra den eksterne tegnebog
  • dekryptering af den private nøgle, Key_, ved hjælp af hovednøglen
  • dekryptering af data ved hjælp af den private nøgle, Key_
  • returnerer resultatet

Hvad med dataintegriteten under kryptering? Her bruger vi hashing-teknikken.

Hashing

Datakryptering sikrer fortroligheden af ​​data, men garanterer ikke deres integritet. For at forhindre dette problem, udover det faktum, at kun originale data skal krypteres, kan vi bruge en teknik kaldet hashing . der er to vigtige fordele:det tillader ikke at dechifrere de originale værdier, og det er deterministisk (hvilket betyder, at det gentagne gange anvendes på de samme data, genererer det samme resultat). Oracle tillader følgende hashing-algoritmer:MD5 og SHA-1.

Brug:

DBMS_CRYPTO.Hash (
original_set IN RAW,
operation_mode IN PLS_INTEGER) 
RETURN RAW;
where operation_mode is either                        
DBMS_CRYPTO.HASH_MD5 or DBMS_CRYPTO.HASH_SH1

Eksempel:

set serveroutput on
DECLARE
credit_card_no VARCHAR2(19) := '1234-5678-1234-5678';
credit_card_no_raw RAW(128) := utl_raw.cast_to_raw(credit_card_no);
encrypted_raw RAW(2048);
BEGIN
  encrypted_raw:=dbms_crypto.hash(credit_card_no_raw, dbms_crypto.hash_md5);
  dbms_output.put_line('MD5: ' || encrypted_raw);
END;

Kryptering af indekserede data

Det anbefales ikke for udviklere at kryptere indekserede data. Hvis et indeks af en kolonne indeholder krypterede værdier, kan indekset bruges til simpel kontrol og er ubrugeligt til andre formål.

Antag for eksempel, at en virksomhed bruger det personlige identifikationsnummer til medarbejdernummeret, der er gemt i en databasetabel. Disse tal betragtes naturligvis som følsomme og fortrolige data, og virksomheden ønsker at kryptere den kolonne, hvor den er gemt. Fordi denne kolonne indeholder unikke værdier, kan der udføres et indeks på den for at få bedre ydeevne. Det betyder, at indekset vil indeholde krypterede data og vil stort set være ubrugeligt.

Konklusion

For at afslutte med, er det meget vigtigt at beskytte følsomme data ved at kryptere og dekryptere dem. Man bør være opmærksom på dette aspekt og implementere databasesikkerheden i overensstemmelse hermed.

Referencer:

  1. Udvikling af applikationer ved hjælp af datakryptering
  2. Feuerstein Steven (2009) Oracle PL/SQL-programmering (5. udgave). O'Reilly Publishing. ISBN 978-0-596-51446-4. Kapitel 23 "Applikationssikkerhed og PL/SQL"
  3. Bloker chifferfunktion

  1. Kan ikke bruge tabellen med navnet bruger i postgresql hibernate

  2. Sådan listes alle databaser ved hjælp af PostgreSQL

  3. PostgreSQL:kørende antal rækker for en forespørgsel 'efter minut'

  4. Tjek, om et objekt er en primær nøgle med OBJECTPROPERTY() i SQL Server