好友
阅读权限10
听众
最后登录1970-1-1
|
身份验证的工作原理
这里的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个字符。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|