这个问题在这里已经有了答案:
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() 支持以下散列算法:
密码:以防万一
如果您要存储密码,我建议您使用密码存储哈希(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 寻找加密,它的工作原理非常相似,但它采用以下类型:
这是完整的11gR2 documentation on DBMS_CRYPTO .所有其他版本均可通过 tahiti.oracle.com 获得.只需单击您的版本,然后搜索“dbms_crypto”。
关于oracle - Oracle 是否有任何内置的哈希函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075452/