sql >> Database >  >> RDS >> Oracle

Oracle Database Security – versleuteling en ontsleuteling

Gegevenscodering is erg belangrijk omdat het een manier is om de huidige en de gearchiveerde gegevens te beschermen om de vertrouwelijkheid ervan te waarborgen. Dit voorkomt ongeoorloofde toegang en gebruik. In dit artikel zal ik kort enkele belangrijke aspecten van gegevensversleuteling en -ontsleuteling presenteren.

Encryptiesystemen

In een versleutelingssysteem zijn er twee hoofdcomponenten:het versleutelingsalgoritme, wat de methode is die wordt gebruikt om de waarde te wijzigen, en de encryptiesleutel , waarvan de veiligheid afhangt van de kwetsbaarheid van de versleutelde gegevens.

Oracle ondersteunt twee soorten coderingsalgoritmen:symmetrische algoritmen (gebruik dezelfde sleutel voor het versleutelen en ontsleutelen van gegevens) voor het versleutelen van opgeslagen gegevens en asymmetrische algoritmen (2 sleutels worden gegenereerd:een privésleutel die wordt gebruikt voor decodering en een openbare sleutel die door de afzender van het bericht zal worden gebruikt om het bericht te coderen) die wordt gebruikt voor het inloggen op de database en voor communicatie tussen een database en een client.

Symmetrische encryptie-algoritmen, beschikbaar in Oracle, zijn als volgt:Data Encryption Standard (DES ) die een blok van 64 bits van de tekst codeert in 64 bits van de gecodeerde tekst, met behulp van een sleutel van 56 bits, Triple Data Encryption Standard (3-DES ), een meer geavanceerde versie van DES, en Advanced Encryption Standard (AES ), die een blok van 128 bits van de tekst codeert in 128 bits van de gecodeerde tekst, met een sleutel van 128.129 of 256 bits.

Men kan opmerken dat de hierboven genoemde coderingsalgoritmen blokken met een vaste afmeting gebruiken, en daarom zal de tekst die moet worden gecodeerd worden verdeeld in blokken van een bepaalde afmeting, vereist door het gebruikte algoritme, en vervolgens zal het algoritme worden toegepast op elk verkregen algoritme. blok.

Maar wat als de gegevensdimensie geen veelvoud is van de vereiste dimensie van het blok? De opvultechniek moet worden gebruikt om het laatste segment van de tekst te vullen totdat het de afmeting van een blok bereikt. Men kan ervoor kiezen om op te vullen met nullen of om het opvulschema genaamd PKCS#5 te gebruiken. Het schema berekent het verschil voor het laatste tekstsegment

d =dim_block – dim_data MOD dim_block

en vult elke ontbrekende byte met de hexa-waarde 0x0d ,

waar dim_block is de afmeting in bytes voor het blok, vereist door het algoritme

en vult elke ontbrekende byte met de hexa-waarde 0x0d ,

waar dim_block is de afmeting in bytes voor het blok, vereist door het algoritme

Maar wat als de platte tekst uit meerdere te versleutelen blokken bestaat? De ketentechniek wordt gebruikt, die vaststelt of de versleuteling van een blok al dan niet afhankelijk is van de versleuteling van de vorige blokken.

De volgende ketens zijn beschikbaar in Oracle:

  • Elektronisch codeboek (CHAIN_ECB):elk blok wordt onafhankelijk van de rest van de blokken versleuteld. Het nadeel is dat men zich herhalende patronen in het tekstfragment kan herkennen.
  • Cipher Block Chaining (CHAIN_CBC):voor elk blok, vóór codering, wordt een XOR-operator toegepast met een vector. Voor het eerste blok uit de reeks wordt een initialisatievector gebruikt, terwijl voor een blok uit de rest van de reeks het versleutelingsresultaat van het vorige blok wordt gebruikt als een vector van bits
  • Vercijferingsfeedback (CHAIN_CFB):het is vergelijkbaar met CBC, behalve dat de XOR-operator wordt toegepast na de blokcodering.
  • Uitvoerfeedback (CHAIN_OFB):het is vergelijkbaar met CFB, behalve dat het resultaat van het vorige blok wordt versleuteld voordat de XOR-operator wordt toegepast

Om gegevens te coderen en te decoderen, kunnen we het DBMS_CRYPTO-pakket gebruiken dat beschikbaar is in ORACLE. Om dit pakket te gebruiken, moet SYSDBA gebruikers met uitvoeringsrechten verlenen, met behulp van het commando:

GRANT EXECUTE  ON dbms_crypto TO username;

Voor versleuteling, dbms_crypto.encrypt wordt gebruikt, die de volgende parameters heeft:

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

Voor ontsleuteling, dbms_crypto.decrypt wordt gebruikt, die de volgende parameters heeft:

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

Een bedrijfsmodus wordt gevormd door:

algoritmecode + opvulcode + kettingcode

Hier zijn enkele voorbeelden voor het versleutelen en ontsleutelen van gegevens:

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 

Uitdagingen voor gegevenscodering

Beheer van versleutelingssleutels voor gegevens

Het is moeilijk voor de databasegebruikers om handmatig efficiënte coderingssleutels te genereren, die de vereiste lengte hebben voor het coderingsalgoritme. Wat betreft het handmatig aanleveren van de encryptiesleutel als stringset (vervolgens omgezet in RAW), wordt de lengte van de set berekend met de volgende formule:

L_set =Length_key_in_bits / 8 (tekens)

Voor ENCRYPT_AES128 heeft de sleutel bijvoorbeeld 128 bits en heeft de set de lengte L_set =128/8 =16 tekens.

Als de sleutel '1234567890123456' wordt opgegeven, wordt deze geaccepteerd, terwijl de sleutel '1234' de uitzondering 'sleutellengte te kort' geeft.

Voor de rest van de algoritmen geeft de volgende tabel de effectieve sleutellengte:

Sleutelgeneratie en overdracht

Gegevens worden veilig versleuteld zolang de sleutel die voor de versleuteling wordt gebruikt, veilig is. Daarom moet de coderingssleutel veilig worden gegenereerd. Het RANDOMBYTES van het DBMS_CRYPTO-functiepakket biedt een veilige generatie van willekeurige getallen en implementeert het algoritme voor het genereren van willekeurige getallen. Ontwikkelaars mogen het pakket DBMS_RANDOM niet gebruiken omdat het pseudo-willekeurige getallen genereert, wat kan leiden tot pseudo-beveiliging.

De RANDOMBYTES-functie wordt als volgt gebruikt:

sleutel RAW (nr_bytes);

key:=DBMS_CRYPTO.randombytes (nr_bytes);

waarbij nr_bytes staat voor het aantal bytes van de coderingssleutel

Wanneer de sleutel van een toepassing naar de database wordt doorgegeven, moet deze worden gecodeerd om niet te worden gestolen wanneer deze wordt verzonden. Oracle Advanced Security biedt netwerkcodering, die de gegevens en de cryptografische sleutels in hun netwerktransit beschermt.

Zodra de sleutels zijn gegenereerd, moeten ze veilig worden bewaard, omdat openbaarmaking de veiligheid van de versleutelde gegevens in gevaar kan brengen. Er zijn drie opties om de sleutel te behouden:

  • op databaseniveau:opgeslagen in de database (in een speciale tabel) of in een extern databasebestand
  • op recordniveau:opgeslagen in de database (in een speciale tabel)
  • een combinatie tussen de vorige twee typen:er is een hoofdsleutel op databaseniveau en voor elk record is er een sleutel. Er wordt een hybride sleutel gebruikt voor zowel codering als decodering:hybrid_key =master_key XOR record_key (voor de XOR-functie is er een PL/SQL-functie – UTL_RAW.bit_xor).

Wat is de meest efficiënte sleutel? Het is de hybride sleutel. Als de hele database wordt gestolen, kunnen de gegevens niet worden ontsleuteld wanneer de hoofdsleutel in het bestandssysteem is opgeslagen. Als de hoofdsleutel of een sleutelrecord wordt gestolen, is de rest van het record nog steeds beschermd.

Transparante gegevenscodering (TDE)

Een andere beveiligingsfaciliteit die door Oracle wordt aangeboden, is de Transparent Data Encryption (TDE) , een faciliteit die beschikbaar is bij Oracle 10g. TDE maakt het mogelijk om een ​​versleutelde kolom op tabelniveau van de database te declareren. Bij het invoegen van gegevens in de versleutelde kolom, versleutelt Oracle de gegevens automatisch en slaat hun versleuteling op in de database.

Elke SELECT-query decodeert de gegevens automatisch. Het is belangrijk om te onthouden dat de Transparante gegevenscodering maakt geen verschil tussen gebruikers en geeft de gedecodeerde gegevens, ongeacht wie de database ondervraagt. Geen enkele kolom kan worden versleuteld door TDE:kolommen van de externe sleutel (buitenlandse sleutel) kunnen niet worden versleuteld met deze methode.

Bijvoorbeeld:beschouw een tabel met de naam ACCOUNT met het relationele schema ACCOUNT (id_account#, card_series, bezitter, bedrag), waarbij id_account wordt beschouwd als de primaire sleutel, aangegeven met het '#'-teken. Laten we aannemen dat we de card_series . willen declareren en saldo kolommen te versleutelen. Dit kan als volgt:

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

Om deze methode te laten werken, moet een portemonnee worden gemaakt en geconfigureerd.

Waarom doet transparante gegevenscodering voorkomen dat de gegevens worden ontsleuteld als de database wordt gestolen? Welnu, alle versleutelde kolommen van een tabel T gebruiken dezelfde privésleutel Key_T. Als we meer tabellen hebben, ,..., die versleutelde kolommen hebben, dan zijn er n privésleutels, Key_,...,Key_. Elke privésleutel Key_, j=1,n wordt versleuteld met de hoofdsleutel, Key_Master, en het resultaat van deze versleuteling wordt opgeslagen in de datadictionary. De hoofdsleutel wordt extern opgeslagen in een portemonnee.

Laten we nu eens kijken naar de stappen voor deze automatische codering. Dit zijn:

  • het verkrijgen van de hoofdsleutel Key_Master van de externe portemonnee
  • decodering van de privésleutel, Key_, met behulp van de hoofdsleutel
  • codering van de gegevens die moeten worden ingevoegd met behulp van de persoonlijke sleutel, Key_
  • de versleutelde gegevens opslaan in de tabelkolommen

De stappen voor automatische decodering zijn:

  • het verkrijgen van de hoofdsleutel, Key_Master, van de externe portemonnee
  • decodering van de privésleutel, Key_, met behulp van de hoofdsleutel
  • decodering van de gegevens met behulp van de persoonlijke sleutel, Key_
  • het resultaat retourneren

Hoe zit het met de gegevensintegriteit tijdens het versleutelen? Hier gebruiken we de hash-techniek.

Hashen

Gegevensversleuteling zorgt voor de vertrouwelijkheid van gegevens, maar garandeert niet hun integriteit. Om dit probleem te voorkomen, kunnen we, naast het feit dat alleen originele gegevens versleuteld moeten worden, een techniek gebruiken die hashing wordt genoemd. . er zijn twee belangrijke voordelen:het maakt het niet mogelijk om de oorspronkelijke waarden te ontcijferen en het is deterministisch (wat betekent dat herhaaldelijk toegepast op dezelfde gegevens hetzelfde resultaat oplevert). Oracle staat de volgende hash-algoritmen toe:MD5 en SHA-1.

Gebruik:

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

Voorbeeld:

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;

Geïndexeerde gegevens versleutelen

Het wordt niet aanbevolen voor ontwikkelaars om geïndexeerde gegevens te versleutelen. Als een index van een kolom versleutelde waarden bevat, kan de index worden gebruikt voor eenvoudige controle en is deze onbruikbaar voor andere doeleinden.

Stel dat een bedrijf het persoonlijke identificatienummer gebruikt voor het werknemersnummer dat is opgeslagen in een databasetabel. Het is duidelijk dat die nummers als gevoelige en vertrouwelijke gegevens worden beschouwd en het bedrijf wil de kolom waarin deze is opgeslagen versleutelen. Omdat deze kolom unieke waarden bevat, kan er een index op worden uitgevoerd om betere prestaties te krijgen. Dit betekent dat de index versleutelde gegevens zal bevatten en in principe onbruikbaar zou zijn.

Conclusie

Tot slot is het erg belangrijk om gevoelige gegevens te beschermen door ze te versleutelen en te ontsleutelen. Men moet zich bewust zijn van dit aspect en de databasebeveiliging dienovereenkomstig implementeren.

Referenties:

  1. Applicaties ontwikkelen met gegevenscodering
  2. Feuerstein Steven (2009) Oracle PL/SQL-programmering (5e editie). O'Reilly Publishing. ISBN 978-0-596-51446-4. Hoofdstuk 23 „Applicatiebeveiliging en PL/SQL”
  3. Blokcode werkingsmodus

  1. mysql_fetch_assoc():opgegeven argument is geen geldige MySQL-resultaatbron in php

  2. Lokale tijdelijke tabel in Oracle 10 (voor de reikwijdte van Stored Procedure)

  3. SQL DELETE voor beginners

  4. Een jaar aftrekken van een datum in MariaDB