oracle口令怎么加密 oracle修改用户密码口令

如何应对被公开的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/ *.aud

11g以前版本为: $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 LIMIT

PASSWORD_LIFE_TIME 30

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME 365

PASSWORD_REUSE_MAX 0

FAILED_LOGIN_ATTEMPTS 10

PASSWORD_LOCK_TIME UNLIMITED

PASSWORD_VERIFY_FUNCTION my_verify_function;

上面语句制定的口令管理政策为:口令的有效期为30天,随后有7天的宽限期,宽限期后口令“过期”,必须更改口令后才能登录。只有经过365天后才能重新使用以前的口令。在连续10次输入口令错误后,账号被封锁,设定不自动解锁,必须由DBA手动解除封锁。口令验证函数为my_verify_function。

Oracle 11g以前版本,缺省设置中没有设定口令的有效期,而在Oracle 11g中缺省设置有效期为180天。程序中直接写入口令的应用在升级到11g时一定要注意有效期问题,避免半年后应用突然无法自动运行。另外,口令的有效期对SYS用户不起作用,DBA一定要主动定期更换口令。

另外一个措施是对登录数据库服务器的主机进行限定,如指定网段或指定IP地址。进一步限定客户端允许执行的程序,如对非本地登录禁止使用SQLPLUS,只允许执行某特定应用。

认真实施本文中给出的措施后,可以很有效地防止口令被破解。然而我们的目的是提高数据库系统的安全性,而不仅仅是保证口令不被破解。数据库系统安全的任何一个环节出现问题,都会导致前功尽弃。黑客的目的是入侵系统盗窃数据,是不会按常理出牌的,会尝试各种手段方式,如社会工程、安全漏洞、物理入侵等等,而不会执着地在口令破解上与我们较劲。这一点需要我们经常提醒自己,从而切实保证数据库系统安全。

TechTarget中国原创内容

求一份Oracle和Java使用同一种加密方式

1:自己在oracle创建md5加密的function,代码可以参考下面:

create or replace function MD5 (vin_string IN VARCHAR2)

RETURN VARCHAR2 IS

BEGIN

RETURN UPPER(Dbms_Obfuscation_Toolkit.Md5 ( input = utl_raw.cast_to_raw(vin_string) ));

END MD5

2:密码均是以md5存储的密文存在数据库,匹配的时候也是密文比较一致性。无需解密,若解密,反而用户不满意了。

oracle数据库的存储过程如何加密 具体的实现方法是什么

可以例用Oracle

自带的Wrap工具实现,此工具在$ORACLE_HOME/BIN目录下,具体如下

1、设置字符集环境变量

set

NLS_LANG=CHINESE_CHINA.ZHS16GBK

2、创建一个存储过程文件

在E:\下创建test.sql文件,内容如下:

create

or

replace

procedure

test1(i

in

number)

as

begin

dbms_output.put_line('

输入参数是'||to_char(i));

end;

3、加密

c:\

cd

%ORACLE_HOME%\BIN

c:\wrap

iname=e:\test1.sql

PL/SQL

Wrapper:

Release

8.1.7.0.0

-

Production

on

Tue

Nov

27

22:26:48

2001

Copyright

(c)

Oracle

Corporation

1993,

2000.All

Rights

Reserved.

Processing

test1.sql

to

test1.plb

4、运行test1.plb

sqlplus

/nolog

SQLconn

TEST/TEST@db01

SQL

@e:\a.plb

过程已创建。

5、运行存储过程

SQL

set

serveroutput

on

SQL

execute

test1(1);

输入参数是1

PL/SQL

过程已成功完成。

6、查看存储过程的代码

SQL

select

name,text

from

all_source

where

type='PROCEDURE'

and

name='TEST1';

结果:看不到其原码

如何利用Oracle自带的MD5对数据进行加密

1、DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数

CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2)

RETURN VARCHAR2

IS

retval varchar2(32);

BEGIN

retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING = passwd)) ;

RETURN retval;

END;

select md5('123456') from dual;

MD5('123456')

e10adc3949ba59abbe56e057f20f883e

2、DES加密

create or replace function

encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is

v_text varchar2(4000);

v_enc varchar2(4000);

raw_input RAW(128) ;

key_input RAW(128) ;

decrypted_raw RAW(2048);

begin

v_text := rpad( p_text, (trunc(length(p_text)/8)+1)*8, chr(0));

raw_input := UTL_RAW.CAST_TO_RAW(v_text);

key_input := UTL_RAW.CAST_TO_RAW(p_key);

dbms_obfuscation_toolkit.DESEncrypt(input = raw_input,key = key_input,encrypted_data =decrypted_raw);

v_enc := rawtohex(decrypted_raw);

dbms_output.put_line(v_enc);

return v_enc;

end;

DES加密:

update tb_salarysign_staff s set s.staffpwd =encrypt_des(s.staffpwd, 'test#5124*!de');

3、DES解密函数

create or replace function decrypt_des(p_text varchar2,p_key varchar2) return varchar2 is

v_text varchar2(2000);

begin

dbms_obfuscation_toolkit.DESDECRYPT(input_string = UTL_RAW.CAST_TO_varchar2(p_text),key_string =p_key, decrypted_string= v_text);

v_text := rtrim(v_text,chr(0));

dbms_output.put_line(v_text);

return v_text;

end;

DES解密:select decrypt_des(s.staffpwd, 'test#5124*!de') from tb_salarysign_staff s;

关于oracle数据库加密的函数

Oracle 提供两种加密方式:

a)加密 API 例如包 和 dbms_crypto 使用这些包,可以构建我们自己的基础架构,对数据进行加密。 这种方法的灵活性最强,但是构建和管理却相当复杂。

b)透明的数据加密是 Oracle 数据库 ;使用该特性后,就不必手动进行密码管理了。

数据库管理密码,但是正如名称所指,加密是透明的——数据仅仅以加密的方式存储而已。在Oracle10g中出现了dbms_crypto替代了之前的dbms_obfuscation_toolkit,DBMS_CRYPTO增加了若干新的加密算法、哈希算法。

DBMS_CRYPTO还撤销了对于public组的执行权限。

oracle安装时候怎么样自己设置密码,然后还有什么超级用户那些怎么设置,连接我就想平常那orac

安装时候在这个位置设置系统用户口令,系统用户的用户名是sys和system。

安装后修改密码是这个命令

alter user system identified by 你的新口令;

创建自己的用户是这个步骤,在命令行登录sqlplus,比如创建一个user1用户

sqlplus / as sysdba

create user user1 identified by user1_password;

grant connect,resource to user1;

如果你打算用user1管理数据库

grant dba to user1;

开发的时候可以用这个授权,将user1编程管理员帐户,但是在生产环境,不建议给应用的用户授权dba。


名称栏目:oracle口令怎么加密 oracle修改用户密码口令
文章URL:http://myzitong.com/article/hhjpcj.html