Security Advisory |
Applies a supported cryptographic hash function to a SQL statement. This function can not be used to hash a string that is not a valid SQL statement.
There is no valid reason for any user to have or request EXECUTE on this package. If a request is made treat it with great suspicion and do not grant the object privilege without a deep investigation as to why and workarounds.
And, if you do, revalidate the need no less frequently than once each year. |
|
Recommended Security Rules |
NEVER
- Grant execute on this package to any user or role
WITH GREAT CARE
- Check regularly to determine if execute on this package has been granted and if so treat it as highly suspicious: It should raise alarms.
CAUTIONS
|
|
How Oracle Works |
Oracle Documentation says this package function can only be used to hash a valid SQL statement |
-- And the verdict, we are happy to say, is:
DECLARE
sqlstr VARCHAR2(4000):='This function can not be used to hash a string that is not a valid SQL statement.';
digtype PLS_INTEGER := 3;
RetVal RAW(2000);
BEGIN
SELECT dbms_sqlhash.gethash(sqlstr, dbms_crypto.hash_sh1)
INTO RetVal
FROM dual;
dbms_output.put_line(RetVal);
END;
/
DECLARE
*
ERROR at line 1:
ORA-00900: invalid SQL statement
ORA-06512: at "SYS.DBMS_SQLHASH", line 94
ORA-06512: at "SYS.DBMS_SQL", line 1134
ORA-06512: at "SYS.DBMS_SQLHASH", line 26
ORA-06512: at line 1
ORA-06512: at line 6
-- but we like to push a little harder
DECLARE
sqlstr VARCHAR2(4000):='SELECT COUNT(*) FROM (SELECT ''DBA_TABLES'' FROM dual)';
digtype PLS_INTEGER := 3;
RetVal RAW(2000);
BEGIN
dbms_output.put_line(sqlstr);
SELECT dbms_sqlhash.gethash(sqlstr, dbms_crypto.hash_sh1)
INTO RetVal
FROM dual;
dbms_output.put_line(RetVal);
END;
/
SELECT COUNT(*) FROM (SELECT 'DBA_TABLES' FROM dual)
D9195BEDB8CCAC0F0D4FAAC8D386491E7FE2AD0E
PL/SQL procedure successfully completed.
DECLARE
sqlstr VARCHAR2(4000):='WITH
q AS (SELECT dummy FROM dual) SELECT dummy FROM q';
digtype PLS_INTEGER := 3;
RetVal RAW(2000);
BEGIN
dbms_output.put_line(sqlstr);
SELECT dbms_sqlhash.gethash(sqlstr, dbms_crypto.hash_sh1)
INTO RetVal
FROM dual;
dbms_output.put_line(RetVal);
END;
/
WITH q AS (SELECT dummy FROM dual) SELECT dummy FROM q
0B1DEF79965ED3A49321922201F414D1117D6753
PL/SQL procedure successfully completed.
-- and it seems likely to be a true statement within the realm of real-world SQL |
|
DBMS_SQLHASH Package Information |
AUTHID |
CURRENT_USER |
Constants (uses DBMS_CRYPTO constants also listed here) |
Name |
Data Type |
Value |
General |
HASH_MD4 (128 bit hash) |
BINARY_INTEGER |
1 |
HASH_MD5 (128 bit hash) |
BINARY_INTEGER |
2 |
HASH_SH1 (160 bit hash) |
BINARY_INTEGER |
3 |
HASH_SH256 |
BINARY_INTEGER |
4 |
HASH_SH384 |
BINARY_INTEGER |
5 |
HASH_SH512 |
BINARY_INTEGER |
6 |
|
Dependencies |
DBMS_CRYPTO |
DBMS_SQL |
UTL_RAW |
DBMS_LOB |
|
|
|
Documented in Types & Packages |
No |
First Available |
12.1 |
Pragma |
PRAGMA SUPPLEMENTAL_LOG_DATA(default, NONE); |
Security Model |
Owned by SYS with no privileges granted |
Source |
{ORACLE_HOME}/rdbms/admin/dbmsobtk.sql |
|
GETHASH |
Interface to generate the hash value of the result set returned by a SQL query |
dbms_sqlhash.gethash(
sqltext IN VARCHAR2, -- input sql statement
digest_type IN BINARY_INTEGER, -- digest algorithm type
chunk_size IN NUMBER DEFAULT 134217728) -- 128M
RETURN RAW; |
set serveroutput on
DECLARE
sqlstr VARCHAR2(4000):='SELECT object_name FROM all_objects WHERE rownum = 1';
digtype PLS_INTEGER := 3;
RetVal RAW(2000);
BEGIN
SELECT dbms_sqlhash.gethash(sqlstr, dbms_crypto.hash_sh1)
INTO RetVal
FROM dual;
dbms_output.put_line(RetVal);
END;
/
3806F18B5BCF32570525EF9A234AA1D07A78084E
PL/SQL procedure successfully completed. |