Oracle数据加密方法分析

来源:本网整理

由于Oracle数据库被广泛应用,其口令加密算法也是备受关注。最早在1993年comp.databases.oracle.server新闻组中有人披露了加密算法的大部分细节。十年后,一本名为《Special Ops Host and Network Security for Microsoft,Unix and Oracle》的书中补全了算法最重要的一个环节—DES算法的KEY。至此,口令加密算法已无秘密可言。接踵而来的是互联网上出现多个了Oracle口令破解工具。Oracle在2007年推出的最新版本11g中,使用了新的更安全的加密算法,但是新算法的细节很快又在互联网上被公开。为提供兼容,11g版本保留了11g以前版本使用的加密口令,利用这一漏洞仍然可以对11g版本的加密口令进行破解。到底怎样才能保证数据库口令的安全呢?本文首先介绍Oracle数据库各版本口令加密算法的内容,然后针对算法重点介绍加强数据库安全性的应对措施。口令加密算法从Oracle7到Oracle 10gR2,使用DES算法对口令进行加密。对算法进行分析,可以得出如下结论:口令不区分大小写,任意大小写组合均可登录;由于只使用固定KEY,只要用户名和口令相同,在任一DB中存放的加密口令都相同;由于采用了用户名和口令串接的方式,所以用户aaa、口令bbbccc的加密值与用户aaabbb、口令ccc完全相同。Oracle 11g版本的加密口令存放在SYS.USER$表中的SPARE4列中,而PASSWORD列中仍保留以前版本加密口令。由于客户端计算加密口令需要用到SALT,在建立连接时,服务器端将SALT明文传送给客户端程序。Oracle 11g中新的口令加密算法中区分大小写;由于加入了随机数SALT,两个不同用户的口令即便完全相同,计算得到的SHA1的散列值也不同;不同DB中相同用户相同口令,SHA1散列值也可能不同。目前,大多数破解工具的工作方式是得到加密口令后,对每一个可能的口令进行加密计算,比较计算结果而确定是否正确。由此,抵御口令破解可以从三个方面着手:防止加密口令外泄;在加密口令落入黑客手中后,口令也是不可破解的,或尽量增加破解的时间;即便是口令被破解,也是无用的,不能存取数据库。防止加密口令泄露1.应用“最少权限”原则,尽量限制可存取加密口令用户的人数在数据库中检查具有存取SYS.USER$或DBA_USERS权限的用户,并从不需要的用户中收回权限。但是操作并不简单,这也是数据库管理工作的特点。每一厂商的软件中都实现了SQL标准之外的扩充,并且每一版本都有差异。限于篇幅,不可能对所有本文中建议的措施进行详细的解释说明,仅以此处检查权限为例展示DBA工作的复杂性。本文中如未说明,则默认版本为11g。应用于11g以前版本时,请读者确认是否需要修改。检查权限主要的工具是数据字典视图(也可以直接存取SYS用户的基表,但基表的定义没有公布,官方不提供技术支持)。视图DBA_TAB_PRIVS存放了数据库中数据对象上的授权信息。假定用户A1和A2可以存取SYS.USER$表,检查在SYS用户USER$上有存取权限的用户,可执行如下语句:SELECT GRANTEE FROM DBA_TAB_PRIVS WHERE TABLE_NAME=‘USER$’;我们已经知道用户A1和A2,都可以存取SYS.USER$表,但为什么在上面查询结果中没有出现呢?这是因为在Oracle的权限管理中,对一个表的存取权限还可以通过系统权限或角色赋予,而DBA_TAB_PRIVS中仅列出了直接的对象权限的授予信息。对于SYS.USER$表而言,系统权限SELECT ANY DICTIONARY和角色DBA都包含了这一表的存取权限。所以完整列出所有可存取这一表的用户应增加下面两条查询语句的结果:SELECT GRANTEE FROM DBA_SYS_PRIVS WHERE PRIVILEGE=‘SELECT ANY DICTIONARY’;SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE=‘DBA’;通过上面的查询语句,还是会遗漏某些用户。如果把DBA角色授权给另一角色Admin,然后又将Admin角色授权给另一用户NEWU,则此用户可存取SYS.USER$表,但在上述三个查询中并没有直接列出NEWU的名字(角色Admin会出现在第三个查询语句的结果中)。显然,Oracle的授权构成了一棵树,完整的信息需要一段PL/SQL程序来完成。(对于11g以前版本,还需要检查对DBA_USERS视图有存取权限的用户和角色。SELECT_CATALOG_ROLE角色如被授权,则可以存取所有数据字典视图,但不能存取SYS的基表。2.设定对加密口令存取的审计如果当前系统中只有SYSDBA可以存取USER$,则一个变通办法是审计SYSDBA的所有操作,其中也包括对USER$的存取。设置初始化参数audit_sys_operations=TRUE,重新启动数据库后激活对SYSDBA操作的审计。审计文件的存放位置为:11g版本中为:$ORACLE_BASE/admin/SID/adump/*.aud11g以前版本为:$ORACLE_HOME/rdbms/audit/*.aud。严格限制和监视SYSDBA用户活动的最好办法是使用Oracle Database Vault组件。3.在操作系统级限制对数据库数据文件的存取SYSDBA用户的加密口令存放在$ORACLE_HOME/dbs下的口令文件orapw〈SID〉中。SYS.USER$表同样需要在数据文件中存放,多数为SYSTEM表空间的第一个数据文件中。此外,EXPORT文件、REDOLOG文件以及TRACE文件中都可能出现加密口令。需要严格限制上述文件的存取权限。4.防止网络窃听在建立连接时,客户端需要向服务器端传送用户名和口令,并且服务器端与客户端需要相互发送这次会话使用的SESSION KEY。Oracle采用Diffie-Hellman KEY交换算法和自己开发的O3LOGON协议完成上述任务。算法的细节同样已在互联网上被公开。建立连接时上述信息如果被截获,同样可以被用来破解口令。更为严重的是,如果黑客事先已经获得加密口令,结合SESSION KEY的信息,则不需要任何破解,执行简单还原运算就可算出口令明文。另外,设计SID时不要使用如ORCL、TEST、PROD等常用名字,设定PORT号为远远大于1521的数,都可以增加黑客SID扫描的难度和时间。5.删除旧版的加密口令存放在Oracle 11g数据库中的以前版本的加密口令是口令破解工具的一个突破口。在没有兼容性限制的系统中,可以考虑从系统中删除旧版口令,从而增加破解难度。具体操作如下:在SQLNET.ORA中增加一行:SQLNET.ALLOWED_LOGON_VERSION=11(Oracle手册中格式介绍有错误,不能加括号:…=(11)),指定最低版本。以SYSDBA登录后,执行以下语句,删除旧版口令。update sys.user$set password=NULL;delete from user_history$;commit;设置修改后,基于OCI的工具如SQLPLUS、10gR1和10gR2版本都可以正常登录,而JDBC type-4 则只有11g版本才允许登录。提高口令强度1.禁止使用缺省口令,禁止与用户名同名的口令,禁止字典词汇的口令Oracle 11g中提供一个视图DBA_USERS_WITH_DEFPWD,可以方便地查出系统中使用缺省口令的所有用户,不足的是还有不少遗漏。读者可以在互联网找到缺省口令的列表,虽然是非官方的,但是比DBA_USERS_WITH_DEFPWD使用的官方的列表更全。破解工具附带的词汇表有的包括了大型英文词典中全部词汇,并支持词汇与“123”之类的常用后缀进行组合。需要注意的是,有的词汇表中已经出现了“zhongguo”这样的字符串,所以汉语拼音组成的口令也是不安全的。检查系统中是否存在弱口令的最常用方法就是使用前述口令破解工具进行攻击。2.规定口令最小字符集和口令最短长度口令字符集最小应包括字母、数字和特殊符号,口令长度最短应不少于8位,对于安全性要求高的系统,最短长度应为12位以上。同样,问题的关键在于DBA指定初始口令以及用户修改口令时保证不违反上述这些规定。每一用户都对应一个Profile,如在Profile中指定口令验证函数,则每当创建或修改口令时,会自动检查是否满足验证程序中所设定的条件,如果不满足,则口令修改失败。对口令明文进行检查,显然要比对加密口令破解效率高。此外,口令创建之时进行检查可以及时封杀弱口令,不给黑客留下破解的窗口。指定口令验证函数的语句为:ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION 口令验证函数名;上例中,为“DEFAULT”Profile指定了验证函数。对用户进行分类后,应当为每一类用户分别创建自己的Profile,而不是全部使用DEFAULT。关闭口令验证函数的语句为:ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;在$ORACLE_HOME/rdbms/admin/下,脚本文件UTLPWDMG.SQL提供了示例的口令验证函数,执行这一脚本,将创建一名为VERIFY_FUNCTION的函数(Oracle 11g中,增加新函数verify_function_11G)。这一函数可以对口令长度是否同时出现了字母数字符号进行检查,检查是否与用户名同名,也检查口令是否是几个最常用的词汇,如welcome、database1、account1等。最后,口令修改时检查新旧口令是否过于相似。读者实际使用时应该根据系统需要对这一函数进行必要的修改和扩充。3.使用易记忆的随机口令限定口令长度后,如果口令没有规律很难记忆,则用户会采用他们自己的方式记住口令,大大增加了遭受社会工程攻击的可能性。DBA需要帮助用户设计一个容易记忆而又不易破解的口令。一个简单易行的方法是找用户非常熟悉的一个句子,如One world One dream,然后将每一个空格替换为数字或符号:One3world2One1dream#。定期更换口令抵御口令破解要从多方面着手数据库中存在多种权限用户,各种授权用户构成一棵树应对口令泄露或被破解的措施是强制定期更换口令,设定口令重复使用限制,规定封锁口令的错误次数上限及封锁时间。即便是加密口令落入黑客手中,在被破解之前或入侵之前,修改了口令,则口令破解变得毫无意义。为了方便记忆,一般用户有重新使用之前过期口令的倾向,如果对重用不加控制,则定期更换口令将失去意义。上述对口令的管理仍然是通过Profile完成:ALTER PROFILE DEFAULT LIMITPASSWORD_LIFE_TIME 30PASSWORD_GRACE_TIME 7PASSWORD_REUSE_TIME 365PASSWORD_REUSE_MAX 0FAILED_LOGIN_ATTEMPTS 10PASSWORD_LOCK_TIME UNLIMITEDPASSWORD_VERIFY_FUNCTION my_verify_function;上面语句制定的口令管理政策为:口令的有效期为30天,随后有7天的宽限期,宽限期后口令“过期”,必须更改口令后才能登录。只有经过365天后才能重新使用以前的口令。在连续10次输入..www.zgxue.com防采集请勿采集本网。

s">

Oracle数据加密方法分析

作者:hbiao68 字体:[增加 减小] 类型:转载 时间:2016-09-13 我要评论 这篇文章主要介绍了Oracle数据加密方法,实例分析了Oracle基于md5算法的数据加密技巧,需要的朋友可以参考下 ">

本文实例讲述了Oracle数据加密方法。分享给大家供大家参考,具体如下:

针对这些问题,一个最有效实用而又低成本的方法就是分析Oracle数据库的日志文件。本文将就Oracle日志分析技术做深入探讨。一、如何分析即LogMiner解释 从目前来看,分析Oracle日志的唯一方法就是使用

使用MD5编码实现数据库用户密码字段的加密

每个 Oracle数据库对应唯一的一个实例名SID,Oracle数据库服务器启动后,一般至少有以下几个用户:Internal,它不是一个真实的用户名,而是具有SYSDBA优先级的Sys用户的别名,它由DBA用户使用来完成数据库

一、前言

正在看的ORACLE教程是:Oracle数据库安全策略分析(三)。数据的安全性策略:数据的生考虑应基于数据的重要性。如果数据不是很重要,那么数据的安全性策略可以稍稍放松一些。然而,如果数据很重要,那么应该

众所周知,MD5是目前应用最多的密码保护方法,该编码传说为不可逆加密编码(也就是说,永运无法倒算原码)。 使用MD5加密用户的操作密码,可以有效防止系统维护人员直接进入数据库时出现系统安全漏洞(直接使用SELECT语句查询,将用户密码字段只能看到乱码,或者"****")

利用日志分析器。你必须设置数据库的初始化参数utl_file_dir=目录名称。重启数据库后,顺序执行4个存储过程,用来分析日志 dbsm_logmnr_d.build-(创建字典文件dbms_logmnr.add_logfile('filename

这里针对密码字段加密,作一实例,希望能给大家系统建设过程带来帮助。

由于ORACLE数据库产品是当前数据库技术的典型代表,她的产品除了数据库系统外,还有应用系统、开发工具等。刚接触Oracle的人员都有这样的感觉:Oracle的产品太多,每个产品内容精深,不知道从

二、技术点

1. DBMS_OBFUSCATION_TOOLKIT.MD5

DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') a from Dual时,却有错误提示,看来该函数只能直接在程序包中调用,不能直接应用于SELECT语句。

2. Utl_Raw.Cast_To_Raw

DBMS_OBFUSCATION_TOOLKIT.MD5返回的字串,是RAW类型,要正确显示,需要经过Utl_Raw.Cast_To_Raw转换

create or replace package test_md5 as function fn_getmd5(p_str in varchar2) return varchar2; function fn_checkuser(p_username in varchar2,p_password in varchar2) return number;end;create or replace package body test_md5 as function fn_getmd5(p_str in varchar2) return varchar2 as begin return DBMS_OBFUSCATION_TOOLKIT.MD5( input_string => Upper(p_str) ); end; function fn_checkuser(p_username in varchar2,p_password in varchar2) return number is l_password varchar(1000); begin select password into l_password from test_user where upper(username)=upper(p_username) and password=Test_MD5.FN_GetMD5(p_password); if l_password is null Then return 0; else return 1; end if; exception when NO_DATA_FOUND then return 3; end;end;

测试:

Delete Test_User;Insert Into Test_User Values('A',Test_MD5.FN_GetMD5('aa'));Insert Into Test_User Values('B',Test_MD5.FN_GetMD5('bb'));select * from test_user;Select Test_MD5.FN_CheckUser('a','aa') From Dual;Select Test_MD5.FN_CheckUser('a','bb') From Dual;select * from Test_User t where t.password=test_md5.fn_getmd5('aa')

更多关于Oracle相关内容感兴趣的读者可查看本站专题:《Oracle常用函数汇总》、《Oracle日期与时间操作技巧总结》及《php+Oracle数据库程序设计技巧总结》

希望本文所述对大家Oracle数据库程序设计有所帮助。

设置加密密钥:Oracle 透明数据加密提供了实施加密所必需的关键管理基础架构。加密的工作原理是将明文数据以及秘密(称作密钥)传递到加密程序中。加密程序使用提供的密钥对明文数据进行加密,然后返回加密数据。以往,创建和维护密钥的任务由应用程序完成。Oracle 透明数据加密通过为整个数据库自动生成一个万能密钥解决了此问题。在启动 Oracle 数据库时,管理员必须使用不同于系统口令或 DBA 口令的口令打开一个 Oracle Wallet 对象。然后,管理员对数据库万能密钥进行初始化。万能密钥是自动生成的。性能:由于索引数据未被加密,因此加密通常会影响现有的应用程序索引。Oracle 透明数据加密对与给定应用程序表关联的索引值进行加密。这意味着应用程序中的相等搜索对性能的影响很小,甚至没有任何影响。例如,假设应用程序 card_id存在一个索引,并且此应用程序执行以下语句:SQL>Select cash from credit_card where card_id='1025023590';Oracle 数据库将使用现有的应用程序索引,尽管 card_id信息已经在数据库中加密。准备用于加密的数据库:在本部分内容中,您将更新 sqlnet.ora、创建一个加密钱夹(ewallet.p12)、打开此钱夹并为 TDE创建万能密钥。执行以下操作:1.您需要更新 sqlnet.ora 文件以包含一个 ENCRYPTED_WALLET_LOCATION 条目。打开一个终端窗口,然后输入以下命令:cd$ORACLE_HOME/network/admingedit sqlnet.ora将以下条目添加到文件末尾:ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=opt/oracle/admin/test97/wallet/)))如果不加这一项的话,则会提示下面错误:SQL>alter system set key identified by"hurray2;alter system set key identified by"hurrayERROR at line 1:ORA-28368:cannot auto-create walletopt/oracle/admin/test97/wallet/目录是用来存放生成的钱夹的。可以为加密钱夹选择任何目录,但路径不应指向在数据库安装过程中创建的标准模糊钱夹(cwallet.sso)。2.接下来,您需要打开钱夹并创建万能加密密钥。从终端窗口中,输入以下命令:connect/as sysdbaalter system set key identified by"welcome1;此命令的作用为:l 如果指定的目录中不存在加密钱夹,则将创建加密钱夹(ewallet.p12)、打开此钱夹并创建/重新创建 TDE 的万能密钥。l 如果指定目录中存在加密钱夹,则将打开此钱夹并创建/重新创建 TDE 的万能密钥。之后,就可以测试数据了。下面是实验记录:alter system set key identified by"welcome1;SQL>conn dodd/dodd123create table test(id number,credit_card_number varchar2(16)ENCRYPT NO SALT);SQL>insert into test values(1,'1231243242');1 row created.SQL>insert into test values(2,'33245235');SQL>commit;Commit complete.SQL>select*from test;ID CREDIT_CARD_NUMB1 12312432422 33245235可见,数据查看是明文,因为这个时候,加密钱夹已经打开,数据可以解密。这时,停止数据库,再打开:SQL>shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL>SQL>startupORACLE instance started.Total System Global Area 524288000 bytesFixed Size 1979968 bytesVariable Size 138414528 bytesDatabase Buffers 377487360 bytesRedo Buffers 6406144 bytesDatabase mounted.Database opened.SQL>select*from dodd.test;select*from dodd.testERROR at line 1:ORA-28365:wallet is not openSQL>select id from dodd.test;ID12可以看到,因为数据库重启后,加密钱夹处于关闭状态,这时只要查询到加密的列,会提示加密钱夹没有打开。如果用户想打开钱夹,必须具有alter system权限。下面打开wallet:SQL>conn/as sysdbaConnected.SQL>alter system set wallet open identified by"welcome1;System altered.SQL>conn dodd/dodd123Connected.SQL>select*from test;ID CREDIT_CARD_NUMB1 12312432422 33245235可以看到,加密钱夹打开后,数据可以被解密。还有一条:sys用户的表不能被加密。可见:Oracle TDE是在数据层面上对表里的数据加密,而且不会影响数据库现有的权限控制策略。salt实际上就是在加密过程中引入一个随机性。简单的说,就是一般来说,同样的明文产生同样的密文,这样就导致容易被解密者通过分析词频之类的方式(加解密我不太懂)来通过密文破解明文,如果指定salt,那么即使同样的明文加密后的密文也是不一样的。no salt的话,自然就是相同的明文会产生相同的密文了。对于索引来说,要求no salt也就可以理解了丢失ewallet加密钱夹的话,是不能再解密数据的。Oracle 10gR2的 TDE 特性,对于防止机密信息的泄漏能起到事半功倍的作用!内容来自www.zgxue.com请勿采集。

免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
Copyright © 2017 www.zgxue.com All Rights Reserved