oracle - Oracle 是否有任何内置的哈希函数?

标签 oracle hash plsql

这个问题在这里已经有了答案:




9年前关闭。




Possible Duplicate:
Is there any hash function in PL/SQL?



我在 Oracle 11g 中有一个 NCLOB 数据库类型的列。我需要获取其内容的哈希值。如何使用任何内置 Oracle 函数或在 Oracle 中的 PL/SQL SP 中执行此操作?

最佳答案

是的:散列和加密(相关但不完全相同)都是通过 SYS 包 DBMS_CRYPTO 完成的。

简单的 SHA-1 散列

l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );

简单的 MD5 散列
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );

dbms_crypto.hash() 概述

hash() 函数被重载以接受以下类型:RAW、BLOB 和 CLOB。根据implicity data conversions原始可接受的输入类型为 RAW、CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG、BLOB。 RAW/隐式 RAW 转换、BLOB 和 CLOB 未涵盖的所有其他数据类型(DATE、TIMESTAMP 等)必须首先通过 TO_CHAR() 传递。

值得注意的是 dbms_crypto.hash() 支持以下散列算法:
  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

  • 密码:以防万一

    如果您要存储密码,我建议您使用密码存储哈希(bcrypt、PBKDF2 或 scrypt)而不是加密哈希(md5、sha-1 等)。不同之处在于密码存储哈希需要时间来破解,而加密哈希需要快速完成。当通过蛮力攻击系统的密码列表时,在尝试破解通过加密算法传递的加盐值时,时间密集程度要高几个数量级。考虑到在单个值上使用密码哈希可能需要大约 100 毫秒(对于单个真实登录来说并不多),但对于整个密码列表的蛮力(每个密码数百万/数十亿次尝试)来说非常慢。

    Oracle 讨厌密码哈希

    至于它的值(value),我不知道来自 Oracle 的任何提供密码散列支持的软件包。但是,您可以通过使用“loadjava”来完成此操作。 ' 并将 Java bcrypt 实现放在与 Oracle 的 RDBMS 一起运行的 JVM 中。然后您可以使用 PL/SQL wrapper调用实现 bcrypt 的 Java 类。如果您使用的是中间层,您可以使用该语言(.NET、PHP、Perl、Ruby、Python、Java 等)中可用的许多其他选项,并跳过尝试使用“loadjava”。

    我的意思是加密而不是哈希!

    如果 dbms_crypto.hash() 未涵盖您需要的散列,您可能会通过 dbms_crypto.encrypt 寻找加密,它的工作原理非常相似,但它采用以下类型:
  • ENCRYPT_DES
  • ENCRYPT_3DES_2KEY
  • ENCRYPT_3DES
  • ENCRYPT_AES
  • ENCRYPT_PBE_MD5DES
  • ENCRYPT_AES128
  • ENCRYPT_AES192
  • ENCRYPT_AES256

  • 这是完整的11gR2 documentation on DBMS_CRYPTO .所有其他版本均可通过 tahiti.oracle.com 获得.只需单击您的版本,然后搜索“dbms_crypto”。

    关于oracle - Oracle 是否有任何内置的哈希函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075452/

    相关文章:

    plsql - 带 & 符号前缀参数的 oracle PL/SQL 函数/过程调用

    oracle - 如何编写 oracle Query 将字符串拆分为按类别相关的多行

    ruby - 在 Ruby 中安全地加载哈希

    perl - 从 HoA 值中获取独特的元素并打印

    oracle - 导致WRITE_ERROR,Oracle PL/SQL的常见原因是什么?

    sql - Oracle - 重用带有参数的 SELECT

    node.js - 无法使用 NodeJS 从表中检索数据。错误: ORA-12560: TNS:protocol adapter error

    Java SQL 结果集数据类型

    sql - SQL唯一组合

    java - 如何调用存储在 HashMap 中的方法? ( java )