Encryption 在oracle中加密和解密有困难

Encryption 在oracle中加密和解密有困难,encryption,plsql,oracle11g,Encryption,Plsql,Oracle11g,我的要求是对varchar2列进行加密并将该值再次存储在同一列中,然后再次对其进行解密并将实际值存储在同一列中 我使用了dbms\u crypto包,但是它的加密值超过了输入列的长度,所以我尝试了一个压缩函数,但没有得到结果 DECLARE lv_input VARCHAR2(20) := 'shrikant'; lv_output VARCHAR2(200) ; lv_out VARCHAR2(20); lv_raw_again RAW(20) ; BEGIN dbms_o

我的要求是对varchar2列进行加密并将该值再次存储在同一列中,然后再次对其进行解密并将实际值存储在同一列中

我使用了
dbms\u crypto
包,但是它的加密值超过了输入列的长度,所以我尝试了一个压缩函数,但没有得到结果

DECLARE
  lv_input VARCHAR2(20) := 'shrikant';
  lv_output VARCHAR2(200) ;
  lv_out VARCHAR2(20);
  lv_raw_again RAW(20) ;
BEGIN
  dbms_output.put_line(lv_input||'lenth '||length(lv_input));
  lv_output := rawtohex(DBMS_CRYPTO.encrypt(UTL_RAW.CAST_TO_RAW (lv_input), 4353,
      UTL_RAW.CAST_TO_RAW ('zzzzzzzzz')));
  dbms_output.put_line(lv_output||'length  '||LENGTH(lv_output));

  lv_raw_again := hextoraw(lv_output);

  lv_out := utl_raw.cast_to_varchar2(dbms_crypto.Decrypt(src => lv_raw_again,
                typ => 4353,
                key => UTL_RAW.CAST_TO_RAW ('zzzzzzzzz') ));
   dbms_output.put_line(lv_raw_again||'length  '||LENGTH(lv_raw_again));                            
   dbms_output.put_line(lv_out||LENGTH(lv_out));                      
 END;

这里我的输入长度是8,我希望它的加密结果长度也是8,这样我就可以将该值存储在同一个字段中。

非常感谢您对格式化的指导,但我也希望在这个问题上输出正确完成的加密(添加IV)和编码(rawtohex)将始终比原始源代码长。@gust2,有格式保留加密(FPE),或者在8字节值的情况下,有blowfish或3DES块加密。然而,我认为大多数LIB中不存在这种情况,因此选项可能有限。我不知道PLSQLthough@MaartenBodewes确实存在FPE,但他需要自己解决这个问题。这是一个很好的问题,但我想进一步了解用例。您有col tabA.colE,要对其进行模糊/加密。我猜会有一类用户/角色,该列将显示为加密的,而另一组用户/角色将看到该列被解密。你将如何控制这一切?解密组是否可以通过调用PLSQL函数进行解密的视图进行访问?您是否可以使用行级安全视图来隐藏/向特定用户组公开此列,而无需执行此FPE?非常感谢您对格式化的指导,但我也希望您能正确完成加密(添加IV)和编码(rawtohex)输出将始终比原始源代码长。@好的,有格式保留加密(FPE),或者在8字节值的情况下,有blowfish或3DES块加密。然而,我认为大多数LIB中不存在这种情况,因此选项可能有限。我不知道PLSQLthough@MaartenBodewes确实存在FPE,但他需要自己解决这个问题。这是一个很好的问题,但我想进一步了解用例。您有col tabA.colE,要对其进行模糊/加密。我猜会有一类用户/角色,该列将显示为加密的,而另一组用户/角色将看到该列被解密。你将如何控制这一切?解密组是否可以通过调用PLSQL函数进行解密的视图进行访问?您是否可以使用行级安全视图来隐藏/向特定用户组公开此列,而无需执行此FPE?