Oracle有内置的哈希函数吗?

15

可能是重复问题:
在 PL/SQL 中有任何哈希函数吗?

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


请参见dbms_crypto.hash http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_crypto.htm#ARPLS65700。我没有看到接受NCLOB的版本,我不知道如果“src IN CLOB CHARACTER SET ANY_CS”可以在所有情况下不丢失地接受NCLOB。需要进行一些调查。 - Shannon Severance
这个问题并不是一个完全相同的副本。在对NCLOB或VARCHAR2进行哈希处理时存在一些细微但重要的差异。具体而言,如果使用ORA_HASH对NCLOB进行哈希处理,则可能不是确定性的,因此另一个问题的答案之一可能不适用。请参阅我在此处的答案,了解确定性哈希处理的信息:https://dev59.com/Umox5IYBdhLWcg3wFAY1#9476696 - Jon Heller
1个回答

39

是的:哈希和加密(相关但不完全相同)都是通过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。根据raw可接受输入类型的implicity data conversions,其可接受的输入类型为RAW、CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG和BLOB。所有其他数据类型(DATE、TIMESTAMP等)不包括在RAW/隐式RAW转换、BLOB和CLOB之下,必须先通过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 DBMS_CRYPTO文档。所有其他版本均可通过tahiti.oracle.com获得。只需单击您的版本,然后搜索'dbms_crypto'。


在某些方面,这个答案比重复问题中被接受的答案更好。它提供了代码示例和详细说明,而不仅仅是一个指向指南的链接。 - Shannon Severance
另一方面,而且真正值得注意的是,通常希望使用盐+密码的加密哈希算法来存储密码,而不是加密(除非您需要能够提取密码,但这很危险)。请参见http://security.stackexchange.com/questions/8945/what-is-the-use-of-password-encryption。 - Shannon Severance
@ShannonSeverance,我恐怕无法比链接一篇文章给一个专家更有智慧地辩论这个观点;请接受我的道歉。如果你对此有想法,我很乐意听取新的想法。我以目前的假设为基础工作,即未经盐处理的加密算法和哈希算法都是可逆的。哈希是单向的,直到有人把它们反转了,这不需要太长时间。在这种情况下,请考虑它们之间的区别。http://krebsonsecurity.com/2012/06/how-companies-can-beef-up-password-security/ - Andrew Martinez
啊,有趣。我之前没有听说过加密哈希和密码哈希的区别。评论中提供的文章很好。我的评论是关于最初版本建议使用加密的问题。现在+1。 - Shannon Severance
你无法想象这个话题在工作中引发了怎样的讨论。当涉及到这种事情时,使用像“加密”、“哈希”和“算法”这样的通用词汇让我们所有人都陷入了困境,然后跑去电脑上查找资料。 - Andrew Martinez
这是一个在Oracle DB内实现BCrypt的代码(https://github.com/MHeydari/BCrypt-algorithm-in-oracle-plsql)。 - Mohsen Heydari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接