无需DBMS_CRYPTO包的Oracle列数据加解密方法咨询
在Oracle中无需DBMS_CRYPTO的列数据加解密方案
基于UTL_ENCODE和UTL_RAW的简单可逆加密
Oracle没有直接替代DBMS_CRYPTO的内置可逆加解密函数,但可以通过UTL_ENCODE和UTL_RAW组合实现基础的可逆加密(比如异或+Base64编码),无需特殊权限,示例如下:加密自定义函数:
CREATE OR REPLACE FUNCTION simple_encrypt(p_data IN VARCHAR2, p_key IN VARCHAR2) RETURN VARCHAR2 IS v_raw_data RAW(2000); v_raw_key RAW(2000); v_encrypted_raw RAW(2000); BEGIN v_raw_data := UTL_RAW.CAST_TO_RAW(p_data); v_raw_key := UTL_RAW.CAST_TO_RAW(p_key); -- 重复密钥匹配数据长度后异或加密 v_encrypted_raw := UTL_RAW.XOR( v_raw_data, UTL_RAW.SUBSTR(UTL_RAW.REPEAT(v_raw_key, CEIL(UTL_RAW.LENGTH(v_raw_data)/UTL_RAW.LENGTH(v_raw_key))), 1, UTL_RAW.LENGTH(v_raw_data)) ); -- Base64编码便于存储 RETURN UTL_ENCODE.BASE64_ENCODE(v_encrypted_raw); END; /解密自定义函数:
CREATE OR REPLACE FUNCTION simple_decrypt(p_encrypted IN VARCHAR2, p_key IN VARCHAR2) RETURN VARCHAR2 IS v_encrypted_raw RAW(2000); v_raw_key RAW(2000); v_decrypted_raw RAW(2000); BEGIN v_encrypted_raw := UTL_ENCODE.BASE64_DECODE(p_encrypted); v_raw_key := UTL_RAW.CAST_TO_RAW(p_key); -- 异或解密还原数据 v_decrypted_raw := UTL_RAW.XOR( v_encrypted_raw, UTL_RAW.SUBSTR(UTL_RAW.REPEAT(v_raw_key, CEIL(UTL_RAW.LENGTH(v_encrypted_raw)/UTL_RAW.LENGTH(v_raw_key))), 1, UTL_RAW.LENGTH(v_encrypted_raw)) ); RETURN UTL_RAW.CAST_TO_VARCHAR2(v_decrypted_raw); END; /注意:该方案加密强度较低,仅适用于非敏感数据的简单保护,不适合高安全要求场景。
哈希函数的局限性
你使用的standard_hash(col,'MD5')属于单向哈希算法,本身不可逆,仅用于数据校验或密码存储(需加盐),无法满足解密需求,因此不适用你的场景。SQL Server函数的兼容性问题
SQL Server的ENCRYPTBY*和DECRYPTBY*系列函数是其专属内置函数,Oracle无对应替代,无法跨数据库使用。
内容的提问来源于stack exchange,提问作者Bahy Mohamed
相关产品推荐
相关产品推荐

