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ĩaPLS_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;