Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Keamanan Database Oracle – Enkripsi dan Dekripsi

Enkripsi data sangat penting karena merupakan cara untuk melindungi data saat ini dan yang diarsipkan untuk memastikan kerahasiaannya. Ini mencegah akses dan penggunaan yang tidak sah. Dalam artikel ini, saya akan menyajikan secara singkat beberapa aspek penting dari enkripsi dan dekripsi data.

Sistem Enkripsi

Dalam sistem enkripsi, ada dua komponen utama:algoritme enkripsi, yang merupakan metode yang digunakan untuk mengubah nilai, dan kunci enkripsi , yang keamanannya bergantung pada kerentanan data terenkripsi.

Oracle mendukung dua jenis algoritma enkripsi:algoritma simetris (gunakan kunci yang sama untuk mengenkripsi dan mendekripsi data) untuk mengenkripsi data yang disimpan dan algoritma asimetris (2 kunci dihasilkan:kunci pribadi yang digunakan untuk dekripsi dan kunci publik yang akan digunakan oleh pengirim pesan untuk mengenkripsi pesan) digunakan untuk login database dan untuk berkomunikasi antara database dan klien.

Algoritme enkripsi simetris, yang tersedia di Oracle adalah sebagai berikut:Standar Enkripsi Data (DES ) yang mengenkripsi blok teks 64 bit menjadi 64 bit teks terenkripsi, menggunakan kunci 56 bit, Triple Data Encryption Standard (3-DES ), versi DES yang lebih canggih, dan Standar Enkripsi Lanjutan (AES ), yang mengenkripsi blok 128 bit teks menjadi 128 bit teks terenkripsi, menggunakan kunci 128.129 atau 256 bit.

Kita dapat melihat bahwa algoritma enkripsi yang disebutkan di atas menggunakan blok dimensi tetap, dan oleh karena itu, teks yang harus dienkripsi akan dibagi menjadi blok-blok dengan dimensi tertentu, yang dibutuhkan oleh algoritma yang digunakan dan kemudian, algoritma akan diterapkan pada setiap yang diperoleh. blokir.

Namun, bagaimana jika dimensi data bukan kelipatan dari dimensi blok yang diperlukan? teknik bantalan harus digunakan untuk mengisi segmen terakhir teks hingga mencapai dimensi blok. Seseorang dapat memilih untuk pad dengan nol atau menggunakan skema padding yang disebut PKCS#5. Skema menghitung perbedaan untuk segmen teks terakhir

d =dim_block – dim_data MOD dim_block

dan mengisi setiap byte yang hilang dengan nilai heksa 0x0d ,

di mana dim_block adalah dimensi dalam byte untuk blok, yang dibutuhkan oleh algoritma

dan mengisi setiap byte yang hilang dengan nilai heksa 0x0d ,

di mana dim_block adalah dimensi dalam byte untuk blok, yang dibutuhkan oleh algoritme

Namun, bagaimana jika teks biasa terdiri dari beberapa blok yang akan dienkripsi? teknik rantai digunakan, yang menentukan apakah enkripsi blok bergantung atau tidak pada enkripsi blok sebelumnya.

Berikut jenis rantai adalah tersedia di Oracle:

  • Buku Kode Elektronik (CHAIN_ECB):setiap blok dienkripsi secara independen dari blok lainnya. Kerugiannya adalah seseorang dapat mengidentifikasi pola berulang dalam fragmen teks.
  • Rantai Blok Cipher (CHAIN_CBC):untuk setiap blok, sebelum enkripsi, operator XOR diterapkan dengan vektor. Untuk blok pertama dari urutan digunakan vektor inisialisasi, sedangkan untuk blok dari sisa urutan, hasil enkripsi dari blok sebelumnya digunakan sebagai vektor bit
  • Umpan Balik Cipher (CHAIN_CFB):mirip dengan CBC, kecuali fakta bahwa operator XOR diterapkan setelah enkripsi blok.
  • Umpan Balik Keluaran (CHAIN_OFB):mirip dengan CFB, kecuali fakta bahwa hasil blok sebelumnya dienkripsi sebelum operator XOR diterapkan

Untuk mengenkripsi dan mendekripsi data, kita dapat menggunakan paket DBMS_CRYPTO yang tersedia di ORACLE. Untuk menggunakan paket ini, SYSDBA harus memberikan hak eksekusi kepada pengguna, dengan menggunakan perintah:

GRANT EXECUTE  ON dbms_crypto TO username;

Untuk enkripsi, dbms_crypto.encrypt digunakan, yang memiliki parameter berikut:

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

Untuk dekripsi, dbms_crypto.decrypt digunakan, yang memiliki parameter berikut:

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

Mode operasi terbentuk dari:

kode algoritma + kode padding + kode rantai

Berikut adalah beberapa contoh untuk mengenkripsi dan mendekripsi 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 

Tantangan Enkripsi Data

Pengelolaan kunci Enkripsi untuk data

Sulit bagi pengguna database untuk secara manual menghasilkan kunci enkripsi yang efisien, yang memiliki panjang yang diperlukan untuk algoritma enkripsi. Mengenai penyediaan manual kunci enkripsi sebagai rangkaian string (dikonversi kemudian dalam RAW), panjang rangkaian dihitung menggunakan rumus berikut:

L_set =Length_key_in_bits / 8 (karakter)

Misalnya, untuk ENCRYPT_AES128, kuncinya memiliki 128 bit dan himpunan akan memiliki panjang L_set =128/8 =16 karakter.

Jika kunci '1234567890123456' diberikan, itu akan diterima, sedangkan kunci '1234' akan mengeluarkan pengecualian 'panjang kunci terlalu pendek'.

Untuk algoritma lainnya, tabel berikut memberikan panjang kunci efektif:

Pembuatan dan transmisi kunci

Data dienkripsi dengan aman selama kunci yang digunakan untuk mengenkripsi aman. Oleh karena itu, kunci enkripsi harus dibuat dengan aman. Paket fungsi RANDOMBYTES dari DBMS_CRYPTO menawarkan pembuatan nomor acak yang aman dan mengimplementasikan algoritme pembuat nomor acak. Pengembang tidak boleh menggunakan paket DBMS_RANDOM karena menghasilkan angka acak semu, yang dapat mengakibatkan keamanan semu.

Fungsi RANDOMBYTES digunakan sebagai berikut:

kunci RAW (nr_bytes);

kunci:=DBMS_CRYPTO.randombytes (nr_bytes);

di mana nr_bytes mewakili jumlah byte kunci enkripsi

Ketika kunci dilewatkan dari aplikasi ke database, itu harus dienkripsi agar tidak dicuri saat sedang dikirim. Oracle Advanced Security menyediakan enkripsi jaringan, yang melindungi data dan kunci kriptografis dalam transit jaringan mereka.

Setelah kunci dibuat, kunci tersebut harus tetap aman, karena pengungkapannya dapat membahayakan keamanan data terenkripsi. Ada tiga opsi untuk menyimpan kunci:

  • di tingkat database:disimpan dalam database (dalam tabel khusus) atau dalam file database eksternal
  • pada level record:disimpan dalam database (dalam tabel khusus)
  • kombinasi antara dua jenis sebelumnya:ada kunci master di tingkat basis data dan untuk setiap catatan, ada kuncinya. Kunci hybrid digunakan untuk enkripsi dan dekripsi:hybrid_key =master_key XOR record_key (untuk fungsi XOR, ada fungsi PL/SQL – UTL_RAW.bit_xor).

Apa kunci yang paling efisien? Ini adalah kunci hibrida. Jika seluruh database dicuri, data tidak dapat didekripsi ketika kunci master disimpan dalam sistem file. Jika kunci master atau catatan kunci dicuri, sisa catatan akan tetap dilindungi.

Enkripsi Data Transparan (TDE)

Fasilitas keamanan lain yang ditawarkan oleh Oracle adalah Transparent Data Encryption (TDE) , fasilitas yang tersedia dari Oracle 10g. TDE memungkinkan mendeklarasikan kolom terenkripsi pada tingkat tabel database. Saat memasukkan data ke dalam kolom terenkripsi, Oracle secara otomatis mengenkripsi data dan menyimpan enkripsinya dalam database.

Setiap kueri SELECT akan secara otomatis mendekripsi data. Penting untuk diingat bahwa Enkripsi Data Transparan tidak membuat perbedaan antara pengguna, dan memberikan data yang didekripsi tidak peduli siapa yang menginterogasi database. Tidak ada kolom yang dapat dienkripsi oleh TDE:kolom dari kunci eksternal (kunci asing) tidak dapat dienkripsi menggunakan metode ini.

Sebagai contoh:perhatikan tabel yang disebut ACCOUNT dengan skema relasional ACCOUNT (id_account#, card_series, pemilik, jumlah), di mana id_account dianggap sebagai kunci utama, fakta dilambangkan dengan tanda '#'. Mari kita asumsikan kita ingin mendeklarasikan card_series dan keseimbangan kolom yang akan dienkripsi. Ini dapat dilakukan dengan yang berikut:

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

Agar metode ini berfungsi, dompet harus dibuat dan dikonfigurasi.

Mengapa Enkripsi Data Transparan mencegah dekripsi data jika database dicuri? Nah, semua kolom terenkripsi dari tabel T menggunakan kunci pribadi yang sama Key_T. Jika kita memiliki lebih banyak tabel, ,…, yang memiliki kolom terenkripsi, maka ada n kunci pribadi, Kunci_,…,Kunci_. Setiap kunci pribadi Key_, j=1,n dienkripsi dengan kunci master, Key_Master, dan hasil enkripsi ini disimpan dalam kamus data. Kunci master disimpan secara eksternal di dompet.

Sekarang, mari kita lihat langkah-langkah untuk enkripsi otomatis ini. Mereka adalah:

  • mendapatkan master Key_Master dari dompet eksternal
  • dekripsi kunci pribadi, Kunci_, menggunakan kunci master
  • enkripsi data yang akan disisipkan menggunakan kunci pribadi, Kunci_
  • menyimpan data terenkripsi di kolom tabel

Langkah-langkah untuk dekripsi otomatis adalah:

  • mendapatkan kunci master, Key_Master, dari dompet eksternal
  • dekripsi kunci pribadi, Kunci_, menggunakan kunci master
  • dekripsi data menggunakan kunci pribadi, Kunci_
  • mengembalikan hasil

Bagaimana dengan integritas data saat mengenkripsi? Di sini kita menggunakan teknik hashing.

Hashing

Enkripsi data memastikan kerahasiaan data tetapi tidak menjamin integritasnya. Untuk mencegah masalah ini, selain fakta bahwa hanya data asli yang harus dienkripsi, kita dapat menggunakan teknik yang disebut hashing . ada dua keuntungan penting:itu tidak memungkinkan penguraian nilai asli dan itu deterministik (yang berarti bahwa diterapkan secara berulang ke data yang sama, menghasilkan hasil yang sama). Oracle mengizinkan algoritme hashing berikut:MD5 dan SHA-1.

Penggunaan:

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

Contoh:

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;

Mengenkripsi Data Terindeks

Pengembang tidak disarankan untuk mengenkripsi data yang diindeks. Jika indeks kolom berisi nilai terenkripsi, maka indeks dapat digunakan untuk pemeriksaan sederhana dan tidak dapat digunakan untuk tujuan lain.

Misalnya, sebuah perusahaan menggunakan nomor identifikasi pribadi untuk nomor karyawan yang disimpan dalam tabel database. Jelas, angka-angka itu dianggap sebagai data sensitif dan rahasia dan perusahaan ingin mengenkripsi kolom tempat penyimpanannya. Karena kolom ini berisi nilai-nilai unik, indeks dapat dilakukan pada kolom tersebut agar memiliki kinerja yang lebih baik. Ini berarti bahwa indeks akan berisi data terenkripsi dan pada dasarnya tidak dapat digunakan.

Kesimpulan

Sebagai penutup, sangat penting untuk melindungi data sensitif dengan mengenkripsi dan mendekripsi. Seseorang harus menyadari aspek ini dan menerapkan keamanan database yang sesuai.

Referensi:

  1. Mengembangkan Aplikasi Menggunakan Enkripsi Data
  2. Feuerstein Steven (2009) Pemrograman Oracle PL/SQL (edisi ke-5). Penerbitan O'Reilly. ISBN 978-0-596-51446-4. Bab 23 Keamanan aplikasi dan PL/SQL”
  3. Blokir mode operasi sandi

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Contoh kueri MySQL dengan jawaban

  2. Periksa apakah dua pilihan setara

  3. Database Manajer Paket GI 19c RPM

  4. ubah tabel ubah kolom di database Oracle

  5. Oracle Text tidak akan berfungsi dengan NVARCHAR2. Apa lagi yang mungkin tidak tersedia?