如何调用Oracle MD5哈希函数?

时间:2014-03-20 12:27:56

标签: sql oracle plsql oracle11g

我有以下代码。我正在使用Oracle 11g。

SELECT DBMS_OBFUSCATION_TOOLKIT.md5 (input => UTL_RAW.cast_to_raw(
  FIRST_NAME
  ||LAST_NAME
  )) md5_key ,
  FIRST_NAME ,
  LAST_NAME
FROM C_NAME_TAB
WHERE PKEY='1234'

我如何调用此代码?我可以直接在sqldeveloper中执行此代码吗?

4 个答案:

答案 0 :(得分:26)

在Oracle 12c中,您可以使用函数STANDARD_HASH。它不需要任何额外的权限。

select standard_hash('foo', 'MD5') from dual;

不推荐使用dbms_obfuscation_toolkit(请参阅注释here)。您可以直接使用DBMS_CRYPTO:

select rawtohex(
    DBMS_CRYPTO.Hash (
        UTL_I18N.STRING_TO_RAW ('foo', 'AL32UTF8'),
        2)
    ) from dual;

输出:

ACBD18DB4CC2F85CEDEF654FCCC4A4D8

如果需要,添加较低的函数调用。更多关于DBMS_CRYPTO

答案 1 :(得分:3)

我愿意:

select DBMS_CRYPTO.HASH(rawtohex('foo') ,2) from dual;

输出:

DBMS_CRYPTO.HASH(RAWTOHEX('FOO'),2)
--------------------------------------------------------------------------------
ACBD18DB4CC2F85CEDEF654FCCC4A4D8

答案 2 :(得分:2)

@ user755806我不相信你的问题得到了解答。我拿了你的代码,但使用了' foo'示例字符串,添加了较低的函数,并且还发现了返回的哈希的长度。在sqlplus或Oracle的sql developer Java数据库客户端中,您可以使用它来调用值的md5sum。列格式清理演示文稿。

column hash_key format a34;
column hash_key_len format 999999;
select dbms_obfuscation_toolkit.md5(
          input => UTL_RAW.cast_to_raw('foo')) as hash_key,
       length(dbms_obfuscation_toolkit.md5(
          input => UTL_RAW.cast_to_raw('foo'))) as hash_key_len
 from dual;

结果集

HASH_KEY                           HASH_KEY_LEN
---------------------------------- ------------
acbd18db4cc2f85cedef654fccc4a4d8             32

与Linux md5sum命令返回的值相同。

echo -n foo | md5sum
acbd18db4cc2f85cedef654fccc4a4d8  -
  1. 是的,您可以直接在sqlplus或sql developer中调用或执行sql语句。我在两个客户端中测试了sql语句对11g。
  2. 您可以使用任何可以向数据库发送语句的C,C#,Java或其他编程语言。它是调用另一端的数据库,需要能够理解sql语句。在11克的情况下,代码将起作用。
  3. @tbone对dbms_obfuscation_toolkit的弃用提供了很好的警告。但是,这并不意味着您的代码在12c中无法使用。它会工作但你最终会想要切换到dbms_crypto包。 dbms_crypto在我的11g版本中不可用。

答案 3 :(得分:0)

要使用我想要的编码计算CLOB内容字段的MD5哈希,而不将内容重新编码到AL32UTF8,我已使用此代码:

$Attachment | Move-Item -Destination "$dir\subfolder"