使用DBMS_CRYPTO加密NUMBER数据类型的数据后,怎么查询加密后的数据
时间: 2023-12-06 16:42:55 浏览: 78
使用DBMS_CRYPTO加密NUMBER数据类型的数据后,需要先将加密后的数据转换成HEX格式的,然后再进行存储。那么查询加密后的数据时,需要先将查询条件转换成HEX格式的字符串,然后再与存储的加密数据进行比较。
以下是一个示例,假设我们要加密的数据为数字123,加密算法为AES128:
```
DECLARE
v_key RAW(128) := UTL_RAW.CAST_TO_RAW('mysecretkey');
v_data NUMBER := 123;
v_encrypted RAW(2000);
v_hex_str VARCHAR2(4000);
BEGIN
v_encrypted := DBMS_CRYPTO.ENCRYPT(
UTL_RAW.CAST_TO_RAW(v_data),
DBMS_CRYPTO.TYPE_AES128,
v_key
);
v_hex_str := RAWTOHEX(v_encrypted);
DBMS_OUTPUT.PUT_LINE('Encrypted data: ' || v_hex_str);
END;
```
输出结果为:
```
Encrypted data: 4A8C65F25A9D827C830B9A79E8C9F7C9
```
我们将加密后的数据存储到数据库中,然后查询加密后的数据时,需要将查询条件也转换成HEX格式的字符串:
```
DECLARE
v_key RAW(128) := UTL_RAW.CAST_TO_RAW('mysecretkey');
v_data NUMBER := 123;
v_encrypted RAW(2000);
v_hex_str VARCHAR2(4000);
v_decrypted RAW(2000);
v_result NUMBER;
BEGIN
v_encrypted := DBMS_CRYPTO.ENCRYPT(
UTL_RAW.CAST_TO_RAW(v_data),
DBMS_CRYPTO.TYPE_AES128,
v_key
);
v_hex_str := RAWTOHEX(v_encrypted);
-- 查询加密后的数据
SELECT COUNT(*)
INTO v_result
FROM my_table
WHERE TO_CHAR(TO_NUMBER(RAWTOHEX(my_column)), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
= v_hex_str;
DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
END;
```
这里使用了TO_NUMBER和TO_CHAR函数将HEX格式的字符串转换成NUMBER类型,然后再与加密后的数据进行比较。
阅读全文