【问题标题】:Does Oracle have any built-in hash function? [duplicate]Oracle 有内置的散列函数吗? [复制]
【发布时间】:2012-06-17 23:00:10
【问题描述】:

可能重复:
Is there any hash function in PL/SQL?

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

【问题讨论】:

  • 参见 dbms_crypto.hash docs.oracle.com/cd/E11882_01/appdev.112/e25788/…。我没有看到采用 NCLOB 的版本,我不知道 src IN CLOB CHARACTER SET ANY_CS 是否可以在所有情况下都无损失地采用 NCLOB。有待调查。
  • 这个问题不是完全重复的。散列 NCLOB 或 VARCHAR2 之间存在一些细微但显着的差异。具体来说,如果您使用 ORA_HASH,对 NCLOB 进行散列处理可能不是确定性的,因此另一个问题的其中一个答案可能不合适。有关确定性哈希的信息,请在此处查看我的答案:stackoverflow.com/a/9476696/409172

标签: oracle hash plsql


【解决方案1】:

是的:散列和加密(相关但不完全相同)都是通过 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 讨厌密码哈希

对于它的价值,我不知道 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”。

【讨论】:

  • 在某些方面,这比重复问题中接受的答案更好。代码示例和详细信息,而不仅仅是一个指南链接。
  • OTOH,确实值得 -1,通常确实希望使用盐 + 密码的加密哈希,而不是加密,来存储密码(除非您需要能够提取密码,但很吓人.) 见security.stackexchange.com/questions/8945/…
  • @ShannonSeverance 恐怕我不能比将文章链接到专家的人更聪明地争论这一点了。请接受我的道歉。如果您对此事有想法,我总是乐于听取新的想法。我打破了当前的假设,即无盐加密算法和无盐哈希算法都是可逆的。哈希是一种方法,直到有人将它们反转,这并不长。考虑到这一点,请考虑它们的不同之处。 krebsonsecurity.com/2012/06/…
  • 啊,有趣。我没有听说过加密哈希与密码哈希的区别。 cmets中链接的文章很好。我的评论是关于使用加密的第一个版本。现在 +1。
  • 你不会相信这在工作中引发的讨论。在处理这类事情时使用诸如“加密”、“哈希”和“算法”之类的通用词会使我们所有人围成一圈,然后跑到我们的电脑前查找。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2011-03-10
  • 1970-01-01
  • 2012-03-03
  • 2022-01-24
相关资源
最近更新 更多