你好,我需要知道一种在 Oracle 中不使用 dbms_crypto 包来加密和解密数据的方法,因为我需要授予对此包的执行权限,但我无法获得此权限,所以如果有任何内置函数可以执行此操作,我尝试加密和解密但它只在sql server中工作我也尝试过standard_hash(col,'MD5')但它只是加密没有解密
也许是这样的:
/* encrypt and decrypt */
CREATE TABLE encryption_values
(
NAME VARCHAR2(100 BYTE),
VALUE NVARCHAR2(100)
);
INSERT INTO encryption_values
SELECT 'key' NAME,
RAWTOHEX ('52AB32;^$!ER94988OPS3W21') VALUE
FROM DUAL
UNION
SELECT 'iv' NAME, RAWTOHEX ('TY54ABCX') VALUE FROM DUAL;
SELECT * FROM encryption_values
CREATE OR REPLACE FUNCTION F_ENCRYPT (p_input VARCHAR2)
RETURN VARCHAR2
AS
v_encrypted_raw RAW (2000);
v_key RAW (320);
v_encryption_type PLS_INTEGER
:= DBMS_CRYPTO.DES_CBC_PKCS5;
v_iv RAW (320);
BEGIN
SELECT VALUE
INTO v_key
FROM encryption_values
WHERE name = 'key';
SELECT VALUE
INTO v_iv
FROM encryption_values
WHERE name = 'iv';
v_encrypted_raw :=
DBMS_CRYPTO.encrypt (src => UTL_I18N.STRING_TO_RAW (p_input, 'AL32UTF8'),
typ => v_encryption_type,
key => v_key,
iv => v_iv);
RETURN UTL_RAW.CAST_TO_VARCHAR2 (UTL_ENCODE.base64_encode (v_encrypted_raw));
END;
CREATE OR REPLACE FUNCTION F_DECRYPT (p_input VARCHAR2)
RETURN VARCHAR2
AS
v_decrypted_raw RAW (2000);
v_key RAW (320);
v_encryption_type PLS_INTEGER := DBMS_CRYPTO.DES_CBC_PKCS5;
v_iv RAW (320);
BEGIN
SELECT VALUE
INTO v_key
FROM encryption_values
WHERE name = 'key';
SELECT VALUE
INTO v_iv
FROM encryption_values
WHERE name = 'iv';
v_decrypted_raw :=
DBMS_CRYPTO.DECRYPT (
src => UTL_ENCODE.base64_decode (UTL_RAW.CAST_TO_RAW (p_input)),
typ => v_encryption_type,
key => v_key,
iv => v_iv);
RETURN UTL_I18N.RAW_TO_CHAR (v_decrypted_raw, 'AL32UTF8');
END;
SELECT 'pugzly' INPUT,
F_ENCRYPT('pugzly') ENCRYPTED_RESULT, F_DECRYPT(F_ENCRYPT('pugzly')) DECRYPT_RESULT
FROM DUAL;