security_4_1412169 - ATBMHTTT-2017/lab02-1412169-1412302_1412304 GitHub Wiki

Security 4: Xây dựng giải pháp cho phép trưởng dự án mã hóa thông tin chi tiêu của dự án của mình và chỉ cho phép một số người dùng nhất định giải mã thông tin này.

Giải pháp:

Thêm một cột trong bảng dữ liệu để chứa và xem dữ liệu được encrypt, cột này có kiểu dữ liệu là RAW(2000).

Tạo ra một private keypublic key kiểu CLOB.

Viết một function tên là encrypted_data để thực hiện mã hóa dữ liệu.

  • Trong hàm này, dữ liệu được mã hóa là kiểu number và public key dùng để mã hóa là kiểu CLOB.
  • Chuyển dữ liệu ở dạng số về định dạng AL32UTF8.
  • Thực hiện mã hóa bằng phương thức ORA_RSA.ENCRYPT.

Viết một function tên là decrypted_data để thực hiện giải mã dữ liệu.

  • Trong hàm này, dữ liệu đầu vào sẽ là kiểu RAW, do chúng ta mã hóa dữ liệu thành dạng RAW. Private key dùng để giải mã sẽ là dạng CLOB
  • Dữ liệu sau khi giải mã sẽ được đưa về định dạng AL32UTF8.

Viết 2 procedure

  • 1 procedure dùng để insert dữ liệu, khi dữ liệu được insert sẽ được mã hóa
  • 1 procedure dùng để select dữ liệu, khi dữ liệu được select sẽ đồng thời được mã hóa

Sau đó grant quyền thực thi procedure insert dữ liệu cho trưởng dự án, khi đó chúng ta cũng phải đồng thời grant quyền thực thi 2 function encrypted_datadecrypted_data cho trưởng dự án. Khi trưởng dự án muốn cho ai xem thì sẽ grant quyền cho người đó.

Ví dụ từ mã nguồn:

Đoạn code dùng để mã hóa:

-- RSA Encrypt
encrypt_data := ORA_RSA.ENCRYPT(
                  message => UTL_I18N.STRING_TO_RAW(input_data, 'AL32UTF8'),
		  public_key => UTL_RAW.CAST_TO_RAW(public_key)); 
return encrypt_data;

Đoạn code dùng để giải mã:

 -- RSA Decrypt
decrypt_data := ORA_RSA.DECRYPT(encrypt_data, UTL_RAW.CAST_TO_RAW(private_key));
DBMS_OUTPUT.put_line(UTL_I18N.RAW_TO_CHAR(decrypt_data, 'AL32UTF8'));