Oracle登录协议(O3LOGON)在10g
我一向在研究Oracle针对10g数据库举办身份验证的机制.固然它没有9i版本的文档记录,但我如故想法在各类网站和博客上找到它的很多细节.然而,一件作品如故是个谜.在我提到漏掉的内容之前,让我表明伪代码中有关协议的常识: // CLIENT SIDE PSEUDO CODE user = "SCOTT" password = "TIGER" password_hash = oracle_password_hash(user,password) // 1. Client provides user name to server send(user) // 2. Server responds with its encrypted AUTH_SESSKEY,// a randomly generated number associated with the current session encrypted_server_AUTH_SESSKEY = receive_AUTH_SESSKEY() // 32 bytes decrypted_server_AUTH_SESSKEY = aes_decrypt( encrypted_input => encrypted_server_AUTH_SESSKEY,decryption_key => password_hash ) // 3. Client generates its own AUTH_SESSKEY for this session unencrypted_client_AUTH_SESSKEY = generate_random_AUTH_SESSKEY() // 32 bytes encrypted_client_AUTH_SESSKEY = aes_encrypt( unencrypted_input => unencrypted_client_AUTH_SESSKEY,encryption_key => password_hash ) // 4. Client combines the two AUTH_SESSKEYs using a known Oracle-specific algorithm combined_AUTH_SESSKEYs = oracle_combine(decrypted_server_AUTH_SESSKEY,unencrypted_client_AUTH_SESSKEY) // 5. Client builds AUTH_PASSWORD unencrypted_AUTH_PASSWORD = byte[32] unencrypted_AUTH_PASSWORD[0 .. 16] = ??? // THIS IS THE PROBLEM unencrypted_AUTH_PASSWORD[16 .. 16 + len(password)] = password unencrypted_AUTH_PASSWORD[16 + len(password) .. ] = PKCS#7 padding // 6. Client encrypts the AUTH_PASSWORD data using the combined AUTH_SESSKEYs as the encryption key encrypted_AUTH_PASSWORD = aes_encrypt( unencrypted_input => unencrypted_AUTH_PASSWORD,encryption_key => combined_AUTH_SESSKEYs ) // 7. Client transmits its encrypted AUTH_SESSKEY and AUTH_PASSWORD to server for verification send(encrypted_client_AUTH_SESSKEY,encrypted_AUTH_PASSWORD) 在第5步中,Oracle客户端在AUTH_PASSWORD值的低16字节中安排了什么? 我发明的险些全部文档都只体谅获取个中包括的纯文本暗码,而不存眷这些第一个字节.我曾实行查察JDBC驱动措施,但好像纵然是10g版本也会通过哀求处事器规复到较旧的方案(这刚好可以更好地领略)来停止此身份验证方案.一个优越的C program演示了AUTH_PASSWORD的解密. 谁能指出我正确的偏向? 办理要领我已经确定了明文暗码之前的16个字节是随机天生的(对付好奇的,看看oran10.dll库导出的ztvo5pe函数 – 你会看到两次持续挪用ztcen,第一个挪用添补它在).我最初宣布这个题目是由于我正在编写一个小措施来毗连Oracle数据库,而不行使Oracle的JDBC驱动措施.我发明数据库拒绝了我的32字节AUTH_PASSWORD.我以为它被拒绝了,由于我在前16个字节中放了一个不正确的值.我错了.看来这些对用户是否举办身份验证没有任何影响. 相反,究竟证明数据库拒绝我的AUTH_PASSWORD,由于明文暗码后头紧随着尾随字节.我灵活地用零添补缓冲区.它应该按照PKCS#7类型举办添补. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |