Создание sha1-хэша строки в Oracle
У меня возникла проблема с созданием sha1-хэша строки в select в базе данных Oracle. Я сделал это в MSSQL следующим образом:
SELECT *,HASHBYTES('SHA1',CAST(ID as varchar(10)+
TextEntry1+TextEntry2+CAST(Timestamp as varchar(10)) as Hash
FROM dbo.ExampleTable
WHERE ID = [foo]
Однако я не могу найти аналогичную функцию для работы с Oracle.
Что касается моего поискового робота, я предполагаю, что dbms_crypto.hash_sh1 имеет к этому какое-то отношение, но я еще не смог обмотать его мозг...
Любые указатели будут очень благодарны.
Ответы
Ответ 1
Пакет DBMS_CRYPTO - это правильный пакет для генерации хэшей. Он не предоставляется PUBLIC по умолчанию, вам нужно будет предоставить его специально (GRANT EXECUTE ON SYS.DBMS_CRYPTO TO user1
).
Результат этой функции имеет тип данных RAW
. Вы можете сохранить его в столбце RAW
или преобразовать его в VARCHAR2
с помощью функций RAWTOHEX
или UTL_ENCODE.BASE64_ENCODE
.
Функция HASH
перегружена, чтобы принять три типа данных в качестве входных данных: RAW
, CLOB
и BLOB
. Из-за правил неявного преобразования, если вы используете вход VARCHAR2
, Oracle попытается преобразовать его в RAW
и будет скорее всего, сбой, поскольку это преобразование работает только с шестнадцатеричными строками.
Если вы используете VARCHAR2
, тогда вам нужно преобразовать вход в двоичный тип данных или CLOB
, например:
DECLARE
x RAW(20);
BEGIN
SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1||col2||to_char(col3)),
sys.dbms_crypto.hash_sh1)
INTO x
FROM t;
END;
вы найдете дополнительную информацию в документации DBMS_CRYPTO.hash
Ответ 2
Пакет DBMS_crypto не поддерживает varchar2. Он работает с сырым типом, поэтому, если вам нужен varchar2, вам нужно его преобразовать. Вот примерная функция, показывающая, как это сделать:
declare
p_string varchar2(2000) := 'Hello world !';
lv_hash_value_md5 raw (100);
lv_hash_value_sh1 raw (100);
lv_varchar_key_md5 varchar2 (32);
lv_varchar_key_sh1 varchar2 (40);
begin
lv_hash_value_md5 :=
dbms_crypto.hash (src => utl_raw.cast_to_raw (p_string),
typ => dbms_crypto.hash_md5);
-- convert into varchar2
select lower (to_char (rawtohex (lv_hash_value_md5)))
into lv_varchar_key_md5
from dual;
lv_hash_value_sh1 :=
dbms_crypto.hash (src => utl_raw.cast_to_raw (p_string),
typ => dbms_crypto.hash_sh1);
-- convert into varchar2
select lower (to_char (rawtohex (lv_hash_value_sh1)))
into lv_varchar_key_sh1
from dual;
--
dbms_output.put_line('String to encrypt : '||p_string);
dbms_output.put_line('MD5 encryption : '||lv_varchar_key_md5);
dbms_output.put_line('SHA1 encryption : '||lv_varchar_key_sh1);
end;
Ответ 3
Вы можете определить эту функцию в своем любимом пакете, который я определил в utils_pkg.
FUNCTION SHA1(STRING_TO_ENCRIPT VARCHAR2) RETURN VARCHAR2 AS
BEGIN
RETURN LOWER(TO_CHAR(RAWTOHEX(SYS.DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(STRING_TO_ENCRIPT), SYS.DBMS_CRYPTO.HASH_SH1))));
END SHA1;
Теперь, чтобы называть его
SELECT UTILS_PKG.SHA1('My Text') AS SHA1 FROM DUAL;
Ответ
SHA1
--------------------------------------------
5411d08baddc1ad09fa3329f9920814c33ea10c0
Вы можете выбрать столбец из таблицы:
SELECT UTILS_PKG.SHA1(myTextColumn) FROM myTable;
Наслаждайтесь!