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.