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

GIẢI PHÁP:

  • Sử dụng gói package ORA_RSA để hỗ trợ tạo và kiểm tra chữ kí

Link download: https://www.didisoft.com/ora-rsa/

  • Viết 1 hàm function tạo chữ kí, trưởng dự án sẽ dùng function này tạo chữ kí trên tất cả giá trị thuộc tính PhuCap trong bảng PHANCONG(dùng private key). Viết 1 procedure kiểm tra chữ kí, nhân viên sẽ dùng procedure này kiểm tra được chữ kí ứng với thuộc tính PhuCap của mình có hợp lệ hay không(dùng public key).

THỰC HIỆN:

Dựa vào code mẫu ở file example để viết lại function và store procedure tương ứng

  • HÀM FUNCTION create_digital_signature

Hàm truyền vào 2 tham số:

input_data in varchar2 // Dữ liệu cần được kí
private_key in CLOB // Character Large Object (bao gồm NCLOB)

Sử dụng hàm hash ORA_RSA.HASH_SHA256 for SHA256withRSA

hash => ORA_RSA.HASH_SHA256

Và chữ kí được trả về dưới dạng trường dữ liệu thô

return RAW // Được khai báo ở phần khai báo của function
return signature

Xử lí các ngoại lệ cần thiết

EXCEPTION
   -- ORA_RSA exception handling 
   WHEN ORA_RSA.RSA_EXCEPTION THEN
     BEGIN
       IF ORA_RSA.GET_RSA_ERROR() = ORA_RSA.RSA_WRONG_PASSWORD_ERR THEN
         DBMS_OUTPUT.PUT_LINE('The password for the private key is not matching: ' || SQLERRM);
       ELSIF ORA_RSA.GET_RSA_ERROR() = ORA_RSA.RSA_KEY_ERR THEN
         DBMS_OUTPUT.PUT_LINE('The provided key is not a valid RSA key.');
       ELSIF ORA_RSA.GET_RSA_ERROR() = ORA_RSA.RSA_ENCRYPTION_ERR THEN
         DBMS_OUTPUT.PUT_LINE('Error when performing RSA operation: ' || SQLERRM);
       ELSIF ORA_RSA.GET_RSA_ERROR() = ORA_RSA.RSA_GENERAL_IO_ERR THEN
         DBMS_OUTPUT.PUT_LINE('I/O error: ' || SQLERRM);
       END IF;
     END;

   WHEN OTHERS THEN
     DBMS_OUTPUT.PUT_LINE('General error : ' || SQLERRM );
  • STORE PROCEDURE verify

Store truyền vào 3 tham số:

input_data in varchar2 // Dữ liệu đã có chữ kí để kiểm tra
public_key in CLOB
signature in RAW // Chữ kí dạng thô được lưu lại từ function `create_digital_signature`

Sử dụng hàm hash ORA_RSA.HASH_SHA256 for SHA256withRSA

hash => ORA_RSA.HASH_SHA256

Kiểm tra kết quả dựa trên biến signature_check_result

signature_check_result PLS_INTEGER; // Số nguyên được định nghĩa PLS_INTEGER

  • Nếu việc kiểm tra này đúng thì kiểm tra chữ kí thành công
IF signature_check_result = 1 Then
       DBMS_OUTPUT.put_line('Signature verification passed.');
  • Nếu việc kiểm tra này sai thì kiểm tra chữ kí thất bại
ELSE
       DBMS_OUTPUT.put_line('Signature cannot be verified!'); 
END IF; 

Xử lí các ngoại lệ cần thiết (tương tự việc tạo chữ kí)

Gán quyền truy xuất cho những user thực hiện đề án:

grant select on PhanCong to ThamGia_DeAn;
grant execute on verify to ThamGia_DeAn;