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]
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…
Any pointers would be greatly appreciated.
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).The result of this function is of datatype
RAW. You can store it in aRAWcolumn or convert it toVARCHAR2using theRAWTOHEXorUTL_ENCODE.BASE64_ENCODEfunctions.The
HASHfunction is overloaded to accept three datatypes as input:RAW,CLOBandBLOB. Due to the rules of implicit conversion, if you use aVARCHAR2as input, Oracle will try to convert it toRAWand will most likely fail since this conversion only works with hexadecimal strings.If you use
VARCHAR2then, you need to convert the input to a binary datatype or aCLOB, for instance :you will find additional information in the documentation of
DBMS_CRYPTO.hash