可能是重复问题:
在 PL/SQL 中有任何哈希函数吗?
我在 Oracle 11g 中有一个 NCLOB 数据库类型的列。 我需要获取其内容的哈希值。 我可以使用任何内置的 Oracle 函数或在 Oracle 中的 PL/SQL SP 内部如何实现此操作?
可能是重复问题:
在 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。根据raw可接受输入类型的implicity data conversions,其可接受的输入类型为RAW、CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG和BLOB。所有其他数据类型(DATE、TIMESTAMP等)不包括在RAW/隐式RAW转换、BLOB和CLOB之下,必须先通过TO_CHAR()转换。
值得注意的是,dbms_crypto.hash()支持以下哈希算法:
密码:以防万一
如果您要存储密码,建议使用密码存储哈希(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进行加密,其工作方式非常相似,只是它接受以下类型:
这是完整的11gR2 DBMS_CRYPTO文档。所有其他版本均可通过tahiti.oracle.com获得。只需单击您的版本,然后搜索'dbms_crypto'。