在oracle中创建密码字段

时间:2010-01-29 11:40:22

标签: oracle security authentication passwords

“安全外部密码存储”有什么用途?

我可以使用“安全外部密码存储”在我的Oracle表中创建密码字段吗?或者如何在不使用“安全外部密码存储”的情况下在Oracle表中创建密码字段?

2 个答案:

答案 0 :(得分:3)

不使用“安全外部密码存储”(无论可能是什么)的一种方法是向表中添加RAW(16)列以存储哈希用户名和密码:

alter table mytable add password raw(16);

然后将散列的用户名和密码存储在其中:

insert into mytable (username, password, ...)
values (:username, dbms_obfuscation_toolkit.md5 
                      (input => utl_i18n.string_to_raw
                                  (upper(:username)||:password))
       );

然后当用户尝试使用用户名和密码登录时,您可以像这样检查它们:

select 'OK'
from   mytable
where  username = :username
and    password = dbms_obfuscation_toolkit.md5 
                      (input => utl_i18n.string_to_raw
                                  (upper(:username)||:password));

这样,没有人能够找出存储的密码是什么(除了蛮力)。

答案 1 :(得分:2)

安全外部密码存储不适用于常规用户帐户。它旨在为需要从自主进程(例如,shell脚本)连接到数据库的帐户安全地保存密码:

  

安全外部密码存储区   使用Oracle Wallet来保存一个或   更多用户名/密码组合   运行批处理和其他任务   在没有用户交互的情况下运行。

Find out more

为什么要将用户密码存储在数据库中?如果您希望用户通过可单独识别的帐户进行连接,请使用Oracle的USER功能。如果您正在构建一个网站,并且您的用户将通过通用用户进行连接,那么最好通过中间层中的某些内容来管理身份验证,该中间层通过LDAP(或其他)对Active Directory(或其他)进行身份验证。

但是如果你真的想要推出自己的身份验证,那么使用单向哈希就像Tony建议的那样。但是,如果您使用的是最近发布的Oracle(并且您对安全外部密码存储的兴趣表明您至少使用10g),那么您应该使用DBMS_CRYPTO.HASH() with the SHA-1 algorithm而不是旧的MD5。