panjingweb 发表于 2018-12-16 09:44

Oracle登陆身份验证过程原理解析

身份验证的工作原理
这里的Oracle版本为11.2
如果没办法捕获本机数据包请看我的博客

1.连接到Listener之后,身份验证的过程就开始了,真正核心的部分,它是同故宫客户机想服务器发送自己的用户名来完成的。


2.在前面截获的包中,用户名是system,服务器取出这个用户名并检查是否是一个有效的用户。如果不是,服务器则向客户及发送一个登陆被拒绝的错误。如果用户名确实存在,则服务器从数据库中提取该用户密码的散列值。利用这个散列值生成一个密码。


3.具体生成过程为:服务器调用orageneric库中的slddt()。实际上这个函数是用来重新获得时间的。将分钟,小时,秒结合起来形成一个用来加密的8个字节的文本。加密中要使用的密钥的前4个字节代表发呢中和小时与用户的16进制密码的散列值的最后四个字节进行异或。密钥的后四个字节是由毫秒和秒与用户16进制密码散列值的前4个字节的异或组成。通过调用oracommon中的kzsrenc(),可以使用该密钥对文本进行加密。通过使用函数Incgks()与kzsrenc()基本上完成了DES密钥的生成,随后它利用函数Incecb()输出ecb模式下的DES密文,就是密码,再利用用户的散列值对密码进行加密,结果就是AUTH_SESSKEY,发给客户机

收到AUTH_SESSKEY后,客户机必须将其解密重新获得密码,用户利用oracle库中的函数Incupw()创建自己密码散列值的一个副本后通过调用kzsrdec(),将该散列值用作对AUTH_SESSKEY解密的密钥,如果一切顺利的话,会生成密码。随后通过调用kzsrenp()这个密码对用户明文、大小写敏感的密码进行加密一个密钥,以AUTH_PASSWORD的形式被送回服务器


服务器通过调用oracommon库中的函数kzsedep(),利用密钥密码AUTH_PASSWORD进行解密。现在服务器已经拥有明文密码的一个副本了,创建散列值与数据库中的散列值进行比较,匹配,则通过身份验证。随后服务器检查确定用户是否具有服务器级别的权限。
最后需要提及的一点是,得益于密码的加密方式,可以获得有关密码长度的信息。如果AUTH-PASSWORD的长度为16个字符,则实际的密码长度不大于8个字符。如果用户的密码长度在9个字符和16个字符之间,AUTH_PASSWORD应该是32个字符。

panjingweb 发表于 2018-12-18 20:15

zzti 发表于 2018-12-18 11:01
客户端程序如果直接连接数据库,需要将本地密码保存起来,无论自己怎么加密,在发送给oracle的时候都已经解 ...

Oracle中的密码并不会采用明文传输,会将散列值进行计算。同时,得到AUTH_SESSIONKEY与AUTH_PASSWORD即可解密得到明文密钥。或者离线进行散列值暴力破解。
在交换式的网络环境中,会砸模式的网卡可以嗅探信道上的流量。因此,防止密码被截获是一个治根不治本的方法

panjingweb 发表于 2018-12-17 14:45

zjlzhok 发表于 2018-12-17 10:44
若是明文的话,可以破解oracle的登录密码吗?

可以的,下一节的更新中会涉及到。
但是Oracle并不会出现明文的密码。
利用上述的散列值可以实施破解

凌风者 发表于 2018-12-17 09:48

学习了,多谢分享,也收藏下

tonyh0 发表于 2018-12-17 10:29

“故宫客户机想服务器”,这里有传说中的错别字么?

Badlow 发表于 2018-12-17 10:30

感谢分享

zjlzhok 发表于 2018-12-17 10:44

若是明文的话,可以破解oracle的登录密码吗?

chenyadi 发表于 2018-12-17 11:32

不错过来学习了

panjingweb 发表于 2018-12-17 14:43

tonyh0 发表于 2018-12-17 10:29
“故宫客户机想服务器”,这里有传说中的错别字么?

好像是这么回事的。边学习边作的笔记,请见谅

sphinx_young 发表于 2018-12-17 15:22

期待下一节

ding2018 发表于 2018-12-17 19:28


学习了,多谢分享,也收藏下
页: [1] 2
查看完整版本: Oracle登陆身份验证过程原理解析