在Oracle中创建一行的sha1-hash

Pro*_*ake 15 oracle hash sha1

我在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使用RAWTOHEXUTL_ENCODE.BASE64_ENCODE函数将其转换为.

HASH函数被重载以接受三种数据类型作为输入:RAW,CLOBBLOB.由于隐式转换规则,如果您使用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.hash_sh1代表(整数3)而不是常量,以使其在执行常规SQL时起作用.SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1),3)FROM t; (2认同)
  • 我不认为11g R2完全正确.`dbms_crypto.hash`似乎有`raw`,`blob`和`clob`的3个重载版本.`varchar2`值必须用`utl_i18n.string_to_raw`或`utl_raw.cast_to_raw`显式转换为`raw`.或者使用`clobs`作为字符数据. (2认同)

Pie*_*ois 8

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)