从oracle包中检索密码
我有以下代码,我的问题是如何确保从oracle包中检索密码,oracle,variables,encryption,package,Oracle,Variables,Encryption,Package,我有以下代码,我的问题是如何确保l_key中的加密密钥没有更改 create or replace PACKAGE BODY "ENCRYPT_DECRYPT_PASSWORD" AS l_key RAW(128) := utl_raw.cast_to_raw('secret'); ---------------------------------------------------------------------
l_key
中的加密密钥没有更改
create or replace PACKAGE BODY "ENCRYPT_DECRYPT_PASSWORD"
AS
l_key RAW(128) := utl_raw.cast_to_raw('secret');
------------------------------------------------------------------------
FUNCTION encrypt_val( p_val IN VARCHAR2 ) RETURN VARCHAR2
IS
l_encrypted RAW(2048);
l_val RAW(2048) := utl_raw.cast_to_raw(p_val);
BEGIN
l_encrypted := dbms_crypto.encrypt
( src => l_val,
typ => dbms_crypto.des_cbc_pkcs5,
key => l_key );
return utl_raw.cast_to_varchar2(l_encrypted);
END encrypt_val;
-----------------
-----------------
-----------------
FUNCTION decrypt_val( p_val IN varchar2 ) RETURN VARCHAR2
IS
l_decrypted RAW(2048);
l_val RAW(2048) := utl_raw.cast_to_raw(p_val);
BEGIN
l_decrypted := dbms_crypto.decrypt
( src => l_val,
typ => dbms_crypto.des_cbc_pkcs5,
key => l_key );
return utl_raw.cast_to_varchar2(l_decrypted);
END decrypt_val;
-----------------
-----------------
-----------------
PROCEDURE encrypt_table_passwords(table_name IN varchar2,
column_name IN varchar2,
table_id IN varchar2) IS
BEGIN
EXECUTE IMMEDIATE
'begin
for c1 in (select * from ' || table_name ||') loop
update ' || table_name || ' set ' || column_name || ' = ENCRYPT_DECRYPT_PASSWORD.encrypt_val(c1.' || column_name || ') where ' || table_id || ' = c1.'||table_id||' and ' || column_name ||
' is not null; end loop; end;';
END encrypt_table_passwords;
-----------------
-----------------
-----------------
FUNCTION get_decrypted_password( table_name IN varchar2,column_name IN varchar2,table_id IN varchar2,table_id_val IN varchar2 ) RETURN VARCHAR2
IS
encrypted_pas varchar2(100);
decrypted_pas varchar2(100);
BEGIN
EXECUTE IMMEDIATE 'select ' || column_name || ' from ' || table_name || ' where ' || table_id || ' = ' || table_id_val
INTO encrypted_pas;
Select decrypt_val(encrypted_pas) into decrypted_pas from dual;
--return decrypt_val(encrypted_pas);
return decrypted_pas;
END get_decrypted_password;
END encrypt_decrypt_password;
我尝试了在web上找到的以下内容,但它似乎不适用于我的oracle版本:
DECLARE
v_x RAW(128);
BEGIN
SELECT ENCRYPT_DECRYPT_PASSWORD.l_key x
INTO v_x
FROM DUAL;
DBMS_OUTPUT.put_line (v_x);
END;
/
我得到“必须声明组件'L_KEY'和“无效标识符”
我想调查的原因是,在我将password列从varchar(99)更改为nvarchar2(100)并重新生成加密密码后,出现了解密错误
我得到“必须声明组件'L_KEY'和“无效标识符”
L_密钥在包体中声明。这意味着其范围是私有的,仅限于机构的代码。只有包规范中声明的内容是公共的,并且可以在包范围之外访问
如果需要检查其实际值,则需要使用返回L_键的函数扩展包。你可能不想在生产中暴露它,所以要小心。您可能希望考虑使用以确保没有意外泄漏。
我得到“必须声明组件'L_KEY'和“无效标识符”
L_密钥在包体中声明。这意味着其范围是私有的,仅限于机构的代码。只有包规范中声明的内容是公共的,并且可以在包范围之外访问
如果需要检查其实际值,则需要使用返回L_键的函数扩展包。你可能不想在生产中暴露它,所以要小心。您可能希望考虑使用以确保没有意外泄漏。