我在Oracle数据库的select中对一行进行sha1-hash有问题.我在MSSQL中完成了如下操作:
SELECT *,HASHBYTES('SHA1',CAST(ID as varchar(10)+
TextEntry1+TextEntry2+CAST(Timestamp as varchar(10)) as Hash
FROM dbo.ExampleTable
WHERE ID = [foo]
Run Code Online (Sandbox Code Playgroud)
但是,在使用Oracle时,我似乎无法找到类似的功能.至于我的谷歌搜索给我带来的,我猜dbms_crypto.hash_sh1与它有关,但我还没有把我的大脑包裹起来......
任何指针都将非常感激.
Vin*_*rat 24
该软件包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并且很可能会失败,因为此转换仅适用于十六进制字符串.
如果您使用VARCHAR2then,则需要将输入转换为二进制数据类型或a 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;
Run Code Online (Sandbox Code Playgroud)
您可以在文档中找到更多信息 DBMS_CRYPTO.hash
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;
Run Code Online (Sandbox Code Playgroud)
小智 5
只是放在这里,如果有人会搜索的话。
在 Oracle 12 中您可以使用standard_hash(<your_value>, <algorythm>)函数。如果没有<algorythm>定义参数,它将生成 SHA-1 哈希值(输出数据类型raw(20))