security_1_1412302 - ATBMHTTT-2017/lab02-1412169-1412302_1412304 GitHub Wiki
Giải pháp:
-
Kiểu dữ liệu: RAW
-
Thuật toán mã hóa: Mã hóa đối xứng ENCRYPT_AES256
-
Phương pháp chuyển đổi khối mật mã: CHAIN_CBC
-
Padding: PAD_PKCS5
Mô tả:
- Thuật toán mã hóa: ENCRYPT_AES256 (Advanced Encryption Standard. Block cipher. Sử dụng khóa có kích thước 256 bit)
- Phương pháp chuyển đổi khối mật mã: CHAIN_CBC (Cipher Block Chaining. Khối Plaintext kế tiếp được XOR với khối ciphertext trước đó trước khi nó được mãhóa. Vector khởi tạo (IV) được xem như khối plaintextđầu tiên.)
- Padding: PAD_PKCS5 (Cung cấp cơ chế đệm thêm tuân theo chuẩn PKCS #5:Password-Based Cryptography Standard: thêm vào nsố, chỉ n byte còn thiếu của khối cuối cùng. Nếu khốicuối cùng đủ, vẫn đệm thêm toàn bộ khối.)
Cấu trúc hàm mã hóa/giải mã
DBMS_CRYPTO.ENCRYPT(
src IN RAW
typ IN PLS_INTEGER,
key IN RAW
iv IN RAW)
) RETURN RAW;
DBMS_CRYPTO.DECRYPT(
src IN RAW
typ IN PLS_INTEGER,
key IN RAW
iv IN RAW)
) RETURN RAW;
Trong đó:
- src: Dữ liệu đầu vào, kiểu RAW
- typ: Thuật toán mã hóa - giải mã sẽ sử dụng, là các số nguyên đã được định nghĩa (PLS_INTEGER), bao gồm thuật toán mã hóa, phương pháp chuyển đổi khối mật mã và kiểu đệm thêm
- key: Khóa dùng để mã hóa - giải mã, kiểu dữ liệu thô RAW
- iv: Vector khởi tạo cho các khối mã hóa, kiểu RAW. Tùy chọn (có thể không có). Mặc định là NULL
Giải thích code:
Mã hóa:
Ở bảng NHANVIEN, thêm thuộc tính KEY để lưu trữ key ứng với mỗi nhân viên
KEY VARCHAR2(2000)
Tạo procedure có tên là THEM_NV
Trong đó:
Với input_string gán bằng luong, sau khi mã hóa thì giá trị lương được thay bằng giá trị encrypted_raw ứng với key_bytes_raw tương ứng.
encrypted_raw := DBMS_CRYPTO.ENCRYPT (
src => UTL_I18N.STRING_TO_RAW (input_string,'AL32UTF8'),
typ => encryption_type,
key => key_bytes_raw
);
insert into NHANVIEN values(NV, TEN, DC, DT, MAIL, PHONG, CN, encrypted_raw, key_bytes_raw);
Giải mã:
Tạo procedure XEMLUONG
Trong đó:
maNV dùng để lấy ra nhân viên trong phiên làm việc tương ứng
maNV varchar2(5) := sys_context ('userenv', 'session_user');
Sử dụng vòng lặp for lấy ra những thuộc tính lương và key ứng với maNV để được giải mã.
for NhanVien in (select * from NhanVien)
loop
if UPPER(NHANVIEN.MANV) = maNV then
decrypted_raw := DBMS_CRYPTO.DECRYPT (
src => NhanVien.Luong,
typ => encryption_type,
key => NhanVien.Key);
output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
dbms_output.put_line('> Your Salary is: ' || output_string);
end if;
end loop;