我在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
并且很可能会失败,因为此转换仅适用于十六进制字符串.
如果您使用VARCHAR2
then,则需要将输入转换为二进制数据类型或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)
)
归档时间: |
|
查看次数: |
47044 次 |
最近记录: |