SHA-1 и другие хеш-функции в DB2
Как добавить в DB2 функцию для расчета хеш-кода по алгоритму SHA-1 (или любому другому поддерживаемому Java):
(а) Начиная с версии 11.1, алгоритмы MD5, SHA1, SHA2_256 и SHA2_512 доступны через встроенную функцию HASH(), которую можно обернуть в вызов встроенной функции HEX() для получения текстового значения.
Использование:
(б) В более ранних версиях, либо для не поддерживаемых типов хеша, приходится использовать Java UDF.
HashUtil.java:
Сборка:
Использование:
(а) Начиная с версии 11.1, алгоритмы MD5, SHA1, SHA2_256 и SHA2_512 доступны через встроенную функцию HASH(), которую можно обернуть в вызов встроенной функции HEX() для получения текстового значения.
Использование:
VALUES HEX(HASH('Вассисуалий Алибабаевич', 1));
(б) В более ранних версиях, либо для не поддерживаемых типов хеша, приходится использовать Java UDF.
HashUtil.java:
import java.security.MessageDigest; public class HashUtil { // the scalar UDF public static String hashBase64(String func, String inputString) throws Exception { byte[] result = MessageDigest.getInstance(func).digest(inputString.getBytes("UTF-8")); return javax.xml.bind.DatatypeConverter.printBase64Binary(result); } public static String hashHex(String func, String inputString) throws Exception { byte[] result = MessageDigest.getInstance(func).digest(inputString.getBytes("UTF-8")); return javax.xml.bind.DatatypeConverter.printHexBinary(result); } public static void main(String[] args) { try { for (String s : args) { System.out.println(hashHex("SHA-1", s)); } } catch(Exception ex) { ex.printStackTrace(System.err); System.exit(1); } } }
Сборка:
javac HashUtil.java jar cvf HashUtil.jar HashUtil.class db2 -t CALL sqlj.install_jar('file:./HashUtil.jar', 'HASHUTILJAR'); CREATE OR REPLACE FUNCTION work.hash_hex(varchar(30), varchar(2000)) RETURNS VARCHAR(100) LANGUAGE JAVA PARAMETER STYLE JAVA DETERMINISTIC NO EXTERNAL ACTION NO SQL EXTERNAL NAME 'HASHUTILJAR:HashUtil.hashHex';
Использование:
VALUES work.hash_hex('SHA-1', 'Вассисуалий Алибабаевич');