Протокол входа в систему Oracle (O3LOGON) в 10 г - PullRequest
4 голосов
/ 12 февраля 2009

Я изучал механизм 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.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2009

Я определил, что 16 байтов непосредственно перед тем, как случайный текст пароль генерируется случайным образом (для любопытных взгляните на функцию ztvo5pe, экспортированную библиотекой oran10.dll - вы увидите два последовательных вызова ztcen, первый Звонок заполняет его).

Первоначально я опубликовал вопрос, потому что писал небольшую программу для подключения к базе данных Oracle без использования драйвера JDBC Oracle. Я обнаружил, что база данных отклоняет мой 32-байтовый AUTH_PASSWORD. Я предположил, что это было отклонено, потому что я поместил неправильное значение в эти первые 16 байтов. Я был неправ. Похоже, что они не влияют на то, аутентифицируется ли пользователь.

Скорее получается, что база данных отклонила мой AUTH_PASSWORD из-за завершающих байтов, которые идут сразу после простого текстового пароля. Я наивно дополнил буфер нулями. Он должен быть дополнен в соответствии со спецификацией PKCS # 7.

0 голосов
/ 22 июля 2009

Если длина пароля <16, первые 16 байтов являются случайными данными, тогда пароль, данные дополнения являются символом (16-стр. (Пароль)). Сервер Oracle может принять мой AUTH_PASSWORD. Если длина пароля> = 16, я не знаю, как это сделать. Я заполнил первые 16 байтов случайными данными, но сервер отклонил мои данные. Я хочу знать: вы уверены, что данные заполнения соответствуют спецификации PKCS # 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...