Mã hóa dữ liệu rất quan trọng vì đây là cách để bảo vệ dữ liệu hiện tại và dữ liệu đã lưu trữ nhằm đảm bảo tính bí mật của dữ liệu đó. Điều này ngăn chặn việc truy cập và sử dụng trái phép. Trong bài viết này, tôi sẽ trình bày ngắn gọn một số khía cạnh quan trọng của mã hóa và giải mã dữ liệu.
Hệ thống mã hóa
Trong hệ thống mã hóa, có hai thành phần chính: thuật toán mã hóa, là phương pháp được sử dụng để thay đổi giá trị và khóa mã hóa , có tính bảo mật phụ thuộc vào lỗ hổng của dữ liệu được mã hóa.
Oracle hỗ trợ hai loại thuật toán mã hóa: thuật toán đối xứng (sử dụng cùng một khóa để mã hóa và giải mã dữ liệu) để mã hóa dữ liệu được lưu trữ và thuật toán không đối xứng (2 khóa được tạo:khóa riêng tư được sử dụng để giải mã và khóa công khai sẽ được người gửi tin nhắn sử dụng để mã hóa tin nhắn) được sử dụng để đăng nhập cơ sở dữ liệu và để giao tiếp giữa cơ sở dữ liệu và máy khách.
Các thuật toán mã hóa đối xứng, có sẵn trong Oracle như sau: Tiêu chuẩn mã hóa dữ liệu ( DES ) mã hóa khối văn bản gồm 64 bit thành 64 bit của văn bản được mã hóa, sử dụng khóa 56 bit, Tiêu chuẩn mã hóa dữ liệu ba lần ( 3-DES ), phiên bản nâng cao hơn của DES và Tiêu chuẩn mã hóa nâng cao ( AES ), mã hóa một khối văn bản gồm 128 bit thành 128 bit của văn bản được mã hóa, sử dụng khóa 128,129 hoặc 256 bit.
Người ta có thể nhận thấy rằng các thuật toán mã hóa được đề cập ở trên sử dụng các khối có kích thước cố định và do đó, văn bản phải được mã hóa sẽ được chia thành các khối có kích thước nhất định, theo yêu cầu của thuật toán đã sử dụng và sau đó, thuật toán sẽ được áp dụng trên mỗi khối thu được khối.
Tuy nhiên, điều gì sẽ xảy ra nếu thứ nguyên dữ liệu không phải là bội số của thứ nguyên bắt buộc của khối? Kỹ thuật đệm phải được sử dụng để điền vào phân đoạn cuối cùng của văn bản cho đến khi nó đạt đến kích thước của một khối. Người ta có thể chọn đệm bằng các số không hoặc sử dụng lược đồ đệm được gọi là PKCS # 5. Lược đồ tính toán sự khác biệt cho đoạn văn bản cuối cùng
d =dim_block - dim_data MOD dim_block
và điền vào mỗi byte bị thiếu bằng giá trị hexa 0x0d ,
ở đâu dim_block là thứ nguyên tính bằng byte cho khối, theo yêu cầu của thuật toán
và điền vào mỗi byte bị thiếu bằng giá trị hexa 0x0d ,
ở đâu dim_block là thứ nguyên tính bằng byte cho khối, theo yêu cầu của thuật toán
Tuy nhiên, điều gì sẽ xảy ra nếu văn bản thuần túy bao gồm nhiều khối được mã hóa? Kỹ thuật xâu chuỗi được sử dụng, thiết lập xem mã hóa của một khối có phụ thuộc hay không vào mã hóa của các khối trước đó.
Các loại chuỗi sau đây là có sẵn trong Oracle:
- Sổ mã điện tử (CHAIN_ECB):mỗi khối được mã hóa độc lập với phần còn lại của các khối. Điểm bất lợi là người ta có thể xác định các mẫu lặp lại trong đoạn văn bản.
- Chuỗi khối mật mã (CHAIN_CBC):đối với mỗi khối, trước khi mã hóa, toán tử XOR được áp dụng với một vectơ. Đối với khối đầu tiên từ chuỗi, một vectơ khởi tạo được sử dụng, trong khi đối với khối từ phần còn lại của dãy, kết quả mã hóa của khối trước đó được sử dụng dưới dạng vectơ các bit
- Phản hồi về mật mã (CHAIN_CFB):tương tự với CBC, ngoại trừ thực tế là toán tử XOR được áp dụng sau khi mã hóa khối.
- Phản hồi đầu ra (CHAIN_OFB):tương tự với CFB, ngoại trừ thực tế là kết quả của khối trước đó được mã hóa trước khi toán tử XOR được áp dụng
Để mã hóa và giải mã dữ liệu, chúng ta có thể sử dụng gói DBMS_CRYPTO có sẵn trong ORACLE. Để sử dụng gói này, SYSDBA phải cấp cho người dùng quyền thực thi bằng lệnh:
GRANT EXECUTE ON dbms_crypto TO username;
Để mã hóa, dbms_crypto.encrypt được sử dụng, có các tham số sau:
dbms_crypto.encrypt( clear_text IN RAW, operating_mode IN PLS_INTEGER, key IN RAW, initialization_vector IN RAW DEFAULT NULL) RETURN RAW;
Để giải mã, dbms_crypto.decrypt được sử dụng, có các tham số sau:
dbms_crypto.decrypt( clear_text IN RAW, operating_mode IN PLS_INTEGER, key IN RAW, initialization_vector IN RAW DEFAULT NULL) RETURN RAW;
Chế độ hoạt động được hình thành từ:
mã thuật toán + mã đệm + mã chuỗi
Dưới đây là một số ví dụ để mã hóa và giải mã dữ liệu:
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
Những thách thức về mã hóa dữ liệu
Quản lý khóa mã hóa cho dữ liệu
Người dùng cơ sở dữ liệu khó có thể tạo thủ công các khóa mã hóa hiệu quả, có độ dài cần thiết cho thuật toán mã hóa. Liên quan đến việc cung cấp thủ công khóa mã hóa dưới dạng tập hợp chuỗi (sau đó được chuyển đổi thành RAW), độ dài của tập hợp được tính theo công thức sau:
L_set =Length_key_in_bits / 8 (ký tự)
Ví dụ:đối với ENCRYPT_AES128, khóa có 128 bit và tập hợp sẽ có độ dài L_set =128/8 =16 ký tự.
Nếu khóa ‘1234567890123456’ được cung cấp, khóa đó sẽ được chấp nhận, trong khi khóa ‘1234’ sẽ đưa ra ngoại lệ "độ dài khóa quá ngắn".
Đối với phần còn lại của các thuật toán, bảng sau cung cấp độ dài khóa hiệu dụng:
Tạo và truyền khóa
Dữ liệu được mã hóa an toàn miễn là khóa được sử dụng để mã hóa được bảo mật. Do đó, khóa mã hóa phải được tạo một cách an toàn. Gói hàm RANDOMBYTES của DBMS_CRYPTO cung cấp cách tạo số ngẫu nhiên an toàn và triển khai thuật toán tạo số ngẫu nhiên. Các nhà phát triển không được sử dụng gói DBMS_RANDOM vì gói này tạo ra các số giả ngẫu nhiên, có thể dẫn đến bảo mật giả.
Hàm RANDOMBYTES được sử dụng như sau:
key RAW (nr_bytes);
khóa:=DBMS_CRYPTO.randombytes (nr_bytes);
trong đó nr_bytes đại diện cho số byte của khóa mã hóa
Khi khóa được chuyển từ một ứng dụng đến cơ sở dữ liệu, nó phải được mã hóa để không bị đánh cắp khi đang được truyền. Oracle Advanced Security cung cấp mã hóa mạng, bảo vệ dữ liệu và các khóa mật mã trong quá trình chuyển mạng của chúng.
Khi các khóa được tạo, chúng phải được giữ an toàn vì việc tiết lộ của chúng có thể ảnh hưởng đến tính bảo mật của dữ liệu được mã hóa. Có ba tùy chọn để giữ chìa khóa:
- ở cấp độ cơ sở dữ liệu:được lưu trữ trong cơ sở dữ liệu (trong một bảng đặc biệt) hoặc trong một tệp cơ sở dữ liệu bên ngoài
- ở mức bản ghi:được lưu trữ trong cơ sở dữ liệu (trong một bảng đặc biệt)
- sự kết hợp giữa hai kiểu trước:có một khóa chính ở cấp cơ sở dữ liệu và cho mỗi bản ghi, có một khóa. Khóa kết hợp được sử dụng cho cả mã hóa và giải mã:hybrid_key =master_key XOR record_key (đối với hàm XOR, có một hàm PL / SQL - UTL_RAW.bit_xor).
Chìa khóa hiệu quả nhất là gì? Nó là chìa khóa lai. Nếu toàn bộ cơ sở dữ liệu bị đánh cắp, dữ liệu sẽ không thể được giải mã khi khóa chính được lưu trữ trong hệ thống tệp. Nếu khóa chính hoặc bản ghi khóa bị đánh cắp, phần còn lại của bản ghi sẽ vẫn được bảo vệ.
Mã hóa dữ liệu minh bạch (TDE)
Một phương tiện bảo mật khác do Oracle cung cấp là Mã hóa dữ liệu minh bạch (TDE) , một cơ sở có sẵn từ Oracle 10g. TDE cho phép khai báo một cột được mã hóa ở cấp bảng của cơ sở dữ liệu. Khi chèn dữ liệu vào cột được mã hóa, Oracle sẽ tự động mã hóa dữ liệu và lưu trữ mã hóa của chúng trong cơ sở dữ liệu.
Mọi truy vấn SELECT sẽ tự động giải mã dữ liệu. Điều quan trọng cần nhớ là Mã hóa dữ liệu minh bạch không tạo ra sự khác biệt giữa những người dùng và cung cấp dữ liệu được giải mã cho dù ai đang thẩm vấn cơ sở dữ liệu. Không phải bất kỳ cột nào cũng có thể được mã hóa bằng TDE:các cột từ khóa bên ngoài (khóa ngoại) không thể được mã hóa bằng phương pháp này.
Ví dụ:hãy xem xét một bảng có tên ACCOUNT với lược đồ quan hệ ACCOUNT (id_account #, card_series, sở hữu, số tiền), trong đó id_account được coi là khóa chính, thực tế được biểu thị bằng dấu ‘#’. Giả sử chúng ta muốn khai báo card_series và số dư cột được mã hóa. Điều này có thể được thực hiện với những điều sau:
ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128'); ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');
Để phương pháp này hoạt động, bạn phải tạo và định cấu hình ví.
Tại sao Mã hóa dữ liệu minh bạch ngăn chặn việc giải mã dữ liệu trong trường hợp cơ sở dữ liệu bị đánh cắp? Tất cả các cột được mã hóa từ bảng T đều sử dụng cùng một khóa riêng Key_T. Nếu chúng ta có nhiều bảng,…, có các cột được mã hóa, thì sẽ có n khóa riêng, Key_,…, Key_. Mỗi khóa riêng Key_, j =1, n được mã hóa bằng khóa chính, Key_Master và kết quả của quá trình mã hóa này được lưu trữ trong từ điển dữ liệu. Khóa chính được lưu trữ bên ngoài trong ví.
Bây giờ, hãy xem các bước cho mã hóa tự động này. Đó là:
- lấy Key_Master chính từ ví bên ngoài
- giải mã khóa cá nhân, Key_, sử dụng khóa chính
- mã hóa dữ liệu sẽ được chèn bằng khóa cá nhân, Key_
- lưu trữ dữ liệu được mã hóa trong các cột của bảng
Các bước để giải mã tự động là:
- lấy khóa chính, Key_Master, từ ví bên ngoài
- giải mã khóa cá nhân, Key_, sử dụng khóa chính
- giải mã dữ liệu bằng khóa cá nhân, Key_
- trả về kết quả
Điều gì về tính toàn vẹn của dữ liệu trong khi mã hóa? Đây là chúng tôi sử dụng kỹ thuật băm.
Băm
Mã hóa dữ liệu đảm bảo tính bảo mật của dữ liệu nhưng không đảm bảo tính toàn vẹn của chúng. Để ngăn chặn vấn đề này, bên cạnh việc chỉ mã hóa dữ liệu gốc, chúng ta có thể sử dụng một kỹ thuật gọi là băm . có hai ưu điểm quan trọng:nó không cho phép giải mã các giá trị ban đầu và nó có tính xác định (có nghĩa là áp dụng lặp đi lặp lại cho cùng một dữ liệu, nó sẽ tạo ra cùng một kết quả). Oracle cho phép các thuật toán băm sau:MD5 và SHA-1.
Cách sử dụng:
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
Ví dụ:
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;
Mã hóa dữ liệu được lập chỉ mục
Nó không được khuyến khích cho các nhà phát triển để mã hóa dữ liệu được lập chỉ mục. Nếu chỉ mục của một cột chứa các giá trị được mã hóa thì chỉ mục đó có thể được sử dụng để kiểm tra đơn giản và không thể sử dụng cho các mục đích khác.
Ví dụ:giả sử một công ty sử dụng số định danh cá nhân cho số nhân viên được lưu trữ trong bảng cơ sở dữ liệu. Rõ ràng, những con số đó được coi là dữ liệu nhạy cảm và bí mật và công ty muốn mã hóa cột nơi nó được lưu trữ. Bởi vì cột này chứa các giá trị duy nhất, một chỉ mục có thể được thực hiện trên nó để có hiệu suất tốt hơn. Điều này có nghĩa là chỉ mục sẽ chứa dữ liệu được mã hóa và về cơ bản sẽ không thể sử dụng được.
Kết luận
Để kết luận, điều rất quan trọng là phải bảo vệ dữ liệu nhạy cảm bằng cách mã hóa và giải mã nó. Người ta nên nhận thức được khía cạnh này và thực hiện bảo mật cơ sở dữ liệu cho phù hợp.
Tài liệu tham khảo:
- Phát triển ứng dụng bằng mã hóa dữ liệu
- Feuerstein Steven (2009) Lập trình Oracle PL / SQL (ấn bản thứ 5). Nhà xuất bản O’Reilly. ISBN 978-0-596-51446-4. Chương 23 “Bảo mật ứng dụng và PL / SQL”
- Chế độ hoạt động của mật mã khối