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

时间:2014-03-25 17:31:26

标签: oracle encryption plsql

  1. 如何加密号码 Oracle 11中的列(并且还能够将它们解密),以便同一列存储加密的数字和(未加密的数字(基于其他地方保存的布尔值)?
  2. 我实际上做了一个像这样的函数,需要一个数字来生成一个加密的数字,它在Oracle 10中工作正常,但现在它在ORACLE 11中不再起作用了:

    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;
    
  3. 它抛出此错误而没有解释:

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

    谢谢

1 个答案:

答案 0 :(得分:1)

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

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

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