可能重复: PL/SQL中有散列函数吗?
我在Oracle 11g中有一个具有NCLOB数据库类型的列。我需要为它的内容获取一个散列值。如何使用任何内置的Oracle函数或Oracle中的PL/SQL来完成此操作?
发布于 2012-06-18 16:36:03
是的:散列和加密(相关但不完全相同)都是通过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()概述
重载散列()函数以接受以下类型: RAW、BLOB和CLOB。根据隐式数据转换对RAW可接受的输入类型有raw、CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG、BLOB。未在原始/隐式原始转换、BLOB和CLOB中涵盖的所有其他数据类型(日期、时间戳等)必须首先通过TO_CHAR()传递。
值得注意的是,dbms_crypto.hash()支持以下散列算法:
密码:以防万一
如果要存储密码,我建议您使用密码存储哈希(bcrypt、PBKDF2或scrypt),而不是密码散列(md5、sha-1等)。不同之处在于,密码存储散列需要花费时间才能中断,而密码散列则意味着要快速完成。当通过暴力攻击系统的密码列表时,当试图破坏一个通过密码算法传递的盐渍值时,它的数量级要花费更多时间。考虑一下,在单个值上使用密码散列可能需要100 of (对于一个真实的登录来说并不多),但是对于整个密码列表上的蛮力(每个密码数百万/数十亿次尝试)来说非常慢。
甲骨文讨厌密码散列
值得注意的是,我不知道Oracle提供密码哈希支持的任何包。但是,您可以通过使用“加载”并在JVM中放置一个Java实现来实现这一点,该实现使用Oracle运行。然后,您可以使用PL/SQL包装器来调用实现bcrypt的Java类。如果您使用的是中间层,您可以使用该语言提供的许多其他选项(.NET、PHP、Perl、Ruby、Python、Java等),并跳过使用'loadjava‘的尝试。
我的意思是加密而不是散列!
如果您所需要的散列不在dbms_crypto.hash()中,您可能需要通过dbms_crypto.encrypt进行加密,而dbms_crypto.encrypt的工作方式非常类似,但它需要以下类型:
这是完整的密密。所有其他版本都可以通过tahiti.oracle.com获得。只需单击您的版本,然后搜索'dbms_crypto‘。
https://stackoverflow.com/questions/11075452
复制相似问题