“安全外部密码存储”有什么用途?
我可以使用“安全外部密码存储”在我的Oracle表中创建密码字段吗?或者如何在不使用“安全外部密码存储”的情况下在Oracle表中创建密码字段?
答案 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来保存一个或 更多用户名/密码组合 运行批处理和其他任务 在没有用户交互的情况下运行。
为什么要将用户密码存储在数据库中?如果您希望用户通过可单独识别的帐户进行连接,请使用Oracle的USER功能。如果您正在构建一个网站,并且您的用户将通过通用用户进行连接,那么最好通过中间层中的某些内容来管理身份验证,该中间层通过LDAP(或其他)对Active Directory(或其他)进行身份验证。
但是如果你真的想要推出自己的身份验证,那么使用单向哈希就像Tony建议的那样。但是,如果您使用的是最近发布的Oracle(并且您对安全外部密码存储的兴趣表明您至少使用10g),那么您应该使用DBMS_CRYPTO.HASH() with the SHA-1 algorithm而不是旧的MD5。