Я изучал механизм 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)
Что клиент Oracle помещает в младшие 16 байтов значения AUTH_PASSWORD на шаге 5?
Практически вся найденная мною документация касается только получения открытого текста, содержащегося внутри, уделяя мало внимания этим первым байтам. Я попытался взглянуть на драйвер JDBC, но похоже, что даже версия 10g избегает этой схемы аутентификации, запрашивая, чтобы сервер вернулся к более старой схеме (которая оказывается гораздо лучше понятной). Отличная C программа демонстрирует расшифровку AUTH_PASSWORD.
Кто-нибудь может указать мне правильное направление?