在 Oracle 中制作一行的 sha1-hash
我在 Oracle 数据库上的选择中创建行的 sha1-hash 时遇到问题.我在 MSSQL 中做了如下:
I'm having a problem with making a sha1-hash of a row in a select on an Oracle database. I've done it in MSSQL as follows:
SELECT *,HASHBYTES('SHA1',CAST(ID as varchar(10)+
TextEntry1+TextEntry2+CAST(Timestamp as varchar(10)) as Hash
FROM dbo.ExampleTable
WHERE ID = [foo]
但是,我似乎找不到在使用 Oracle 时使用的类似函数.就我的谷歌搜索给我带来的,我猜 dbms_crypto.hash_sh1 与它有关,但我还没有能够将我的大脑围绕它......
However, I can't seem to find a similar function to use when working with Oracle. As far as my googling has brought me, I'm guessing dbms_crypto.hash_sh1 has something to do with it, but I haven't been able to wrap my brain around it yet...
任何指针将不胜感激.
推荐答案
DBMS_CRYPTO 是生成哈希的正确包.默认情况下,它不会授予 PUBLIC,您必须专门授予它 (GRANT EXECUTE ON SYS.DBMS_CRYPTO TO user1).
The package DBMS_CRYPTO is the correct package to generate hashes. It is not granted to PUBLIC by default, you will have to grant it specifically (GRANT EXECUTE ON SYS.DBMS_CRYPTO TO user1).
这个函数的结果是数据类型RAW.您可以将其存储在 RAW 列中或使用 RAWTOHEX 或 UTL_ENCODE.BASE64_ENCODE 函数将其转换为 VARCHAR2.
The result of this function is of datatype RAW. You can store it in a RAW column or convert it to VARCHAR2 using the RAWTOHEX or UTL_ENCODE.BASE64_ENCODE functions.
HASH 函数被重载以接受三种数据类型作为输入:RAW、CLOB 和 BLOB.由于隐式转换规则,如果您使用 VARCHAR2 作为输入,Oracle 将尝试将其转换为 RAW 并且很可能会失败,因为此转换仅适用于十六进制字符串.
The HASH function is overloaded to accept three datatypes as input: RAW, CLOB and BLOB. Due to the rules of implicit conversion, if you use a VARCHAR2 as input, Oracle will try to convert it to RAW and will most likely fail since this conversion only works with hexadecimal strings.
如果你使用VARCHAR2,那么你需要将输入转换为二进制数据类型或CLOB,例如:
If you use VARCHAR2 then, you need to convert the input to a binary datatype or a CLOB, for instance :
DECLARE
x RAW(20);
BEGIN
SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1||col2||to_char(col3)),
sys.dbms_crypto.hash_sh1)
INTO x
FROM t;
END;
您可以在 DBMS_CRYPTO 的文档中找到更多信息.哈希
相关文章