Câu 1: Giải pháp mã hóa thông tin lương để chỉ nhân viên được phép xem lương của mình. - ATBMHTTT-2017/lab02-lab02-1412310-1412348-1412362 GitHub Wiki

-Tạo 3 cái funtion: 1 cái lấy khóa, 1 cái mã hóa, 1 cái giải mã

create or replace package crypt_util as function crypt (p_str in varchar2, p_key in raw) return raw; function decrypt (p_data in raw, p_key in raw) return varchar2; function get_key return raw; end crypt_util;

-Tạo mới 1 bảng để lưu Key cho từng MaNV

create TABLE MaMN_Key( maNV NCHAR(10), Key RAW(255), PRIMARY KEY (maNV) );

-Tạo cột LuongNV mới để lưu thông tin Lương của nhân viên dưới dạng đã mã hóa với định dạng raw

ALTER TABLE NhanVien ADD p_LuongNV raw; --tao du lieu update nhanvien set luongNV=system.crypt_util.crypt(luong,key) ;

-xóa cột Lương để không ai có thể xem lương trực tiếp được

alter table NhanVien drop column luong;

-viết thủ tục tạo Procedure để cập nhật thông tin nhân viên trong đó LuongNV là thông tin Lương của nhân viên được thêm vào dưới dạng mã hóa

create or replace Procedure Insert_LuongNhanVien ( p_MaNV in nchar := 10, p_HoTen in nvarchar2 := 100,p_DiaChi in nvarchar2 := 100,p_DienThoai in char := 15,p_Email in nvarchar2 := 50, p_MaPhong in nchar := 10,p_chiNhanh in nchar:=10,p_LuongNV in int) IS l_key raw(255); begin l_key := system.crypt_util.get_key; insert into NhanVien ( MaNV,HoTen, DiaChi, DienThoai,Email, MaPhong, ChiNhanh, LuongNV) values (p_MaNV, p_HoTen, p_DiaChi, p_DienThoai,p_Email,p_MaPhong,p_ChiNhanh,system.crypt_util.crypt(to_char(p_LuongNV),l_key)); insert into MaMN_Key ( MaNV,Key) values (p_MaNV, l_key); end;

-insert vào dữ liệu 2 bảng khi chạy câu lệnh Insert_LuongNhanVien

execute Insert_LuongNhanVien ('GD0020','Nguyen Van A','32 Nguyen Thi Minh Khai','0963906906','[email protected]','PKD ','CN002 ',567);

-Tạo stored procedure cập nhật thông tin của Nhân Viên khi muốn cập nhật, dữ liệu cập nhật là thông tin nhân viên có MaNV trùng với MaNV được nhập vào câu lệnh procedure này, lương được cập nhật là lương của nhân viên sau khi được mã hóa

CREATE OR REPLACE Procedure Update_Luong ( p_MaNV in nchar := 10, p_HoTen in nvarchar2 := 100,p_DiaChi in nvarchar2 := 100,p_DienThoai in char := 15,p_Email in nvarchar2 := 50, p_MaPhong in nchar := 10,p_chiNhanh in nchar:=10,p_LuongNV in int) IS l_key raw(255); begin select Key into l_key from MaMN_Key where MaNV = p_MaNV; update NhanVien set HoTen = p_HoTen,DiaChi = p_DiaChi,DienThoai=p_DienThoai, Email=p_Email, MaPhong=p_MaPhong,ChiNhanh=p_chiNhanh, LuongNV = system.crypt_util.crypt(to_char(p_LuongNV),l_key) where MaNV = p_MaNV; end;

- Tao stored procedure để xóa thông tin của nhân viên khi muốn xóa, dữ liệu xóa là nhân viên có MaNV trùng với MaNV được nhập vào câu lệnh procedure này

CREATE OR REPLACE Procedure Delete_Luong ( p_maNV nchar := 10) IS begin delete from MaMN_Key where maNV = p_maNV; delete from NhanVien where maNV = p_maNV; end;

** -tạoview, function, policy cấp quyền xem lương đã được mã hóa cho người đăng nhập** -chỉ người nào đăng nhập thì lương sẽ được mã hóa và biết được lương của bản thân.

create view view_nhanviengiaima as SELECT n.manv, n.MaNV,n.HoTen, n.DiaChi, n.DienThoai,n.Email, n.MaPhong, n.ChiNhanh,CAST ( system.crypt_util.decrypt (n.LuongNV, m.key) AS VARCHAR2 (10)) luongnvgiaima FROM nhanvien n inner join MaMN_Key m on n.manv=m.manv;

-Gán quyền xem view_nhanviengiaima cho nhân viên thôi

grant select on view_nhanviengiaima to nhanvien;

-Tạo policy function để thêm điều kiện nhân viên không chức vụ gì là người dùng hiện tại và lấy được ra MaNV của người đã đăng nhập

create or replace function xem_luongNV ( p_schema varchar2, p_obj varchar2) return varchar2 as user varchar2(100); begin user := sys_context('userenv', 'session_user'); return 'manv = ' || q'[']' || user || q'[']'; end;

-tạo policy để cái dòng không thỏa policy vẫn xuất hiện lương nhưng dưới dạng mã hóa và chưa được giải mã

begin dbms_rls.add_policy ( object_schema => 'system', object_name => 'view_nhanviengiaima', policy_name => 'xemluongNV', function_schema => 'system', policy_function => 'xem_luongNV', sec_relevant_cols => 'luongnvgiaima'); end;