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;