DBMS_CRYPTO默认仅SYS可用,普通用户须显式授权EXECUTE ON SYS.DBMS_CRYPTO;撤销权限也必须用完整限定名REVOKE EXECUTE ON SYS.DBMS_CRYPTO FROM user,且需检查角色间接授权和PUBLIC同义词。

DBMS_CRYPTO执行权限默认只给SYS,普通用户必须显式授权
Oracle从10g起就把DBMS_CRYPTO的EXECUTE权限从PUBLIC撤掉了,现在默认只有SYS(或SYSDBA)能用。如果你发现某个非SYS用户能调用它,说明之前有人手动授过权:GRANT EXECUTE ON SYS.DBMS_CRYPTO TO some_user;。撤销动作必须由有GRANT ANY OBJECT PRIVILEGE权限的用户(通常是SYS或SYSTEM)执行,否则会报ORA-01031: insufficient privileges。
撤销命令必须带OWNER和PACKAGE名,不能只写DBMS_CRYPTO
Oracle要求对象权限撤销时必须明确指定所有者和对象全名。只写REVOKE EXECUTE ON DBMS_CRYPTO FROM user_name;会报ORA-00942: table or view does not exist——因为DBMS_CRYPTO不在当前schema下。正确写法是:
REVOKE EXECUTE ON SYS.DBMS_CRYPTO FROM scott;
- OWNER必须是
SYS,大小写敏感;双引号包裹的名称要严格匹配(如"Dbms_Crypto"极少出现,不建议) - 不能省略
SYS.前缀,也不能写成DBMS_CRYPTO或sys.dbms_crypto(小写会失败) - 如果目标用户是角色(比如
app_developer_role),同样适用:REVOKE EXECUTE ON SYS.DBMS_CRYPTO FROM app_developer_role;
撤销后用户调用会直接报PLS-00201,但已编译的代码不会立刻失效
权限撤销后,新会话中用户执行DBMS_CRYPTO.ENCRYPT等函数会立即报错:
PLS-00201: identifier 'SYS.DBMS_CRYPTO' must be declared
- 这个错误说明解析阶段就失败了,不是运行时报错
- 但如果该用户已有存储过程/函数在撤销前就编译成功,那些对象仍处于
VALID状态,还能运行;直到下次重新编译(比如ALTER PACKAGE xxx COMPILE)才会暴露问题 - 所以撤销后务必查
DBA_OBJECTS WHERE STATUS = 'INVALID' AND OWNER = 'SCOTT',重点盯PROCEDURE、FUNCTION、PACKAGE BODY
别漏掉PUBLIC同义词和角色间接授权
有些环境会在PUBLIC上建同义词方便调用:CREATE PUBLIC SYNONYM DBMS_CRYPTO FOR SYS.DBMS_CRYPTO;。仅撤销EXECUTE权限不够,用户仍可通过同义词访问——但会因缺少权限而失败。更危险的是间接路径:如果scott属于某个角色dev_role,而dev_role被授予了EXECUTE ON SYS.DBMS_CRYPTO,那撤销scott的直授权没用,得去查并撤销角色上的权限。
- 查间接来源:
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE IN (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SCOTT') - 查同义词:
SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = 'DBMS_CRYPTO' AND OWNER = 'PUBLIC';,存在就删:DROP PUBLIC SYNONYM DBMS_CRYPTO;
真正生效的边界很窄:必须确保SYS.DBMS_CRYPTO上对目标用户(或其任一有效角色)没有EXECUTE记录,且无PUBLIC同义词绕行。任何一环漏掉,都可能让权限回收形同虚设。


















