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;