Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle Database Security — szyfrowanie i deszyfrowanie

Szyfrowanie danych jest bardzo ważne, ponieważ jest sposobem ochrony danych bieżących i archiwalnych w celu zapewnienia ich poufności. Zapobiega to nieautoryzowanemu dostępowi i użyciu. W tym artykule pokrótce przedstawię kilka ważnych aspektów szyfrowania i deszyfrowania danych.

Systemy szyfrowania

W systemie szyfrowania istnieją dwa główne składniki:algorytm szyfrowania, czyli metoda używana do zmiany wartości, oraz klucz szyfrowania , którego bezpieczeństwo zależy od podatności zaszyfrowanych danych.

Oracle obsługuje dwa typy algorytmów szyfrowania:algorytmy symetryczne (użyj tego samego klucza do szyfrowania i odszyfrowywania danych) do szyfrowania przechowywanych danych i algorytmów asymetrycznych Generowane są 2 klucze:klucz prywatny używany do odszyfrowania i klucz publiczny, który będzie używany przez nadawcę wiadomości w celu zaszyfrowania wiadomości) używany do logowania do bazy danych oraz do komunikacji między bazą danych a klientem.

Algorytmy szyfrowania symetrycznego dostępne w Oracle to:Standard szyfrowania danych (DES ), który szyfruje blok 64-bitowy tekstu na 64-bitowe zaszyfrowanego tekstu przy użyciu klucza 56-bitowego, Triple Data Encryption Standard (3-DES ), bardziej zaawansowana wersja DES i Advanced Encryption Standard (AES ), który szyfruje blok 128 bitów tekstu na 128 bitów zaszyfrowanego tekstu za pomocą klucza 128,129 lub 256 bitów.

Można zauważyć, że wspomniane algorytmy szyfrujące wykorzystują bloki o stałym wymiarze, w związku z czym tekst, który ma zostać zaszyfrowany, zostanie podzielony na bloki o określonym wymiarze, wymaganym przez używany algorytm, a następnie algorytm zostanie zastosowany na każdym uzyskanym blokować.

Co jednak, jeśli wymiar danych nie jest wielokrotnością wymaganego wymiaru bloku? technika dopełniania musi być użyty w celu wypełnienia ostatniego segmentu tekstu, aż osiągnie wymiar bloku. Można wybrać dopełnienie zerami lub użyć schematu dopełniania o nazwie PKCS#5. Schemat oblicza różnicę dla ostatniego segmentu tekstu

d =dim_block – dim_data MOD dim_block

i wypełnia każdy brakujący bajt wartością szesnastkową 0x0d ,

gdzie dim_block jest wymiarem bloku w bajtach, wymaganym przez algorytm

i wypełnia każdy brakujący bajt wartością szesnastkową 0x0d ,

gdzie dim_block jest wymiarem bloku w bajtach, wymaganym przez algorytm

Co jednak, jeśli zwykły tekst składa się z kilku bloków do zaszyfrowania? technika tworzenia łańcuchów jest używany, który określa, czy szyfrowanie bloku jest zależne, czy nie, od szyfrowania poprzednich bloków.

Następujące typy łączenia to dostępne w Oracle:

  • Elektroniczna książka kodów (CHAIN_ECB):każdy blok jest szyfrowany niezależnie od pozostałych bloków. Wadą jest to, że można zidentyfikować powtarzające się wzorce we fragmencie tekstu.
  • Łańcuch bloków szyfrów (CHAIN_CBC):dla każdego bloku, przed szyfrowaniem, stosowany jest operator XOR z wektorem. Dla pierwszego bloku z sekwencji używany jest wektor inicjujący, natomiast dla bloku z reszty sekwencji jako wektor bitów używany jest wynik szyfrowania poprzedniego bloku
  • Opinia o szyfrowaniu (CHAIN_CFB):podobnie jest z CBC, z wyjątkiem tego, że operator XOR jest stosowany po szyfrowaniu blokowym.
  • Wyjście opinii (CHAIN_OFB):podobnie jest z CFB, z wyjątkiem tego, że wynik poprzedniego bloku jest szyfrowany przed zastosowaniem operatora XOR

Do szyfrowania i deszyfrowania danych możemy wykorzystać pakiet DBMS_CRYPTO dostępny w ORACLE. Aby użyć tego pakietu, SYSDBA musi przyznać użytkownikom prawa do wykonywania za pomocą polecenia:

GRANT EXECUTE  ON dbms_crypto TO username;

W przypadku szyfrowania dbms_crypto.encrypt jest używany, który ma następujące parametry:

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

Aby odszyfrować, dbms_crypto.decrypt jest używany, który ma następujące parametry:

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

Tryb pracy składa się z:

kod algorytmu + kod dopełnienia + kod łańcucha

Oto kilka przykładów szyfrowania i odszyfrowywania danych:

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 

Wyzwania dotyczące szyfrowania danych

Zarządzanie kluczami szyfrowania danych

Użytkownikom bazy danych trudno jest ręcznie wygenerować wydajne klucze szyfrowania, które mają długość wymaganą dla algorytmu szyfrowania. Jeśli chodzi o ręczne dostarczenie klucza szyfrującego jako zestawu ciągów (przekształconego następnie w RAW), długość zestawu oblicza się według następującego wzoru:

L_set =Długość_klucza_w_bitach / 8 (znaków)

Na przykład dla ENCRYPT_AES128 klucz ma 128 bitów, a zestaw będzie miał długość L_set =128/8 =16 znaków.

Jeśli podany zostanie klucz „1234567890123456”, zostanie on zaakceptowany, podczas gdy klucz „1234” wygeneruje wyjątek „Zbyt krótka długość klucza”.

W przypadku pozostałych algorytmów poniższa tabela podaje efektywną długość klucza:

Generowanie i przesyłanie kluczy

Dane są bezpiecznie szyfrowane, o ile klucz używany do szyfrowania jest bezpieczny. Dlatego klucz szyfrowania musi być bezpiecznie wygenerowany. Pakiet funkcji RANDOMBYTES DBMS_CRYPTO oferuje bezpieczne generowanie liczb losowych i implementuje algorytm generatora liczb losowych. Programiści nie mogą używać pakietu DBMS_RANDOM, ponieważ generuje on liczby pseudolosowe, co może skutkować pseudo-zabezpieczeniem.

Funkcja RANDOMBYTES jest używana w następujący sposób:

klucz RAW (nr_bytes);

klucz:=DBMS_CRYPTO.randombytes (nr_bytes);

gdzie nr_bytes reprezentuje liczbę bajtów klucza szyfrującego

Gdy klucz jest przekazywany z aplikacji do bazy danych, musi być zaszyfrowany, aby nie został skradziony podczas przesyłania. Oracle Advanced Security zapewnia szyfrowanie sieciowe, które chroni dane i klucze kryptograficzne w tranzycie sieciowym.

Po wygenerowaniu kluczy należy je przechowywać w bezpiecznym miejscu, ponieważ ich ujawnienie może zagrozić bezpieczeństwu zaszyfrowanych danych. Istnieją trzy opcje zachowania klucza:

  • na poziomie bazy danych:przechowywane w bazie danych (w specjalnej tabeli) lub w zewnętrznym pliku bazy danych
  • na poziomie rekordu:przechowywane w bazie danych (w specjalnej tabeli)
  • kombinacja dwóch poprzednich typów:istnieje klucz główny na poziomie bazy danych, a dla każdego rekordu istnieje klucz. Klucz hybrydowy jest używany zarówno do szyfrowania, jak i deszyfrowania:hybrid_key =master_key XOR record_key (dla funkcji XOR istnieje funkcja PL/SQL – UTL_RAW.bit_xor).

Jaki jest najbardziej wydajny klucz? To klucz hybrydowy. Jeśli cała baza danych zostanie skradziona, dane nie mogą zostać odszyfrowane, gdy klucz główny jest przechowywany w systemie plików. Jeśli klucz główny lub rekord klucza zostaną skradzione, reszta rekordu będzie nadal chroniona.

Przejrzyste szyfrowanie danych (TDE)

Innym zabezpieczeniem oferowanym przez Oracle jest Transparentne szyfrowanie danych (TDE) , obiekt dostępny w Oracle 10g. TDE umożliwia zadeklarowanie zaszyfrowanej kolumny na poziomie tabeli bazy danych. Podczas wstawiania danych do zaszyfrowanej kolumny Oracle automatycznie szyfruje dane i przechowuje ich szyfrowanie w bazie danych.

Każde zapytanie SELECT automatycznie odszyfruje dane. Należy pamiętać, że Przejrzyste szyfrowanie danych nie robi różnicy między użytkownikami i daje odszyfrowane dane bez względu na to, kto przeszukuje bazę danych. Żadna kolumna nie może być zaszyfrowana przez TDE:kolumny z klucza zewnętrznego (klucza obcego) nie mogą być zaszyfrowane tą metodą.

Na przykład:rozważ tabelę o nazwie KONTO ze schematem relacyjnym KONTO (id_account#, card_series, posiadacz, kwota), gdzie id_account jest uważane za klucz podstawowy, fakt oznaczony znakiem „#”. Załóżmy, że chcemy zadeklarować card_series i saldo kolumny do zaszyfrowania. Można to zrobić w następujący sposób:

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

Aby ta metoda działała, należy utworzyć i skonfigurować portfel.

Dlaczego Przejrzyste szyfrowanie danych zapobiec odszyfrowaniu danych w przypadku kradzieży bazy danych? Cóż, wszystkie zaszyfrowane kolumny z tabeli T używają tego samego klucza prywatnego Key_T. Jeśli mamy więcej tabel, …, które mają zaszyfrowane kolumny, to jest n kluczy prywatnych, Key_,…,Key_. Każdy klucz prywatny Key_, j=1,n jest szyfrowany kluczem głównym Key_Master, a wynik tego szyfrowania jest przechowywany w słowniku danych. Klucz główny jest przechowywany zewnętrznie w portfelu.

Teraz spójrzmy na kroki tego automatycznego szyfrowania. Są to:

  • uzyskanie Master Key_Master z zewnętrznego portfela
  • odszyfrowanie klucza prywatnego Key_ za pomocą klucza głównego
  • szyfrowanie danych do wstawienia za pomocą klucza prywatnego, Key_
  • przechowywanie zaszyfrowanych danych w kolumnach tabeli

Kroki automatycznego odszyfrowywania to:

  • uzyskanie klucza głównego Key_Master z zewnętrznego portfela
  • odszyfrowanie klucza prywatnego Key_ za pomocą klucza głównego
  • odszyfrowanie danych za pomocą klucza prywatnego, Key_
  • zwrócenie wyniku

A co z integralnością danych podczas szyfrowania? Tutaj używamy techniki haszowania.

Hashowanie

Szyfrowanie danych zapewnia poufność danych, ale nie gwarantuje ich integralności. Aby temu zapobiec, oprócz tego, że szyfrowane powinny być tylko oryginalne dane, możemy użyć techniki zwanej haszowaniem . są dwie ważne zalety:nie pozwala na rozszyfrowanie pierwotnych wartości i jest deterministyczny (co oznacza, że ​​powtarzalnie zastosowany do tych samych danych, generuje ten sam wynik). Oracle dopuszcza następujące algorytmy haszujące:MD5 i SHA-1.

Użycie:

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

Przykład:

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;

Szyfrowanie zindeksowanych danych

Nie zaleca się programistom szyfrowania zindeksowanych danych. Jeśli indeks kolumny zawiera zaszyfrowane wartości, indeks może być używany do prostego sprawdzania i nie nadaje się do innych celów.

Załóżmy na przykład, że firma używa osobistego numeru identyfikacyjnego jako numeru pracownika przechowywanego w tabeli bazy danych. Oczywiście liczby te są uważane za dane wrażliwe i poufne, a firma chce zaszyfrować kolumnę, w której są przechowywane. Ponieważ ta kolumna zawiera unikatowe wartości, można na niej wykonać indeks w celu uzyskania lepszej wydajności. Oznacza to, że indeks będzie zawierał zaszyfrowane dane i będzie zasadniczo bezużyteczny.

Wniosek

Podsumowując, bardzo ważna jest ochrona poufnych danych poprzez ich szyfrowanie i odszyfrowywanie. Należy być świadomym tego aspektu i odpowiednio wdrożyć bezpieczeństwo bazy danych.

Referencje:

  1. Tworzenie aplikacji za pomocą szyfrowania danych
  2. Feuerstein Steven (2009) Programowanie Oracle PL/SQL (wydanie piąte). Wydawnictwo O’Reilly. ISBN 978-0-596-51446-4. Rozdział 23 „Bezpieczeństwo aplikacji i PL/SQL”
  3. Tryb szyfrowania blokowego

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle nie usuwa kursorów po zamknięciu zestawu wyników

  2. WSTAW i AKTUALIZUJ rekord za pomocą kursorów w oracle

  3. Dialekt hibernacji dla Oracle Database 11g?

  4. Obsługa wyjątków wstawiania JDBC wsadowego

  5. Odzyskiwanie plików edytora SQL (zapytania, procedury) po awarii lub zawieszeniu się ropuchy w przypadku awarii lub zawieszenia Oracle