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 key và public 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
numbervà public key dùng để mã hóa là kiểuCLOB. - 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ạngRAW. Private key dùng để giải mã sẽ là dạngCLOB - 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_data và decrypted_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'));