- 如何加密数字列(也可以将其解密(,以便同一列存储加密的数字以及(未加密的数字(基于保存在其他地方的布尔值(
-
实际上,我做了一个类似这样的函数,它需要一个数字来生成一个加密数字,在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