这是编程和系统管理员的混合,但我决定更多的编程问题 .
目前正在构建用于管理Oracle用户帐户(C#)的密码管理Web应用程序 .
范围要求在允许用户设置新密码之前验证用户的Oracle用户名和密码 . 如果不创建用户密码表(散列或其他方式,这是一种安全风险),我该如何验证旧用户密码?
我目前的解决方案是尝试使用用户指定的用户名/密码连接到数据库 . 对此进行太多尝试会将用户锁定在Oracle端,因此强制执行不太合理 . 这里是否还存在其他安全隐患?或者是否有更好的处理方法?
我们使用AD作为主要身份验证,但AD帐户与Oracle帐户无关,因此只是初步检查 .
Flow of the application (if this helps):
-
AD检查域名是否正确(内部网)
-
用户输入Oracle用户名/密码
-
输入旧密码,新密码确认
-
如果正确,请重置密码
3 回答
正如dpbradley建议的那样,我将使用提供的凭据连接到数据库 . 如果成功,请让他们更改密码 .
用于散列Oracle密码的算法是众所周知的并且不难duplicate . 因此,您可以获取用户的条目,使用相同的算法对其进行哈希处理,并将其与哈希值进行匹配 . 该值在11g之前的DBA_USERS中或在SYS.USER $中可见 .
这种方法的危险在于使得哈希可用于允许密码的暴力破解(这就是为什么11g使散列值不太可见) .
在调用Alter User时,您可以添加Replace关键字,这样只有在您输入了正确的旧密码后才会更改用户(例如,更改由newPassword标识的用户userName替换oldPassword . )在某些情况下,这不会导致错误您输入了错误的旧密码,但如果您遇到问题,可以查看它们 .