私は、10g データベースに対して認証を行うための Oracle のメカニズムを研究しています。対応する 9i ほど文書化されていませんが、さまざまな Web サイトやブログで詳細を見つけることができました。しかし、ワンピースは謎のままです。不足しているものについて言及する前に、疑似コードでプロトコルについて知られていることを説明しましょう。
// 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 プログラムは、AUTH_PASSWORD の復号化を示しています。
誰かが私を正しい方向に向けることができますか?