首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle有内置的散列函数吗?

Oracle有内置的散列函数吗?
EN

Stack Overflow用户
提问于 2012-06-17 23:00:10
回答 1查看 46.1K关注 0票数 15

可能重复: PL/SQL中有散列函数吗?

我在Oracle 11g中有一个具有NCLOB数据库类型的列。我需要为它的内容获取一个散列值。如何使用任何内置的Oracle函数或Oracle中的PL/SQL来完成此操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-18 16:36:03

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

简单SHA-1散列

代码语言:javascript
运行
复制
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );

简单MD5哈希

代码语言:javascript
运行
复制
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()支持以下散列算法:

  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

密码:以防万一

如果要存储密码,我建议您使用密码存储哈希(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的工作方式非常类似,但它需要以下类型:

  • ENCRYPT_DES
  • ENCRYPT_3DES_2KEY
  • ENCRYPT_3DES
  • ENCRYPT_AES
  • ENCRYPT_PBE_MD5DES
  • ENCRYPT_AES128
  • ENCRYPT_AES192
  • ENCRYPT_AES256

这是完整的密密。所有其他版本都可以通过tahiti.oracle.com获得。只需单击您的版本,然后搜索'dbms_crypto‘。

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11075452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档