Tạo hàm mã hóa SHA-256 trên Oracle 11g R2 (hashing-with-sha-256-in-oracle-11g-r2)

Hàm băm SHA1 đã được công bố đã bị phá mà không phải bằng thuật toán vét cạn.
Tất cả các mã hóa toàn vẹn dữ liệu của mã SHA-1 cần phải chuyển đổi sang bộ mã hóa cao cấp hơn ví dụ hàm SHA-256.

Trong hệ thống của công ty mình hiện đang sử dụng SHA-1 để mã hóa thông tin trước khi gửi sang đối tác, vì vậy cần phải nâng cấp sang hàm băm SHA-256.
Hàm băm SHA-256 chỉ có sẵn từ bản Oracle 12c, bản Oracle 11g sẽ không có. Có 2 cách để có được hàm băm SHA-256:
Cách 1: Sử dụng thư viện của Java có sẵn trong JDK để tạo nên hàm SHA-256
Tham khảo tại địa chỉ: https://dzone.com/articles/hashing-with-sha-256-in-oracle-11g-r2
Nhưng ở địa chỉ này chạy sẽ không được procedure do phải tắt tính năng define của Orcle đi.
Các bước lần lượt như sau:

B1: Tắt chế độ define

set define off


B2: Tạo tài nguyên class Java trong Oracle:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED test."calcsha"
    AS import java.security.MessageDigest; 
 public class calcsha2 
     {
         static public String fncsha(String inputVal) throws Exception
         {           
             MessageDigest myDigest = MessageDigest.getInstance("SHA-256");        
             myDigest.update(inputVal.getBytes());
             byte[] dataBytes = myDigest.digest();
             StringBuffer sb = new StringBuffer();
             for (int i = 0; i < dataBytes.length; i++) {
              sb.append(Integer.toString((dataBytes[i])).substring(1));
             }        
             StringBuffer hexString = new StringBuffer();
             for (int i=0;i<dataBytes.length;i++) {
                 String hex=Integer.toHexString(0xff & dataBytes[i]);
                     if(hex.length()==1) hexString.append('0');
                     hexString.append(hex);
             }
             String retParam = hexString.toString();
             return retParam;           
         }    
     }

B3: Viết thủ tục để gọi đến tài nguyên trên:

CREATE OR REPLACE FUNCTION test.hash_sha256 (txt varchar2)
 RETURN VARCHAR2
 AS
 LANGUAGE JAVA
 NAME 'calcsha2.fncsha(java.lang.String) return String';

B4: Bật trả chế độ define

 set define on

B5: Test kết quả:

 select hash_sha256('123456789') from dual;



So sánh với kết quả online: https://passwordsgenerator.net/sha256-hash-generator/

Cách 2: Cách này viết mới luôn hàm SHA-256 bằng PL-SQL
Tham khảo tại: https://github.com/CruiserX/sha256_plsql

Ta cũng có thể test kết quả so với cách 1.

Trưởng nhóm mình yêu cầu làm cách 2. Theo bản thân mình thì nên làm cách 1 vì toàn bộ là sử dụng thư viện chung JAVA của toàn thế giới, phần code tường minh. Còn cách 2 thì đi copy trên mạng về chạy cảm giác không được an toàn lắm.