sql >> Databáze >  >> RDS >> Oracle

Oracle Database Security – šifrování a dešifrování

Šifrování dat je velmi důležité, protože je to způsob, jak chránit aktuální a archivovaná data, aby byla zajištěna jejich důvěrnost. Tím se zabrání neoprávněnému přístupu a použití. V tomto článku stručně představím některé důležité aspekty šifrování a dešifrování dat.

Šifrovací systémy

V šifrovacím systému existují dvě hlavní součásti:šifrovací algoritmus, což je metoda používaná ke změně hodnoty a šifrovací klíč , jehož bezpečnost závisí na zranitelnosti šifrovaných dat.

Oracle podporuje dva typy šifrovacích algoritmů:symetrické algoritmy (použijte stejný klíč pro šifrování a dešifrování dat) pro šifrování uložených dat a asymetrické algoritmy (Vygenerují se 2 klíče:soukromý klíč používaný k dešifrování a veřejný klíč, který použije odesílatel zprávy k zašifrování zprávy) používaný pro přihlášení do databáze a pro komunikaci mezi databází a klientem.

Symetrické šifrovací algoritmy dostupné v Oracle jsou následující:Data Encryption Standard (DES ), který zašifruje blok 64 bitů textu do 64 bitů zašifrovaného textu pomocí klíče 56 bitů, Triple Data Encryption Standard (3-DES ), pokročilejší verzi DES a Advanced Encryption Standard (AES ), který zašifruje blok 128 bitů textu do 128 bitů zašifrovaného textu pomocí klíče 128, 129 nebo 256 bitů.

Lze si všimnout, že výše uvedené šifrovací algoritmy používají bloky pevné dimenze, a proto bude text, který musí být zašifrován, rozdělen do bloků určité dimenze, požadované použitým algoritmem, a poté bude algoritmus aplikován na každý získaný blokovat.

Co když však datová dimenze není násobkem požadované dimenze bloku? technika vycpávky musí být použit k vyplnění posledního segmentu textu, dokud nedosáhne rozměru bloku. Je možné zvolit výplň nulami nebo použít schéma výplně nazvané PKCS#5. Schéma vypočítá rozdíl pro poslední textový segment

d =dim_block – dim_data MOD dim_block

a doplní každý chybějící bajt hexadecimální hodnotou 0x0d ,

kde dim_block je rozměr bloku v bajtech požadovaný algoritmem

a doplní každý chybějící bajt hexadecimální hodnotou 0x0d ,

kde dim_block je rozměr v bajtech pro blok, vyžadovaný algoritmem

Co když se však prostý text skládá z několika bloků, které mají být zašifrovány? technika řetězení se používá, což určuje, zda je šifrování bloku závislé nebo nezávisí na šifrování předchozích bloků.

Následující typy řetězení jsou k dispozici v Oracle:

  • Elektronická kódová kniha (CHAIN_ECB):každý blok je zašifrován nezávisle na ostatních blocích. Nevýhodou je, že ve fragmentu textu lze identifikovat opakující se vzory.
  • Cipher Block Chaining (CHAIN_CBC):pro každý blok se před šifrováním použije operátor XOR s vektorem. Pro první blok ze sekvence se použije inicializační vektor, zatímco pro blok ze zbytku sekvence se jako vektor bitů použije výsledek šifrování předchozího bloku
  • Zpětná vazba k šifrování (CHAIN_CFB):s CBC je to podobné, až na to, že po zašifrování bloku se použije operátor XOR.
  • Zpětná vazba k výstupu (CHAIN_OFB):s CFB je to podobné, až na to, že výsledek předchozího bloku je zašifrován před použitím operátoru XOR

K šifrování a dešifrování dat můžeme použít balíček DBMS_CRYPTO dostupný v ORACLE. Chcete-li použít tento balíček, musí SYSDBA udělit uživatelům spouštěcí práva pomocí příkazu:

GRANT EXECUTE ON dbms_crypto TO username;

Pro šifrování dbms_crypto.encrypt se používá, který má následující parametry:

dbms_crypto.encrypt(čistý_text V RAW,provozní_režim V PLS_INTEGER,klíč V RAW,inicializační_vektor V RAW DEFAULT NULL)RETURN RAW;

Pro dešifrování dbms_crypto.decrypt se používá, který má následující parametry:

dbms_crypto.decrypt(čistý_text V RAW,provozní_režim V PLS_INTEGER,klíč V RAW,inicializační_vektor V RAW DEFAULT NULL)RETURN RAW;

Provozní režim je tvořen:

kód algoritmu + kód výplně + kód řetězení

Zde je několik příkladů šifrování a dešifrování dat:

vytvořit nebo nahradit PROCEDURE šifrování(text IN VARCHAR2, zašifrovaný text OUT VARCHAR2) AS raw_set RAW(100); raw_password RAW(100); encryption_result RAW(100); šifrovací_heslo VARCHAR2(100) :='[email protected]%5,:QxV'; provozní_režim ČÍSLO; BEGIN raw_set:=utl_i18n.string_to_raw(text,'AL32UTF8'); raw_password :=utl_i18n.string_to_raw(šifrovací_heslo,'AL32UTF8'); operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB; encryption_result:=DBMS_CRYPTO.ENCRYPT(raw_set,provozní_režim,raw_password); dbms_output.put_line(výsledek_šifrování); zašifrovaný text :=RAWTOHEX (výsledek_šifrování); KONEC; proměnná result_encryption varchar2(200) exec encryption('Text k zašifrování', :result_encryption); print result_encryption

vytvořit nebo nahradit PROCEDURE dešifrování (zašifrovaný_text IN VARCHAR2, dešifrovaný_text OUT VARCHAR2) AS raw_set RAW(100); raw_password RAW(100); decryption_result RAW(100); dešifrovací_heslo VARCHAR2(100) :='[email protected]%5,:QxV'; provozní_režim ČÍSLO; BEGIN raw_set:=HEXTORAW(šifrovaný_text); raw_password :=utl_i18n.string_to_raw(dešifrovací_heslo,'AL32UTF8'); operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB; decryption_result:=DBMS_CRYPTO.DECRYPT(raw_set,provozní_režim,raw_password); dbms_output.put_line(výsledek_dešifrování); decrypted_text :=utl_i18n.raw_to_char (decryption_result,'AL32UTF8'); KONEC; proměnná result_decryption varchar2(200) exec decryption(:result_encryption,:result_decryption) print result_decryption 

Výzvy šifrování dat

Správa šifrovacích klíčů pro data

Pro uživatele databáze je obtížné ručně generovat efektivní šifrovací klíče, které mají požadovanou délku pro šifrovací algoritmus. Pokud jde o ruční dodání šifrovacího klíče jako sady řetězců (poté převedené do RAW), délka sady se vypočítá podle následujícího vzorce:

L_set =Length_key_in_bits / 8 (znaků)

Například pro ENCRYPT_AES128 má klíč 128 bitů a sada bude mít délku L_set =128/8 =16 znaků.

Pokud je zadán klíč „1234567890123456“, bude přijat, zatímco klíč „1234“ vyvolá výjimku „délka klíče je příliš krátká“.

Pro ostatní algoritmy je v následující tabulce uvedena efektivní délka klíče:

Generování a přenos klíčů

Data jsou bezpečně šifrována, pokud je zabezpečený klíč použitý k šifrování. Proto musí být šifrovací klíč bezpečně vygenerován. Balíček funkcí RANDOMBYTES DBMS_CRYPTO nabízí bezpečné generování náhodných čísel a implementuje algoritmus generátoru náhodných čísel. Vývojáři nesmí používat balíček DBMS_RANDOM, protože generuje pseudonáhodná čísla, což může vést k pseudo-zabezpečení.

Funkce RANDOMBYTES se používá následovně:

klíč RAW (nr_bytes);

klíč:=DBMS_CRYPTO.randombytes (nr_bytes);

kde nr_bytes představuje počet bajtů šifrovacího klíče

Když je klíč předán z aplikace do databáze, musí být zašifrován, aby při přenosu nebyl odcizen. Oracle Advanced Security poskytuje síťové šifrování, které chrání data a kryptografické klíče při jejich síťovém přenosu.

Jakmile jsou klíče vygenerovány, musí být uchovávány v bezpečí, protože jejich zveřejnění by mohlo ohrozit bezpečnost šifrovaných dat. Existují tři možnosti, jak si klíč ponechat:

  • na úrovni databáze:uloženo v databázi (ve speciální tabulce) nebo v externím databázovém souboru
  • na úrovni záznamu:uloženo v databázi (ve speciální tabulce)
  • kombinace mezi předchozími dvěma typy:existuje hlavní klíč na úrovni databáze a pro každý záznam existuje klíč. Pro šifrování i dešifrování se používá hybridní klíč:hybrid_key =master_key XOR record_key (pro funkci XOR existuje funkce PL/SQL – UTL_RAW.bit_xor).

Jaký je nejúčinnější klíč? Je to hybridní klíč. Pokud je ukradena celá databáze, nelze data dešifrovat, když je hlavní klíč uložen v systému souborů. Pokud je hlavní klíč nebo záznam klíče odcizen, zbytek záznamu bude stále chráněn.

Transparentní šifrování dat (TDE)

Další bezpečnostní funkcí nabízenou společností Oracle je Transparent Data Encryption (TDE) , zařízení dostupné od Oracle 10g. TDE umožňuje deklarovat zašifrovaný sloupec na úrovni tabulky databáze. Při vkládání dat do zašifrovaného sloupce Oracle automaticky zašifruje data a uloží jejich šifrování do databáze.

Jakýkoli dotaz SELECT automaticky dešifruje data. Je důležité si uvědomit, že Transparentní šifrování dat nedělá rozdíly mezi uživateli a poskytuje dešifrovaná data bez ohledu na to, kdo dotazuje databázi. Pomocí TDE nelze zašifrovat žádný sloupec:pomocí této metody nelze zašifrovat sloupce z externího klíče (cizího klíče).

Například:zvažte tabulku nazvanou ÚČET s relačním schématem ÚČET (id_account#, card_series, vlastník, částka), kde je id_account považován za primární klíč, skutečnost je označena znakem „#“. Předpokládejme, že chceme deklarovat card_series a zůstatek sloupce, které mají být zašifrovány. To lze provést pomocí následujícího:

ALTER TABLE accont MODIFY (kód_řady karet ENCRYPT POMOCÍ 'AES128');ALTER TABLE accont MODIFY (zůstatek ENCRYPT USING 'AES128');

Aby tato metoda fungovala, musí být vytvořena a nakonfigurována peněženka.

Proč transparentní šifrování dat zabránit dešifrování dat v případě odcizení databáze? Všechny zašifrované sloupce z tabulky T používají stejný soukromý klíč Key_T. Pokud máme více tabulek, ,…, které mají zašifrované sloupce, pak existuje n soukromých klíčů, Key_,…,Key_. Každý soukromý klíč Key_, j=1,n je zašifrován hlavním klíčem Key_Master a výsledek tohoto šifrování je uložen v datovém slovníku. Hlavní klíč je externě uložen v peněžence.

Nyní se podívejme na kroky pro toto automatické šifrování. Jsou to:

  • získání hlavního Key_Master z externí peněženky
  • dešifrování soukromého klíče, Key_, pomocí hlavního klíče
  • šifrování dat, která mají být vložena, pomocí soukromého klíče, Key_
  • ukládání zašifrovaných dat do sloupců tabulky

Postup automatického dešifrování je následující:

  • získání hlavního klíče, Key_Master, z externí peněženky
  • dešifrování soukromého klíče, Key_, pomocí hlavního klíče
  • dešifrování dat pomocí soukromého klíče, Key_
  • vrácení výsledku

Jak je to s integritou dat při šifrování? Zde používáme techniku ​​hašování.

Hašování

Šifrování dat zajišťuje důvěrnost dat, ale nezaručuje jejich integritu. Abychom tomuto problému předešli, kromě toho, že by měla být šifrována pouze původní data, můžeme použít techniku ​​zvanou hašování . má dvě důležité výhody:neumožňuje dešifrování původních hodnot a je deterministický (což znamená, že při opakovaném použití na stejná data generuje stejný výsledek). Oracle umožňuje následující hashovací algoritmy:MD5 a SHA-1.

Použití:

DBMS_CRYPTO.Hash (original_set IN RAW, operation_mode IN PLS_INTEGER) RETURN RAW; kde operation_mode je buď DBMS_CRYPTO.HASH_MD5 nebo DBMS_CRYPTO.HASH_SH1

Příklad:

Šifrování indexovaných dat

Vývojářům se nedoporučuje šifrovat indexovaná data. Pokud index sloupce obsahuje zašifrované hodnoty, pak lze index použít pro jednoduchou kontrolu a je nepoužitelný pro jiné účely.

Předpokládejme například, že společnost používá osobní identifikační číslo pro číslo zaměstnance, které je uloženo v tabulce databáze. Je zřejmé, že tato čísla jsou považována za citlivá a důvěrná data a společnost chce zašifrovat sloupec, kde jsou uložena. Protože tento sloupec obsahuje jedinečné hodnoty, lze na něm provést index za účelem dosažení lepšího výkonu. To znamená, že index bude obsahovat zašifrovaná data a bude v podstatě nepoužitelný.

Závěr

Na závěr je velmi důležité chránit citlivá data jejich šifrováním a dešifrováním. Člověk by si měl být tohoto aspektu vědom a podle toho implementovat zabezpečení databáze.

Odkazy:

  1. Vývoj aplikací využívajících šifrování dat
  2. Feuerstein Steven (2009) Oracle PL/SQL Programming (5. vydání). Nakladatelství O’Reilly. ISBN 978-0-596-51446-4. Kapitola 23 „Zabezpečení aplikací a PL/SQL“
  3. Provozní režim blokové šifry

  1. Vložení textového řetězce s hexem do PostgreSQL jako bajt

  2. 2 způsoby, jak nahradit podřetězec v MariaDB

  3. Jaký je nejrychlejší způsob výpočtu mediánu?

  4. Vytvořte kontingenční tabulku pomocí PostgreSQL