4

私は、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 の復号化を示しています。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

3

プレーンテキストのパスワードの直前の16バイトがランダムに生成されることを確認しました(不思議なことに、oran10.dllライブラリによってエクスポートされたztvo5pe関数を見てください-ztcenへの2つの連続した呼び出しが表示され、最初の呼び出しがそれを満たしますの)。

OracleのJDBCドライバーを使用せずにOracleデータベースに接続するための小さなプログラムを作成していたため、最初に質問を投稿しました。データベースが32バイトのAUTH_PASSWORDを拒否していることがわかりました。これらの最初の16バイトに間違った値を入れたため、拒否されたと思いました。私は間違っていた。これらは、ユーザーが認証するかどうかには影響しないようです。

むしろ、プレーンテキストのパスワードの直後に続くバイトが原因で、データベースが私のAUTH_PASSWORDを拒否していたことがわかりました。バッファにゼロを単純に埋めました。PKCS#7仕様に従ってパディングされている必要があります。

于 2009-02-18T14:00:17.633 に答える
-1

パスワードの長さが 16 未満の場合、最初の 16 バイトはランダム データであり、パスワード、パディング データは (16 – strlen(password)) の文字です。Oracle サーバーは私の AUTH_PASSWORD を受け入れることができます。パスワードの長さが 16 以上の場合、その方法がわかりません。最初の 16 バイトにランダム データを入力しましたが、サーバーがデータを拒否しました。知りたい: パディング データが PKCS#7 仕様に従っていることを確認します。

于 2009-07-22T06:04:04.377 に答える