oracle数据库加密学习总结

阅读: 评论:0

oracle数据加密学习总结
作者: ldd600
安全就好⽐在寒冷的冬天⾥,您穿上好⼏件⾐服或穿最庞⼤的冬天使⽤的夹克御寒。 但是,构建各防御层可能阻⽌不了最坚决的恶意⼊侵者,当然这也不会总能够防御合法⽤户盗窃公司财产。 这⾥的组最后⼀道防线是,通过,⽤户(或者恶意⼊侵者)只有使⽤密码才可以访问到数据。 没有密码的数据是⽆效的。 如果您保护了密码,您就保护了数据。请记住,加密不能替代其它层次的安全性。
对于⽹络,加密是确保全局安全地主要因素:⽽对于,加密则是安全防御中地某⼀层,应该理智地对进⾏加密,否则,在总体安全得不到任何加强的同时,有可能会降低系统的性能、可⽤性以及可访问性。加密和解密需要计算资源,因此,有可能会给数据库增加额外的负载,或者在⼤量的计算压⼒下的响应事件⽆法令⼈满意。同时,由于⽆法使⽤加密状态下的数据这⼀事实,使得数据库⽆法对数据进⾏有效地⽐较,也不能进⾏计算,⽽基本的数据操作也是⽆效的。加密不但向⽤户,⽽且数据库隐藏了数据。利⽤加密,还带来密钥管理的任务。如果不能妥善地管理密钥,则会在两⽅⾯遭遇灾难:第⼀,如果密钥泄漏,则会导致数据泄漏;第⼆:密钥丢失,则会导致数据永远不会再被解密。
到⽬前为⽌,Oracle 提供两种加密⽅式:
a)        加密 API 例如包 和 dbms_crypto (在 Oracle 数据库 10g 第 1 版和更⾼版本中)。 使⽤这些包,我们可以构建我们⾃⼰的基础架构,对数据进⾏加密。 这种⽅法的灵活性最强,但是构建和管理却相当复杂。
防紫外线灯
b)        透明的数据加密是 Oracle 数据库 10g 第 2 版和更⾼版本的⼀个特性;使⽤该特性后,我们就不必⼿动进⾏密码管理了。 数据库管理密码,但是正如名称所指,加密是透明的——数据仅仅以加密的⽅式存储⽽已。 当我们选择了这种⽅式,扩展性⽐较差。
在本次实验中,为了更好地理解数据库的加密机制,我们将采⽤第⼀种⽅法。在Oracle10g中出现了dbms_crypto替代了之前的ext前端框架
dbms_obfuscation_toolkit,DBMS_CRYPTO增加了若⼲新的加密算法、哈希算法。DBMS_CRYPTO还撤销了对于public组的执⾏权限。对于DBMS_CRYPTO中的详细解释将在实验中分步介绍。在本次实验中我们将采⽤David knox提供的Data_Crypto软件包来对数据库进⾏加密、解密,完成本次实验。包中已经对密钥还有数据转换进⾏了处理,已经对DBMS_CRYPTO包做了封装。当然学⽣也可以直接⽤DBMS_CRYPTO来完成上述功能。
加密数据
DBMS_CRYPTO⽀持DES加密、双密钥的3DES以及三密钥的3DES加密,采⽤三个不同⼤⼩的AES和RC4加密算法。发光模组
DBMS_CRYPTO通过数字值如pt_aes,这些参数是包的全局变量,可通过包名.变量,看起来有点像中static
final类变量,c++中的static constant,还有⽤数字表⽰的分组加密模式,如CBC,CFB,ECB和OFB,以及填充模式PKCS5,、Zeros、ORCL或NONE。这些都作为常数变量,传递给加密函数,Oracle默认推荐CBC模式和PKCS5。
DBMS_CRYPTO包提供了⼀个加密函数和两个存储过程都取名为encypt,但参数不同,这就是PL/SQL的函数和过程重载,需要参数类型、参数数量和参数次序不同。函数基于RAW的数据类型,接受RAW数据类型的密钥、数据以及可选的初始向量(IV initialization vector)作为输⼊,并返回RAW数据类型。两道加密存储过程则始给予LOB数据类型,其中之⼀接收BLOB类型参数,⽽另外⼀道过程则接受CLOB类型参数,这两个存储过程都利⽤RAW数据类型的密钥和IV,⽽且它们都是利⽤BLOB数据类型的in out参数。
那我们怎么对字符型数据进⾏加密呢,那⼜为什么不采⽤字符型数据来存放密⽂呢?
对字符型和其他数据类型进⾏加密要⽤UTL_RAW..CAST_TO_RAW进⾏数据类型的转换。实验中采⽤的DATA_CRYPTO中提供的加密和解密函数已经完成了字符转换,不需要再⼿动进⾏转换了。为什么不采⽤字符类型来存放密⽂,是因为不同语⾔版本的Oracle数据库转换后的字符类型不同,当⼀个数据库中的密⽂移动到其他语⾔版本的数据库中将不能解密。所以选择了RAW和BLOB.
下⾯开始实验:
1)        ⾸先我们在ldd600模式下安装DATA_CRYPTO包和创建⼀个员⼯表,它包括两个字段,ename,salary。
SQL> @cry_install.sql
2)        我们将对salary列进⾏加密,因为员⼯的⼯资也属于隐私。
加密之前
进⾏加密:SQL> update people
2        set salary=pt(salary,'sal key');
加密之后,
请问who能看的懂?但是注意我们存放的还是字符型,data_crypto包中的encrypt_char⽤来把字符型加密为RAW型。但是建表的时要指定salary列的类型为raw。这⾥就不试了。
我们看看这些数据如果为raw型是什么样⼦的
1)        查询时我们要对其进⾏解密,才能解读
SQL> select ename,data_crypto.decrypt(salary,'sal key') salary
2    from people;
对照⼀下,和加密之前的数据完全相同。
哈希
哈希就是通过哈希函数的⽅法,使明⽂数据转换成固定长度密⽂数据。哈希到⽬前为⽌还是是计算上不可逆的过程。在Oracle中它的⽤户的密码,也是通过哈希存放的。不过我们不能简单的把数据库⽤户的⽤户名哈希后来和DBA_USERS表中PASSWORD例进⾏⽐较,因为Oracle采⽤的是HMAC。
DBMS_CRYPTO包提供了MD4、MD5和SHA-1哈希算法,其中⼀个函数接受RAW类型的数据,另
外⼀个函数接受CLOB类型的数据,还有⼀个函数接受BLOB类型的数据,所有上述三个函数返回的都是RAW类型的数据。之所以返回的是RAW类型的数据,有⼀个重要的原因是因为哈希的输出是固定⼤⼩的,哈希算法接受任何⼤⼩的输⼊,并返回固定⼤⼩的输出。MD4和MD5返回的输出是128位,⽽SHA返回的输出是160位。DATA_CRYPTO包也封装了这些哈希函数,默认的是SHA。
1)        创建⼀个表euser,包括两列:ename和password,password是⽤户名经initcap函数处理过后的结果,initcap是把字符串的第⼀个字母改成⼤写,⽽其他字符改成⼩写。这个表的安装也会在执⾏cry_install.sql时安装
1)        更改paassword列为其哈希值
SQL> update euser
2                set password = data_crypto.hash (password);
看看哈希后的euser表
SQL> select ename , utl_raw.cast_to_raw (password) password
2    from euser;
1)        这⼀步我们要编写⼀个函数⽤来验证密码是否正确
SQL> @user_auth.sql
2)        通过下⾯的匿名过程显⽰如何进⾏密码认证。
SQL> BEGIN
2    IF (is_user_auth ('scott', 'scott'))
3    THEN
4      DBMS_OUTPUT.put_line ('Scott authenticated with "scott"');
5    ELSE
6      DBMS_OUTPUT.put_line ('Scott could not authenticate with "scott"');
7    END IF;
8
9    IF (is_user_auth ('scott', 'Scott'))
10    THEN
11      DBMS_OUTPUT.put_line ('Scott authenticated with "Scott"');
12    ELSE
13      DBMS_OUTPUT.put_line ('Scott could not authenticate with "Scott"');
14    END IF;规划沙盘
15  END;
塑料制品加工设备16  /
密钥管理
在这个例⼦中,我们将通过数据库来进⾏密钥管理,也就是通过数据库中的表来管理⽤户的密钥。
1)        在数据库中有密钥管理员,他负责管理⽤户的密钥。⾸先要创建密钥中⼼表KM,⽤来存放⽤
户名和密钥对,密钥是以密⽂的形式存放于密钥中⼼中。密钥管理员拥有⼀个主密钥⽤来对密钥中⼼中的密钥加密存储。
KM也是在cry_install.sql执⾏创建的
2)        为了创建密钥要编写能产⽣伪随机字符串的函数,随机密钥的产⽣我们需要利⽤DBMS_OBFUCATION_TOOLKIT包。运⾏ 脚本创建产⽣⼀个随机字符串函数create_key,随机字符串是由⼀个参数作为种⼦产⽣的,函数返回产⽣的随机字符串。
SQL> @get_random.sql;
3)        创建⼀个函数由2步中的随机数产⽣⽤户名和随机密钥对,并存储在km中
SQL>@create_key.sql;
为⽤户ldd600产⽣⼀个32位的密钥并加密后存储在km中密⽂是48位
SQL>exec create_key('ldd600');
4)现在要做的是密钥管理员把密⽂密钥取出,并把它解密。创建⼀个解密并读取密钥的存储过程。该存储过程输⼊参数位⽤户名,输出位该⽤户对应的所有密钥。
锌溴电池
SQL>@de_key.sql
解密并读取32位密钥的明⽂
SQL>exec de_key(‘ldd600’);
3)        接下来所要做的是将这个密钥明⽂发给⽤户ldd600,通知他该密钥。
包装机密代码
在前⾯⼀个例⼦5.5中我们密钥管理员的主密钥是存储在存储过程create_key和de_key中。攻击者只要按如下⽅式就可以看到该密码:
SQL> COL TEXT FORMAT A80
SQL> select text from dba_source where name='CREATE_KEY';
注意这⾥的CREATE_KEY⼀定要⼤写。查询结果如图5.1所⽰
将上⾯⽅法和windows的find,unix的grep命令结合起来使⽤,就很容易搜索的密码了,打开cmd。
C:\Documents and Settings\ldd600>sqlplus ldd600/seclab@secora @pass.sql
C:\Documents and Settings\ldd600>find /i "password" c:\
如上图容易就到了密码的信息
消除此风险的最佳⽅法是使⽤ wrap 实⽤程序。 创建脚本⽂件以创建过程或函数后,请使⽤以下代码包装它:
C:\Documents and Settings\ldd600>wrap  iname=d:\sql\create_key_01.sql  oname=d:\ sql\create_key_01.plb
C:\Documents and Settings\ldd600>sqlplus ldd600/seclab@secora @create_key_01.plb  SQL> col text format a80
SQL> select text
2  from dba_source
3  where name='CREATE_KEY'
4  /
看看我们现在看到了什么
我们仍然可以使⽤exec create_key(‘⽤户名’);来调⽤存储过程:
SQL> exec create_key('scott');
PL/SQL procedure successfully completed

本文发布于:2023-05-19 08:38:08,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/2/105063.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:密钥   加密   数据   函数   数据库   密码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图