如何在不使用dbms_crypto的情况下加密和解密oracle中的列数据

问题描述 投票:0回答:1

你好,我需要知道一种在 Oracle 中不使用 dbms_crypto 包来加密和解密数据的方法,因为我需要授予对此包的执行权限,但我无法获得此权限,所以如果有任何内置函数可以执行此操作,我尝试加密和解密但它只在sql server中工作我也尝试过standard_hash(col,'MD5')但它只是加密没有解密

sql oracle encryption
1个回答
0
投票

也许是这样的:



/* 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;

© www.soinside.com 2019 - 2024. All rights reserved.