Не удаётся воспользоваться пакетом DBMS_CRYPTO

Пытаюсь использовать функции DBMS_CRYPTO. От SYSTEM запускаю:

  DECLARE
        l_key      VARCHAR2 (2000) := '1234567890123456';
        l_in_val   VARCHAR2 (2000) := 'Confidential Data';
        l_mod      NUMBER
           :=   DBMS_CRYPTO.encrypt_aes128
              + DBMS_CRYPTO.chain_cbc
              + DBMS_CRYPTO.pad_pkcs5;
        l_enc      RAW (2000);
    BEGIN
       l_enc :=
          DBMS_CRYPTO.encrypt (utl_i18n.string_to_raw (l_in_val, 'AL32UTF8'),
                               l_mod,
                               utl_i18n.string_to_raw (l_key, 'AL32UTF8')
                              );
       DBMS_OUTPUT.put_line ('Encrypted=' || l_enc);
   END;

Он выдаёт :

Error report -
ORA-06550: Строка 5, столбец 17:
PLS-00201: идентификатор 'DBMS_CRYPTO' должен быть объявлен
ORA-06550: Строка 4, столбец 20:
PL/SQL: Item ignored
ORA-06550: Строка 11, столбец 11:
PLS-00201: идентификатор 'DBMS_CRYPTO' должен быть объявлен
ORA-06550: Строка 10, столбец 8:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

Смотрю select * from dba_objects where object_name = 'DBMS_CRYPTO'; выдаёт: введите сюда описание изображения

Попытался создать нового пользователя и дать ему права:

grant execute on sys.dbms_crypto to VICE_SYS; 

Но тоже ошибка:

Error starting at line : 1 in command -
grant execute on sys.dbms_crypto to VICE_SYS
Error report -
ORA-00942: таблица или представление пользователя не существует
00942. 00000 -  "table or view does not exist"
*Cause:

Что делать?


Ответы (1 шт):

Автор решения: 0xdb

Надо дать права выполнения пакета. Это может только пользователь SYS, никто другой.

DBMS_CRYPTO Security Model
Oracle Database installs this package in the SYS schema. You can then grant package access to existing users and roles as needed.

SQL> show user
USER is "ME"
SQL> exec dbms_output.put_line ('result='||dbms_crypto.randombytes (16));
ORA-06550: line 1, column 40:
PLS-00201: identifier 'DBMS_CRYPTO' must be declared

SQL> conn sys/pass@dbsrv/pdb1 as sysdba
Connected.
SQL> grant execute on dbms_crypto to me;

Grant succeeded.

SQL> conn me/me@mpsrv/pdb1.19c
Connected.
SQL> exec dbms_output.put_line ('result='||dbms_crypto.randombytes (16));
result=7311CFC8CF6AEB02C5B6238DFB8FBB1E

PL/SQL procedure successfully completed.
→ Ссылка