在 Oracle 中加密(和解密)数字列


  1. 如何加密数字列(也可以将其解密(,以便同一列存储加密的数字以及(未加密的数字(基于保存在其他地方的布尔值(
  2. 实际上,我做了一个类似这样的函数,它需要一个数字来生成一个加密数字,在Oracle10中运行良好,但现在在ORACLE11:中不再运行

    function crypt (key varchar2, n number) return number
      raw_input RAW(128);
      encrypted_raw    RAW(2048);
      raw_key_ RAW(128) := UTL_RAW.CAST_TO_RAW(CONVERT(key,'AL32UTF8','US7ASCII'));
    begin
      raw_input_    := UTL_RAW.cast_from_number (n);
      encrypted_raw := dbms_crypto.Encrypt(src => raw_input_, typ =>DBMS_CRYPTO.DES3_CBC_PKCS5, KEY=>raw_key_);
      return UTL_RAW.cast_to_number(encrypted_raw);
    end;
    

它抛出了这个没有任何解释的错误:

    ORA-06502: PL/SQL: numeric or value error
    ORA-06512: at "SYS.UTL_RAW", line 388
    ...

感谢

看起来您正试图将加密的原始数据强制转换为数字。如果我理解你想要这个函数做什么,那么你似乎想测试输入的数字=返回的数字(你可以成功地加密和解密(。如果你只想加密,你会返回一个原始的,而不是一个数字。

无论如何,您应该将解密后的原始值强制转换为一个数字,以测试输入的数字=返回的数字。类似于:

create or replace function test_crypt(k varchar2, n number) 
return number as
  raw_input_ RAW(128);
  encrypted_raw    RAW(2000);
  decrypted_raw      RAW (2000);
  raw_key_ RAW(128) := UTL_RAW.CAST_TO_RAW(k);
begin
  raw_input_    := UTL_RAW.cast_from_number (n);
  encrypted_raw := dbms_crypto.Encrypt(src => raw_input_, typ =>DBMS_CRYPTO.DES3_CBC_PKCS5, KEY=>raw_key_);
  --return UTL_RAW.cast_to_number(encrypted_raw);
  -- use dbms_crypto to decrypt and return (hopefully same) number
  decrypted_raw := DBMS_CRYPTO.DECRYPT
      (
         src => encrypted_raw,
         typ => DBMS_CRYPTO.DES3_CBC_PKCS5,
         key => raw_key_
      );
   return UTL_RAW.cast_to_number(decrypted_raw); 
end;

无论如何,在我的系统上,输入数字=返回的数字(密钥来自dbms_crypto.randombytes(32((。例如:

select test_crypt('50610FB89D98C7D906CB0A9917413221E4FE6FA62A9604302EE2C8F63E6BAD91', 234.21) from dual;

输出:

234.21

最新更新