转自:http://www.cnblogs.com/xiaoyaoju/archive/2012/04/24/2468377.html
oracle 存储过程加密(baidu.google)
ORACLE数据加密存储过程
作为一个码农,记得刚实习的时候,第一次写存储过程,几千行的存储过程,因为少关闭了一个游标,导致中心数据一块硬盘直接坏掉,当时那个囧啊,虽然现在开始做官方交易,很少写存储过程,但是东西部能丢啊,整理了下硬盘,发现离开公司的时候自己负责的一个项目文档。遂整理下把存储过程贴出来,记录自己码农生涯,也记录一下数据库优化笔记,这便是码农学习笔记啦。
记得该项目是用来传输数据的,政府网和互联网进行传输机密数据,传输过程中需要加密。当初刚出道,大学中学的加密算法不多,都只是知道,所以当初参 考加密与解密,一拍脑壳,用来oracle的已经实现了对称加密算法,客户很满意!为毛线,解释下:对于一个不懂技术的客户来说,你跟他说这个加密算法是 几个人想破脑壳想出来的具有说服力还是说是一个巨型数据库提供商oracle世界领先数据leader封装的加密算法管用。当然是后者了。所以何乐而不为 呢!
本加密存储过程采用Oracle对 称加密算法DES。相信大家已经都不陌生了。简单介绍一下:DES入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据 加密,当模式为解密模式时,key用于对数据解密。简单来说,用公钥加密用私钥解密,相反亦然。废话不说,码农贴代码:
- --创建加密解密包和 key
- create or replace package PG_ENCRYPT_DECRYPT is
- iKey varchar2(8):='key11';
- function GEN_RAW_KEY ( iKey in varchar2)return raw;
- function DECRYPT_3KEY_MODE(iValue in raw,iMode in pls_integer)return varchar2;
- function ENCRYPT_3KEY_MODE(iValue in varchar2,iMode in pls_integer)return raw;
- end;
- --创建加密解密包内容
- create or replace package body PG_ENCRYPT_DECRYPT is
- function GEN_RAW_KEY ( iKey in varchar2)
- return raw
- as
- rawkey raw(240):='';
- begin
- for i in1..length(iKey) loop
- rawkey := rawkey||hextoraw(to_char(ascii(substr(iKey, i,1))));
- end loop;
- return rawkey;
- end;
- /*
- Creating function DECRYPT_3KEY_MODE
- */
- FUNCTION DECRYPT_3KEY_MODE (
- iValue in raw, iMode in pls_integer
- )
- return varchar2
- as
- vDecrypted varchar2(4000);
- rawkey raw(240):='';
- begin
- rawkey := GEN_RAW_KEY(iKey);
- -- decrypt input string
- vDecrypted := dbms_obfuscation_toolkit.des3decrypt (
- UTL_RAW.CAST_TO_VARCHAR2(iValue)
- , key_string => rawkey
- , which => iMode
- );
- return vDecrypted;
- end;
- /*
- Creating function ENCRYPT_3KEY_MODE
- */
- FUNCTION ENCRYPT_3KEY_MODE (
- iValue in varchar2, iMode in pls_integer
- )
- return raw
- as
- vEncrypted varchar2(4000);
- vEncryptedRaw Raw(2048);
- rawkey raw(240):='';
- begin
- rawkey := GEN_RAW_KEY(iKey);
- -- encrypt input string
- vEncrypted := dbms_obfuscation_toolkit.des3encrypt (
- iValue
- , key_string => rawkey
- , which => iMode
- );
- -- convert to raw asout
- vEncryptedRaw := UTL_RAW.CAST_TO_RAW(vEncrypted);
- return vEncryptedRaw;
- end;
- end;
是不是很简单,下面讲使用方法:
以前项目中的做法是直接在查询语句查询出加密过的字段然后形成json格式数据,序列化后传送到接受方,将密文插入他们的服务器,然后在远程调用一下解密的存储过程,插入正式库,so easy!安全吗?我觉得不安全!但是des的破解方式还是穷举法。
- -- id是通过游标fetch的数据列表
- rtrim(PG_ENCRYPT_DECRYPT.DECRYPT_3KEY_MODE(id,1));
存储过程最重要一点就是加密一下,因为行业原因,所有的业务逻辑都是写在存储过程中的,所有基本是正式库上是加密过的存储过程,还有一台丛库是明文的存储过程,便于调试,这些都是让开发人员蛋疼的事情。贴出加密命令
- 加密口令 cmd
- set NLS_LANG=AMERICAN_AMERICA.USACII7
- Wrap iname=source.sql oname=target.sql
至此,介绍完了,随后会给上oracle的存储过程笔记,最后请大家务必关闭游标!做一个不蛋疼的码农,给力的coder!