oracle dbms_crypto,Oracle的dbms_obfuscation_toolkit加密解密数据

oracle从8i开始提供一个数据加密包:dbms_obfuscation_toolkit.利用这个包,我们可以对数据进行DES,Triple DES或者MD5加密. 本文就此讲解如何使用以及使用过程需要注意的问题.1. dbms_obfuscation_toolkit简介dbms_obfuscation_toolkit主要有一下几个存储过程:-DESGETKEY   -- 产生密钥,用于DES算法DES3GETKEY  -- 产生密钥,用于Triple DES算法DESENCRYPT  -- 用DES算法加密数据DESDECRYPT  -- 用DES算法解密数据DES3ENCRYPT -- 用Triple DES算法加密数据DES3DECRYPT -- 用DES算法解密数据MD5         -- 用MD5算法加密数据2. 准备数据表在开始前,我们先创建表users:drop table users;

create table users(

userid varchar2(50) primary key,

password varchar2(64),  --密码原文

encrypted varchar2(64)  --加密后的密码

);insert into users values ('user1','user1234',null);

insert into users values ('user2','abcd1234',null);

insert into users values ('user3','oracle12',null);

commit;3. 创建包PG_ENCRYPT_DECRYPTcreate  or replace package PG_ENCRYPT_DECRYPT is

iKey varchar2(8):='oracle9i';

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 in 1..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 as out

vEncryptedRaw := UTL_RAW.CAST_TO_RAW(vEncrypted);

return vEncryptedRaw;

end;

end;4. 测试在SQL Plus下输入:SQL > update users set encrypted = PG_ENCRYPT_DECRYPT.ENCRYPT_3KEY_MODE(password,1);

SQL > commit;执行完以上SQL语句后,encrypted 存储的就是加密后的password字段.我们看一下结果:-SQL > select * from users;

USERID PASSWORD  ENCRYPTED

------ --------- ----------------

user1  user1234  69EF3A211A0F2C32

user2  abcd1234  CF7562203F6CEDE5

user3  oracle12  65D71D7148FA001D这个加密结果是否正确? 我们对加密结果解密就知道了,在SQL Plus下输入:SQL > select userid,password,PG_ENCRYPT_DECRYPT.DECRYPT_3KEY_MODE(encrypted,1) DECRYPTED from users;

USERID PASSWORD  DECRYPTED

------ --------- ----------

user1  user1234  user1234

user2  abcd1234  abcd1234

user3  oracle12  oracle12大家可以看到,解密结果和密码原文完全一模一样.这说明我们的加密解密过程是正确的.5. 进一步思考我们再看一下表users:-create table users(

userid varchar2(50) primary key,

password varchar2(64),  --密码原文

encrypted varchar2(64)  --加密后的密码

);还有我们插入的数据:-insert into users values ('user1','user1234',null);

insert into users values ('user2','abcd1234',null);

insert into users values ('user3','oracle12',null);以及加密输出结果:-[/code]USERID PASSWORD  ENCRYPTED------ --------- ----------------user1  user1234  69EF3A211A0F2C32user2  abcd1234  CF7562203F6CEDE5user3  oracle12  65D71D7148FA001D[/code]不知细心的朋友注意到没有? 在表中,password 和 encrypted 的长度都是64,都是8的倍数, 再看一下我们的密码原文和加密后的密码也是8的倍数,这不是巧合,而是DES算法和Triple DES算法的特征之一. 输入长度必须是8的倍数,而输出也是8的倍数,所以我们的字段长度也是8的倍数. 如果输入不是8的倍数会怎样? 大家可以把密码原文修改一下试试.6. 密钥的保存不管我们用什么样的加密算法,有一点非常重要的是:  密钥的保存.密钥就是一把钥匙,因为加密算法是公开的,所以你无论如何加密,只要我知道你的密钥,我就可以解密,那么你的加密就没有效果.在本文中, 我们的密钥是这样定义的:-iKey varchar2(8):='oracle9i';oracle9i就是我们的密钥.所以,如果只是简单地把以上程序在oracle上运行一下就使用,那么任何有权限登陆的人看到这个程序,就可以知道密钥. 所以简单的做法是利用Oracle提供的WRAP把整个程序加密,用加密后的文本创建程序. 这样别人就看不到你的源代码了.把程序保存为source.sql,在Dos命令下输入:-Wrap iname=source.sql oname=target.sql

就可以了,然后SQL Plus运行target.sql.

当然了, 这里讲的密钥保存还是很简单的. 并不是百分百保险. 大家可以自己

想想如何更安全地保持你的密钥.

oracle 10g 加密包改为:DBMS_CRYPTOGeneral Information

Source{ORACLE_HOME}/rdbms/admin/dbmsobtk.sql

Algorithm ConstantsNameData TypeValue

Hash Functions

HASH_MD4 (128 bit hash)PLS_INTEGER1

HASH_MD5 (128 bit hash)PLS_INTEGER2

HASH_SH1 (160 bit hash)PLS_INTEGER3

MAC Functions

HMAC_MD5 (128 bit hash)PLS_INTEGER1

HMAC_SH1 (160 bit hash)PLS_INTEGER2

Block Cipher Algorithms

ENCRYPT_DES (56 bit)PLS_INTEGER1; -- 0x0001

ENCRYPT_3DES_2KEY (128 bit)PLS_INTEGER2; -- 0x0002

ENCRYPT_3DESPLS_INTEGER3; -- 0x0003

ENCRYPT_AES128 (128 bit)PLS_INTEGER6; -- 0x0006

ENCRYPT_AES192 (192 bit)PLS_INTEGER7; -- 0x0007

ENCRYPT_AES256 (256 bit)PLS_INTEGER8; -- 0x0008

ENCRYPT_RC4 (Stream Cipher)PLS_INTEGER129; -- 0x0081

Block Cipher Chaining Modifiers

CHAIN_CBC (Cipher Block Chaining)PLS_INTEGER256; -- 0x0100

CHAIN_CFB (Cipher Feedback)PLS_INTEGER512; -- 0x0200

CHAIN_ECB (Electronic cookbook)PLS_INTEGER768; -- 0x0300

CHAIN_OFB (Output Feedback)PLS_INTEGER1024; -- 0x0400

Block Cipher Padding Modifiers

PAD_PKCS5 (Complies with PKCS #5)PLS_INTEGER4096; -- 0x1000

PAD_NONE (No Dadding)PLS_INTEGER8192; -- 0x2000

PAD_ZERO (Pad with Zeros)PLS_INTEGER12288; -- 0x3000

Block Ciphers Suites

DES_CBC_PKCS5PLS_INTEGERENCRYPT_DES

+ CHAIN_CBC

+ PAD_PKCS5;

DES3_CBC_PKCS5PLS_INTEGERENCRYPT_3DES

+ CHAIN_CBC

+ PAD_PKCS5;

DependenciesDBMS_CRYPTO_FFIDECRYPTBYTESENCRYPTBYTES

DECRYPTENCRYPTUTL_RAW

ExceptionsError CodeReason

28827The specified cipher suite is not defined

28829No value has been specified for the cipher suite to be used

28233Source data was previously encrypted

28234DES: Specified key size too short. DES keys must be at least 8 bytes (64 bits).

AES: Specified key size is not supported. AES keys must be 128, 192, or 256 bits

28239The encryption key has not been specified or contains a NULL value

DECRYPT

Decrypt crypt text data using stream or block cipher with user supplied key and optional iv

Overload 1dbms_crypto.decrypt(src IN RAW, typ IN PLS_INTEGER, key IN RAW,

iv  IN RAW DEFAULT NULL) RETURN RAW;

See Encrypt Overload 1 demo

Overload 2dbms_crypto.decrypt(dst IN OUT NOCOPY BLOB, src IN BLOB,

typ IN PLS_INTEGER, key IN RAW, iv  IN RAW DEFAULT NULL);

Overload 3dbms_crypto.decrypt (dst IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,

src IN BLOB, typ IN PLS_INTEGER, key IN RAW,

iv  IN RAW DEFAULT NULL);

ENCRYPT

Encrypt plain text data using stream or block cipher with user supplied key and optional iv

Overload 1dbms_crypto.encrypt(src IN RAW, typ IN PLS_INTEGER, key IN RAW,

iv IN RAW DEFAULT NULL) RETURN RAW;

set serveroutput on

DECLARE

l_credit_card_no VARCHAR2(19) := '1234-5678-9012-3456';

l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_credit_card_no);

l_key     RAW(128) := utl_raw.cast_to_raw('abcdefgh');

l_encrypted_raw RAW(2048);

l_decrypted_raw RAW(2048);

BEGIN

dbms_output.put_line('Original : ' || l_credit_card_no);

l_encrypted_raw := dbms_crypto.encrypt(l_ccn_raw,

dbms_crypto.des_cbc_pkcs5, l_key);

dbms_output.put_line('Encrypted : ' ||

RAWTOHEX(utl_raw.cast_to_raw(l_encrypted_raw)));

l_decrypted_raw := dbms_crypto.decrypt(src => l_encrypted_raw,

typ => dbms_crypto.des_cbc_pkcs5, key => l_key);

dbms_output.put_line('Decrypted : ' ||

utl_raw.cast_to_varchar2(l_decrypted_raw));

END;

/

set serveroutput on

DECLARE

enc_val   RAW(2000);

l_key     RAW(2000);

l_key_len NUMBER := 128/8; -- convert bits to bytes

l_mod     NUMBER := dbms_crypto.ENCRYPT_AES128

+ dbms_crypto.CHAIN_CBC+ dbms_crypto.PAD_PKCS5;

BEGIN

l_key := dbms_crypto.randombytes(l_key_len);

enc_val := dbms_crypto.encrypt(

utl_i18n.string_to_raw('1234-5678-9012-3456', 'AL32UTF8'),

l_mod, l_key);

dbms_output.put_line(enc_val);

END;

/

Overload 2dbms_crypto.encrypt(dst IN OUT NOCOPY BLOB, src IN BLOB,

typ IN PLS_INTEGER, key IN RAW, iv  IN RAW DEFAULT NULL);

Overload 3dbms_crypto.encrypt(dst IN OUT NOCOPY BLOB,

src IN CLOB CHARACTER SET ANY_CS, typ IN PLS_INTEGER, key IN RAW, iv  IN RAW DEFAULT NULL);

dbms_crypto.encrypt(UTL_RAW.CAST_TO_RAW(CONVERT('XXX','AL32UTF8')),typ,key);

HASH

Hash source data by cryptographic hash type

Overload 1dbms_crypto.hash(src IN RAW, typ IN PLS_INTEGER) RETURN RAW;

Overload 2dbms_crypto.hash(src IN BLOB, typ IN PLS_INTEGER) RETURN RAW;

Overload 3dbms_crypto.hash(src IN CLOB CHARACTER SET ANY_CS,

typ IN PLS_INTEGER) RETURN RAW;

MAC

Message Authentication Code algorithms provide keyed message protection

Overload 1dbms_crypto.mac(src IN RAW, typ IN PLS_INTEGER, key IN RAW)

RETURN RAW;

Overload 2dbms_crypto.mac(src IN BLOB, typ IN PLS_INTEGER, key IN RAW)

RETURN RAW;

Overload 3dbms_crypto.mac(src IN CLOB CHARACTER SET ANY_CS,

typ IN PLS_INTEGER, key IN RAW) RETURN RAW;

RANDOMBYTES

Returns a raw value containing a pseudo-random sequence of bytesdbms_crypto.randomnytes(number_bytes PLS_INTEGER) RETURN RAW;

SELECT dbms_crypto.randombytes(1) FROM dual;

SELECT LENGTH(dbms_crypto.randombytes(1)) FROM dual;

SELECT dbms_crypto.randombytes(28) FROM dual;

SELECT LENGTH(dbms_crypto.randombytes(28)) FROM dual;

SELECT dbms_crypto.randombytes(64) FROM dual;

SELECT LENGTH(dbms_crypto.randombytes(64)) FROM dual;

RANDOMINTEGER

Returns a random BINARY_INTEGERdbms_crypto.randominteger RETURN NUMBER;

SELECT dbms_crypto.randominteger FROM dual;

RANDOMNUMBER

Returns a random Oracle Numberdbms_crypto.randomnumber RETURN NUMBER;

SELECT dbms_crypto.randomnumber FROM dual;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑苹果系统坏了如何恢复_黑苹果macOS系统U盘版/恢复版基础安装教程

写在前面本文最后更新:2020年7月17日本文是一篇黑苹果安装基础教程,内容比较入门。安装黑苹果,相信谁都不敢说自己能100%解决所有问题。如果本文未能解决你的问题,请见谅。本文主要介绍两种安装方式:U盘安装&#xff0…

为什么安监控需要公网ip_媲美专线的视频监控组网,无须公网ip

众所周知,视频监控是安防系统的重要组成部分,各行各业必备,比如:超市、学校、公司、厂区等等随着社会的发展,利用网络传输搭建视频监控系统,已经成为了各行各业的普遍需求今天给大家带来,媲美专…

php中的file_upload,PHP文件上传(PHP file upload)

PHP文件上传(PHP file upload)我正在尝试使用php将文件上传到我的服务器,将它们保存到我的mysql数据库中,但我无法让它工作,这是我正在使用的脚本,我相信它与“$ _FILES有关“因为当我把它拿出来时”&& $ _FILES [userfil…

java 调用jira_java调用jira接口

http://www.cnblogs.com/starcrm/p/4837971.html首先通过jira的wsdl(http://localhost:8080/rpc/soap/jirasoapservice-v2?wsdl)生成要引入的类然后写客户端:package jiraTEST;import java.net.URI;import java.net.URISyntaxException;import java.util.ArrayList…

百度seo排名点击器app_百度SEO优化和百度竞价优缺点 - 百度整站排名

原出处:超级排名系统原文链接:百度SEO优化和百度竞价优缺点 - 超级排名系统SEO优化的优势:1、低价:在百度优化排名中,维持一年排名的成本可能只有一到两个月的竞价成本,这比竞价便宜得多,超级排…

html网页放大时文字不换行_WEB前端-html基础

一、介绍1、HTML概念HTML(Hypertext Mark-up Language)即超文本标记语言2.HTML特点HTML不需要编译,直接由浏览器执行HTML文件是一个文本文件HTML文件必须使用html或htm为文件名后缀HTML大小写不敏感,HTML与html一样3.HTML基础语法…

linux目录隐藏技术,Linux环境下的高级隐藏技术

摘要:本文深入分析了Linux环境下文件、进程及模块的高级隐藏技术,其中包括:Linux可卸载模块编程技术、修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐藏特定进程的技术。隐藏技术在计算机系统安全中应用十分广泛…

python代替shell脚本_python的简洁是shell无法代替的

之前线上服务器分发配置都是用shell和expect脚本分发,脚本写了很长,上周换了ansible,现在自己用python写一个,就30行代码就可以实现需求,之前的shell写了快200行了,蛋疼,代码如下: f…

linux命令cp命令行参数,linux命令之cp命令参数及用法详解

cp (复制档案或目录)[rootlinux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[rootlinux ~]# cp [options] source1 source2 source3 …. directory参数:-a :相当于 -pdr 的意思;-d :若来源文件为连结文件的属性(link…

python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...

一、UPD Socket 编程 socket 对象中与UDP Socket 服务器编程有关的方法是bind() ,注意不需要listen() 和accept() , 这是因为UDP 通信不需要像TCP 一样监听端口,建立连接。 socket.recvfrom(buffsize) : 接收UDP Socket 数据&…

alert获取输入框内容_获取由 AlertDialog 生成的对话框中EditText的文本内容

在Android开发中,AlertDialog常用于处理用户的登录等。那么如何获取由 AlertDialog 生成的对话框中EditText的文本内容呢?其实Alertdialog弹出的Activity 可以认为是默认的Activity的子Activity。不能直接使用findViewById()来获取。强行使用会提示一个空…

linux中将 home目录备份成,6种优化Linux系统备份的应用与技巧

【51CTO.com快译】当转为使用Linux时,你可能会注意到你所使用的版本会带有一个默认的备份工具。然而,可能该工具并没有被设置好去备份你系统中所有重要的部分。而且,使用该默认工具也可能导致它以比预期更低的效率去产生一些更大的备份数据。…

db2嵌套查询效率_db2性能优化

性能优化概述DB2 的性能优化可以从三个方面分析:内存,CPU 和 I/O 。DB2 性能优化是一件较为复杂的综合性的工作 , 需要对问题的根源作全方位的探索和思考。同时也需要较深厚的数据库管理经验与优化知识。这对于初学者来说可能有些勉为其难。但是在很多情…

python数据分析函数大全_Python常用数据分析函数集合

1.Map函数 - 列表解析 ①.map()函数解析 (1).python源码信息C:\Users\ArSang>python Python3.6.3rc1 (v3.6.3rc1:d8c174a, Sep 19 2017, 16:39:51) [MSC v.1900 64bit (AMD64)] on win32 Type"help", "copyright", "credits" or "licens…

我的世界linux开服权限不足,我的世界路由器开服怎么获得超级管理员权限

我的世界路由器开服怎么获得超级管理员权限。小伙伴们使用路由器开服的时候会发现一个明显的问题,部分路由器并没有给你最高管理员的权限,导致大家开服的时候出现各种问题。那么路由器开服怎么才能快速获得超级管理员的权限呢?说明:为什么路…

python无法调用安装的包_如何使用python命令和安装包进行安装Django框架

在python语言的框架中,Django框架是一种Web应用框架,这个框架的版本需要跟python的版本搭配上。其中,Django框架可以使用命令安装,也可以使用下载压缩包进行安装。下面利用实例说明Django框架安装方法和过程,操作如下&…

vs传值接收页面怎么直接打开_VS2003传值

估计楼主应该是用了ORM,只知道定义泛型类,然后ORM自己就完成映射,具体怎么得到的数据,就不知道了.所以,请退回到旧时代,用DataTable传递数据.cmdText:这个是SQL查询语句;connStr:这个是数据库连接字符串.public static DataTable(string cmdText,string connStr){SqlConnection…

linux摄像头内核驱动开发,怎么在Linux下开发摄像头驱动

无根之木不活,无基之楼不立,无论是学习哪个领域知识,基础是重中之重。针对学习linux驱动,我们来仔细谈谈:个人认为C语言和数据结构就是重中之重!Linux系统最优秀的地方就在于内核。无论是进程调度&#xff…

idea卡顿的解决方法_lt;绝地求生/PUBG/解决卡顿方法(停机9小时)维护gt;9月16日(星期三) 08点30分amp;崩溃...

【正式服不停机维护公告】我们将在北京时间10月7日(星期三) 10点开始正式服的不停机维护。- 维护开始时间:10月7日(星期三) 10点 - 维护内容:优化服务器以及BUG修复1. 修复了在四排模式下队伍列表中无法显示队员的问题;2. 修复了警示胶带背包…

安装应用需要打开未知来源权限_打开安卓这个开关 不让流氓软件肆意妄为

1月21消息,国外媒体Cybernews曝光了数款存在安全隐患的安卓应用,从这些应用中我们发现大都是相机类应用。根据Cybernews的说法这些应用会寻求多项权限,而多数权限和应用本身功能并不相关。其实在国内这类软件也并不缺乏,他们通常会…