Oracle
 sql >> база данни >  >> RDS >> Oracle

Защита на базата данни на Oracle – криптиране и декриптиране

Криптирането на данни е много важно, защото е начин да се защитят текущите и архивираните данни, за да се гарантира тяхната поверителност. Това предотвратява неоторизиран достъп и използване. В тази статия ще представя накратко някои важни аспекти на криптирането и декриптирането на данни.

Системи за криптиране

В системата за криптиране има два основни компонента:алгоритъмът за криптиране, който е методът, използван за промяна на стойността, и ключа за криптиране , чиято сигурност зависи от уязвимостта на криптираните данни.

Oracle поддържа два типа алгоритми за криптиране:симетрични алгоритми (използвайте един и същ ключ за криптиране и декриптиране на данни) за криптиране на съхранени данни и асиметрични алгоритми (генерират се 2 ключа:частен ключ, използван за декриптиране и публичен ключ, който ще се използва от подателя на съобщението, за да се криптира съобщението), използвани за влизане в базата данни и за комуникация между база данни и клиент.

Алгоритмите за симетрично криптиране, налични в Oracle, са както следва:Стандарт за криптиране на данни (DES ), който криптира блок от 64 бита от текста в 64 бита от криптирания текст, използвайки ключ от 56 бита, Стандарт за тройно криптиране на данни (3-DES ), по-усъвършенствана версия на DES и Разширен стандарт за криптиране (AES ), който криптира блок от 128 бита от текста в 128 бита от криптирания текст, използвайки ключ от 128 129 или 256 бита.

Може да се забележи, че посочените по-горе алгоритми за криптиране използват блокове с фиксирано измерение и следователно текстът, който трябва да бъде криптиран, ще бъде разделен на блокове с определено измерение, изисквано от използвания алгоритъм и след това алгоритъмът ще бъде приложен към всеки получен блок.

Но какво ще стане, ако измерението на данните не е кратно на необходимото измерение на блока? техниката на запълване трябва да се използва, за да се запълни последния сегмент от текста, докато достигне размерността на блок. Човек може да избере да подложи с нули или да използва схемата за допълване, наречена PKCS#5. Схемата изчислява разликата за последния текстов сегмент

d =dim_block – dim_data MOD dim_block

и запълва всеки липсващ байт с хекса стойността 0x0d ,

където dim_block е измерението в байтове за блока, изисквано от алгоритъма

и запълва всеки липсващ байт с хекса стойността 0x0d ,

където dim_block е измерението в байтове за блока, изисквано от алгоритъма

Но какво ще стане, ако обикновеният текст се състои от няколко блока, които трябва да бъдат криптирани? Вехника на верижката се използва, което установява дали криптирането на блок зависи или не от криптирането на предишните блокове.

Следнитетипове вериги са наличен в Oracle:

  • Електронна кодова книга (CHAIN_ECB):всеки блок е криптиран независимо от останалите блокове. Недостатъкът е, че може да се идентифицират повтарящи се модели в текстовия фрагмент.
  • Веригиране на шифров блок (CHAIN_CBC):за всеки блок, преди криптиране, се прилага XOR оператор с вектор. За първия блок от последователността се използва инициализиращ вектор, докато за блок от останалата част от последователността резултатът от криптирането на предишния блок се използва като вектор от битове
  • Обратна връзка за шифроване (CHAIN_CFB):подобно е с CBC, с изключение на факта, че операторът XOR се прилага след блоковото криптиране.
  • Изходна обратна връзка (CHAIN_OFB):подобно е с CFB, с изключение на факта, че резултатът от предишния блок е криптиран, преди да се приложи XOR оператор

За криптиране и декриптиране на данни можем да използваме пакета DBMS_CRYPTO, наличен в ORACLE. За да използва този пакет, SYSDBA трябва да предостави на потребителите права за изпълнение, като използва командата:

GRANT EXECUTE  ON dbms_crypto TO username;

За криптиране dbms_crypto.encrypt се използва, който има следните параметри:

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

За декриптиране, dbms_crypto.decrypt се използва, който има следните параметри:

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

Работен режим се формира от:

код на алгоритъма + код за допълване + верижен код

Ето няколко примера за криптиране и декриптиране на данни:

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 

Предизвикателства при криптиране на данни

Управление на ключове за криптиране на данни

За потребителите на базата данни е трудно ръчно да генерират ефективни ключове за криптиране, които имат необходимата дължина за алгоритъма за криптиране. Що се отнася до ръчното подаване на ключа за криптиране като набор от низове (конвертиран след това в RAW), дължината на набора се изчислява по следната формула:

L_set =Length_key_in_bits / 8 (знака)

Например за ENCRYPT_AES128 ключът има 128 бита и наборът ще има дължина L_set =128/8 =16 знака.

Ако е предоставен ключът „1234567890123456“, той ще бъде приет, докато ключът „1234“ ще изведе изключението „дължината на ключа е твърде къса“.

За останалите алгоритми следната таблица дава ефективната дължина на ключа:

Генериране и предаване на ключове

Данните са сигурно криптирани, стига ключът, използван за криптиране, е защитен. Следователно ключът за криптиране трябва да бъде генериран сигурно. Функционалният пакет RANDOMBYTES на DBMS_CRYPTO предлага сигурно генериране на произволни числа и имплементира алгоритъма за генериране на произволни числа. Разработчиците не трябва да използват пакета DBMS_RANDOM, тъй като той генерира псевдослучайни числа, което може да доведе до псевдосигурност.

Функцията RANDOMBYTES се използва, както следва:

ключ RAW (nr_bytes);

ключ:=DBMS_CRYPTO.randombytes (nr_bytes);

където nr_bytes представлява броя на байтовете на ключа за криптиране

Когато ключът се предава от приложение към базата данни, той трябва да бъде криптиран, за да не бъде откраднат, когато се предава. Oracle Advanced Security предоставя мрежово криптиране, което защитава данните и криптографските ключове при тяхното мрежово предаване.

След като ключовете се генерират, те трябва да се пазят в безопасност, тъй като тяхното разкриване може да компрометира сигурността на криптираните данни. Има три опции да запазите ключа:

  • на ниво база данни:съхранява се в базата данни (в специална таблица) или във външен файл на база данни
  • на ниво запис:съхранява се в базата данни (в специална таблица)
  • комбинация между предишните два типа:има главен ключ на ниво база данни и за всеки запис има ключ. Използва се хибриден ключ както за криптиране, така и за декриптиране:hybrid_key =master_key XOR record_key (за функцията XOR има функция PL/SQL – UTL_RAW.bit_xor).

Кой е най-ефективният ключ? Това е хибридният ключ. Ако цялата база данни е открадната, данните не могат да бъдат декриптирани, когато главният ключ се съхранява във файловата система. Ако главният ключ или запис на ключ бъдат откраднати, останалата част от записа ще бъде защитена.

Прозрачно криптиране на данни (TDE)

Друго средство за сигурност, предлагано от Oracle, е Прозрачното криптиране на данни (TDE) , средство, достъпно от Oracle 10g. TDE позволява деклариране на криптирана колона на ниво таблица на базата данни. Когато вмъква данни в криптираната колона, Oracle автоматично криптира данните и съхранява тяхното криптиране в базата данни.

Всяка заявка SELECT автоматично ще декриптира данните. Важно е да запомните, че Прозрачното криптиране на данни не прави разлика между потребителите и дава декриптираните данни, независимо кой разпитва базата данни. Не всяка колона може да бъде криптирана от TDE:колоните от външния ключ (външен ключ) не могат да бъдат криптирани с помощта на този метод.

Например:разгледайте таблица, наречена ACCOUNT с релационна схема ACCOUNT (id_account#, card_series, owner, amount), където id_account се счита за първичен ключ, факт, обозначен със знака „#“. Да предположим, че искаме да декларираме card_series и баланс колони, които да бъдат криптирани. Това може да стане със следното:

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

За да работи този метод, трябва да бъде създаден и конфигуриран портфейл.

Защо Прозрачното криптиране на данни предотвратяване на декриптирането на данни в случай, че базата данни бъде открадната? Е, всички криптирани колони от таблица T използват един и същ частен ключ Key_T. Ако имаме повече таблици, ,…, които имат криптирани колони, тогава има n частни ключове, Key_,…,Key_. Всеки частен ключ Key_, j=1,n е криптиран с главния ключ Key_Master и резултатът от това криптиране се съхранява в речника на данните. Главният ключ се съхранява външно в портфейл.

Сега нека разгледаме стъпките за това автоматично криптиране. Те са:

  • получаване на главния Key_Master от външния портфейл
  • декриптиране на частния ключ, Key_, с помощта на главния ключ
  • криптиране на данните, които трябва да се вмъкнат с помощта на частния ключ, ключ_
  • съхранение на криптираните данни в колоните на таблицата

Стъпките за автоматично декриптиране са:

  • получаване на главния ключ, Key_Master, от външния портфейл
  • декриптиране на частния ключ, Key_, с помощта на главния ключ
  • декриптиране на данните с помощта на частния ключ, ключ_
  • връщане на резултата

Какво ще кажете за целостта на данните по време на криптиране? Тук използваме техниката на хеширане.

Хеширане

Криптирането на данни гарантира поверителността на данните, но не гарантира тяхната цялост. За да предотвратим този проблем, освен факта, че само оригиналните данни трябва да бъдат криптирани, можем да използваме техника, наречена хеширане . има две важни предимства:не позволява дешифриране на оригиналните стойности и е детерминиран (което означава, че многократно прилаган към едни и същи данни, генерира същия резултат). Oracle позволява следните алгоритми за хеширане:MD5 и SHA-1.

Употреба:

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

Пример:

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;

Шифроване на индексирани данни

Не се препоръчва на разработчиците да криптират индексирани данни. Ако индекс на колона съдържа криптирани стойности, тогава индексът може да се използва за лесна проверка и е неизползваем за други цели.

Например, да предположим, че една компания използва личния идентификационен номер за номера на служителя, който се съхранява в таблица на база данни. Очевидно тези числа се считат за чувствителни и поверителни данни и компанията иска да криптира колоната, където се съхранява. Тъй като тази колона съдържа уникални стойности, върху нея може да се изпълни индекс, за да има по-добра производителност. Това означава, че индексът ще съдържа криптирани данни и по принцип ще бъде неизползваем.

Заключение

В заключение е много важно да защитите чувствителните данни, като ги криптирате и декриптирате. Човек трябва да е наясно с този аспект и съответно да приложи защитата на базата данни.

Препратки:

  1. Разработване на приложения с помощта на криптиране на данни
  2. Feuerstein Steven (2009) Програмиране на Oracle PL/SQL (5-то издание). Издателство „О’Райли“. ISBN 978-0-596-51446-4. Глава 23 „Сигурност на приложението и PL/SQL”
  3. Режим на работа на блоков шифр

  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 ODP.net Управляван срещу неуправляван драйвер

  2. ODP.NET Oracle.ManagedDataAccess причинява края на мрежовата сесия ORA-12537 на файла

  3. Изчисляване на възрастта на Oracle от дата на раждане и днес

  4. Различни CURRENT_TIMESTAMP и SYSDATE в oracle

  5. Без диалектно съпоставяне за JDBC тип:-9