Не работает шифрование в Oracle
Я пытаюсь сделать шифрование и дешифрование в Oracle, но у меня возникают проблемы с директорией ключа. Ошибка:
Произошла ошибка: ORA-29283: недопустимая операция файла : несуществующий файл или путь [29434]
Ошибка: файл не существует.
Произошла ошибка: ORA-02291: нарушено ограничение целостности (USER1.PRODUCT_FK1) - исходный ключ не найден
Код для проверки шифрования:
DECLARE
key_v RAW(16);
BEGIN
GENERATE_PRODEDURE_KEY('key1');
READ_GENERATED_KEY('key1', key_v);
ENCRYPT_PRODUCT('Телевизор Samsung');
DECRYPT_PRODUCT(214);
ENCRYPT_PRODUCT_WITH_FILE_KEY('Телевизор Philips', 'key1');
DECRYPT_PRODUCT_WITH_FILE_KEY(13, 'key1');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Произошла ошибка: ' || SQLERRM);
END;
Таблица:
CREATE TABLE "USER1"."PRODUCT"
( "ID" NUMBER(*,0) DEFAULT "USER1"."PRODUCT_SEQUENCE"."NEXTVAL" NOT NULL ENABLE,
"NAME" VARCHAR2(80 BYTE) NOT NULL ENABLE,
"GROUP_ID" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE,
"ENTRY_PRICE" NUMBER DEFAULT 0,
"RETAIL_PRICE" NUMBER DEFAULT 0,
"COUNT" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE,
CONSTRAINT "PRODUCT_PK" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "PRODUCT_FK1" FOREIGN KEY ("GROUP_ID")
REFERENCES "USER1"."PRODUCT_GROUP" ("ID") ON DELETE CASCADE ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
Процедуры:
create or replace NONEDITIONABLE PROCEDURE generate_prodedure_key(file_name VARCHAR2) AS
key_raw RAW(16);
fk1 UTL_FILE.FILE_TYPE;
BEGIN
fk1 := UTL_FILE.FOPEN('KEY_DIR', file_name, 'wb', 16);
key_raw := DBMS_CRYPTO.RANDOMBYTES(16);
UTL_FILE.PUT_RAW(fk1, key_raw);
UTL_FILE.FCLOSE(fk1);
DBMS_OUTPUT.PUT_LINE('Сгенерированный ключ: ' || key_raw);
END;
create or replace NONEDITIONABLE PROCEDURE read_generated_key(file_name VARCHAR2, key OUT RAW) AS
fk1 UTL_FILE.FILE_TYPE;
BEGIN
fk1 := UTL_FILE.FOPEN('KEY_DIR', file_name, 'rb', 16);
UTL_FILE.GET_RAW(fk1, key, DBMS_LOB.GETLENGTH(key));
UTL_FILE.FCLOSE(fk1);
DBMS_OUTPUT.PUT_LINE('прочитаный ключ:' || key);
END;
create or replace NONEDITIONABLE PROCEDURE password_change_handler (
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2
) IS
BEGIN
INSERT INTO password_change_audit (username, change_date)
VALUES (USER, SYSTIMESTAMP);
END;
create or replace NONEDITIONABLE PROCEDURE encrypt_product(input_string VARCHAR2)
AS
encrypted_raw RAW(2000);
encryption_key RAW(2000);
encryption_key_str VARCHAR2(16) := 'ключ_0123456';
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
encryption_key := UTL_RAW.CAST_TO_RAW(encryption_key_str);
encrypted_raw := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), encryption_type, encryption_key);
INSERT INTO PRODUCT (NAME) VALUES (encrypted_raw);
DBMS_OUTPUT.PUT_LINE('Данные успешно зашифрованы и добавлены в таблицу PRODUCT.');
END;
create or replace NONEDITIONABLE PROCEDURE decrypt_product(product_id_v NUMBER) AS
encrypted_raw RAW(2000);
decryption_key RAW(2000);
encryption_key_str VARCHAR2(16) := 'ключ_0123456';
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
decrypted_raw RAW(2000);
decrypted_string VARCHAR2(2000);
BEGIN
SELECT NAME INTO encrypted_raw FROM PRODUCT WHERE ID = product_id_v;
DBMS_OUTPUT.PUT_LINE(encrypted_raw);
decryption_key := UTL_RAW.CAST_TO_RAW(encryption_key_str);
decrypted_raw := DBMS_CRYPTO.DECRYPT(encrypted_raw, encryption_type, decryption_key);
decrypted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE(decrypted_string);
UPDATE PRODUCT SET NAME = decrypted_string WHERE ID = product_id_v;
DBMS_OUTPUT.PUT_LINE('Данные успешно дешифрованы и добавлены в таблицу PRODUCT.');
END;
create or replace NONEDITIONABLE PROCEDURE encrypt_product_with_file_key(input_string VARCHAR2, key_file_name VARCHAR2) AS
encrypted_raw RAW(2000);
encryption_key RAW(16);
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
user1.read_generated_key(key_file_name, encryption_key);
encrypted_raw := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), encryption_type, encryption_key);
INSERT INTO PRODUCT (NAME) VALUES (encrypted_raw);
DBMS_OUTPUT.PUT_LINE('Данные успешно зашифрованы и добавлены в таблицу PRODUCT.');
END;
create or replace NONEDITIONABLE PROCEDURE decrypt_product_with_file_key(product_id_v NUMBER, key_file_name VARCHAR2) AS
encrypted_raw RAW(2000);
encryption_key RAW(16);
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
decrypted_raw RAW(2000);
decrypted_string VARCHAR2(2000);
BEGIN
SELECT NAME INTO encrypted_raw FROM PRODUCT WHERE ID = product_id_v;
read_generated_key(key_file_name, encryption_key);
decrypted_raw := DBMS_CRYPTO.DECRYPT(encrypted_raw, encryption_type, encryption_key);
decrypted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE(decrypted_string);
UPDATE PRODUCT SET NAME = decrypted_string WHERE ID = product_id_v;
DBMS_OUTPUT.PUT_LINE('Данные успешно дешифрованы и добавлены в таблицу PRODUCT.');
END;