HTTP のダイジェスト認証/NTLM認証を計算する ActiveX DLL と GUI プログラムです
- ver1.0.0.8 (2008/12/29) NTLM のReadMsg() 関数のバグ修正(GUI 版 ver1.0.0.2)、SetNonceHex(), GetNonceHex() 関数を追加した、httpDigest-Crack.vbs を同梱した
- ver1.0.0.7 (2008/05/24) GUI 版のプログラムのアイコンを透過アイコンにした(GUI 版 ver1.0.0.1)
- ver1.0.0.7 (2003/08/13) バグ修正と、GUI 版のプログラムの同梱
- ver1.0.0.6 (未公開) バグ修正
- ver1.0.0.5 (未公開) HTTP NTLM に対応
- ver1.0.0.4 (2003/07/27) DCOM 化と CLSID のバイナリ互換をつけて再コンパイル
- ver1.0.0.3 (2003/05/11) 最初のバージョン
内容
HTTP には、基本認証とは別に、ダイジェスト認証と呼ばれるチャレンジ/レスポンス方式の認証方法が用意されています。
sHTTPuse.Digest クラスは、そのチャレンジを渡された場合のレスポンスを計算する ActiveX DLL です。
sHTTPuse.NTLM クラスは、IE と IIS 間で行われる「Windows統合認証」で用いられているチャレンジ/レスポンス形式のレスポンスを計算する ActiveX DLL です。
この DLL を用いているプログラムは、TCP/IP テスターがあります。
sHTTPuse.NTLM クラス
メソッド/プロパティ一覧
- myHostName
レスポンスの計算に必要な「ホスト名」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myDomainName
レスポンスの計算に必要な「NTドメイン名」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myUserName
レスポンスの計算に必要な「ユーザ名」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myPassword
レスポンスの計算に必要な「パスワード」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myNonce
「Nonce」つまり「チャレンジ」
レスポンスの計算に必要な「nonce」の値を設定/参照する。
先頭 8Byte のみが使われる
- 文字列 = GetNonce()
レスポンスの計算に必要な「nonce」の値を参照する。
「Nonce」つまり「チャレンジ」の値を HEX 表示で取得する。
- SetNonce(文字列)
レスポンスの計算に必要な「nonce」の値を設定する。
「Nonce」つまり「チャレンジ」の値を HEX 表示で設定する。
先頭 8Byte のみが使われる
- myLanManHash
パスワードから計算された LanManagerHash の値です。
16進数表示で設定してください。または、取得形式は 16 進数表示です。
- myNTLM
パスワードから計算された NTLMHash の値です。
16進数表示で設定してください。または、取得形式は 16 進数表示です。
- myResponseLanManHash
LanManagerHash と Nonce から計算されたレスポンスです。
16進数表示で設定してください。または、取得形式は 16 進数表示です。
- myResponseNTLM
NTLMHash と Nonce から計算されたレスポンスです。
16進数表示で設定してください。または、取得形式は 16 進数表示です。
- AllClear
上記のプロパティを全てクリア(空文字)にします。
- 文字列 = CreateType1Msg(モード)
「ホスト名」「NTドメイン名」を用いて、Type1 メッセージを作成します。
「モード」が「1」の場合、結果をそのまま返す。
「モード」が「0」の場合、結果を Base64エンコード処理を行って返す。
- 文字列 = CreateType2Msg(モード)
「Nonce」を用いて、Type2 メッセージを作成します。
「モード」が「1」の場合、結果をそのまま返す。
「モード」が「0」の場合、結果を Base64エンコード処理を行って返す。
- 文字列 = CreateType3Msg(モードA,モードB)
「Nonce」と「ユーザ名」「ホスト名」「NTドメイン名」「LanManHash のレスポンス値」「NTLMHash のレスポンス値」(または「パスワード」)を用いて、Type3 メッセージを作成します。
「モードA」が「1」の場合、結果をそのまま返す。
「モードA」が「0」の場合、結果を Base64エンコード処理を行って返す。
「モードB」が「2」の場合、パスワードからハッシュを作って、それからレスポンスを作って Type3 メッセージを作る。
「モードB」が「1」の場合、レスポンス値を作り直して、Type3 メッセージを作る。
「モードB」が「0」の場合、現在のプロパティ値をそのまま使って Type3 メッセージを作る。
- 文字列 = ExecuteLanManHash()
「パスワード」から LanManHash を作る。
結果は、該当するプロパティにもコピーされる。
- 文字列 = ExecuteNTHash()
「パスワード」から NTHash を作る。
結果は、該当するプロパティにもコピーされる。
- 文字列 = ExecuteResponse(モード)
ハッシュ値と「Nonce」からレスポンスを作る。
結果は、該当するプロパティにもコピーされる。
「モード」が「0」の場合、LanManHash を使う。
「モード」が「1」の場合、NTHash を使う。
- 返り値 = ReadMsg(データ列,モード)
「データ列」を解析して、解析結果を各プロパティにコピーする。
この処理を実行するにあたり、内部的に AllClear() 関数が呼び出される。
戻り値は、解析結果が Type1 であれば「1」
Type2 であれば「2」
Type3 であれば「3」
解析できなかった場合「0」が返る。
「モード」が「0」の場合、「データ列」は Base64エンコードされている。
「モード」が「1」の場合、。「データ列」はそのままのデータ列として処理する。
HTTP NTLM について
流れ
- (Base64 エンコードされた) Type1 メッセージが、クライアントからサーバへ送られる。(認証要求)
- (Base64 エンコードされた) Type2 メッセージが、サーバからクライアントへ送られる。(チャレンジの通知)
- (Base64 エンコードされた) Type3 メッセージが、クライアントからサーバへ送られる。(レスポンスの通知)(認証)
リンク:
謝辞:
- ptrsのEiji James Yoshida 氏には、NTLM 認証について、丁寧に解説していただきました。
sHTTPuse.Digest クラス
メソッド/プロパティ一覧
- myURI
レスポンスの計算に必要な「URI」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myUserName
レスポンスの計算に必要な「ユーザ名」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myPassword
レスポンスの計算に必要な「パスワード」の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myHTTPMethod
レスポンスの計算に必要な「HTTP メソッド」(つまり"GET","POST" など)の値を設定/参照する。
必ず計算を実行する前にセットしてください。
- myRealm
「レルム」
レスポンスの計算に必要な「Realm」の値を設定/参照する。
execute() メソッドを呼び出す前には必ずセットしてください。
- myNonce
「Nonce」つまり「チャレンジ」
レスポンスの計算に必要な「nonce」の値を設定/参照する。
execute() メソッドを呼び出す前には必ずセットしてください。
- myQop
「Quority Of Protection」
レスポンスの計算に必要な「qop」の値("auth","Auth-int")を設定/参照する。
この値を空文字以外にセットした場合、レスポンスの計算方法は HTTP1.1 の方法になります。
通常は指定されていないか「auth」か「auth-int」「auth,auth-int」のどれかです。
- myNc
「Nonce Count」
レスポンスの計算に必要な「nc」(レスポンスを計算した回数)の値を設定/参照する。
「qop」をセットした場合、計算を実行する前に必ずセットしてください。
- myCNonce
「Client Nonce」
レスポンスの計算に必要な「nc」(レスポンスを計算した回数)の値を設定/参照する。
「qop」をセットした場合、計算を実行する前に必ずセットしてください。
- myAlgo
レスポンスの計算アルゴリズムを指定します。
「MD5」と「MD5-sses」を指定可能です。
指定されていない場合(空文字列の場合)、「MD5」を指定していると同等とします。
- myResponse
計算したレスポンスの値を取得できます。
- myOpaque
サーバが勝手に利用できる値で、クライアントはそのままサーバへ戻す必要があります。
ダイジェスト計算では使用しません。
execute2() によって「WWW-Authenticate」ヘッダを解析した時に与えられる可能性があります。
- myStale
この値が「true」の場合、サーバがクライアントへ「nonce」が古いだけで認証できなかったとクライアントへ伝えています。
ダイジェスト計算では使用しません。
execute2() によって「WWW-Authenticate」ヘッダを解析した時に与えられる可能性があります。
- AllClear
上記のプロパティを全てクリア(空文字)にします。
- 文字列 = execute
あらかじめ上記のプロパティを設定しておき、レスポンス値を計算します。
戻り値は、レスポンス値のプロパティと同じ値を戻します。
本関数を呼び出す前に、以下のプロパティ値をセットしておく必要があります。
- 必須項目
- 「ユーザ名」
- 「パスワード」
- 「レルム」
- 「HTTP メソッド」
- 「URI」
- 「nonce」
- 「qop」を指定した場合の必須項目
-
- 文字列 = execute2(引数)
HTTP の「WWW-Authenticate」ヘッダの値を引数として「Authorization」ヘッダの値を生成します。
戻り値は「Authorization」ヘッダの値です。
本関数を呼び出す前に、以下のプロパティ値をセットしておく必要があります。
- 必須
- 「ユーザ名」
- 「パスワード」
- 「HTTP メソッド」
- 「URI」
- 「qop」を指定した場合の必須項目
-
- 文字列 = CreateAuthorizationHeader()
現在のプロパティ値を元にして「Authorization」ヘッダの値を生成します。
HTTP Digest の計算方法
レスポンスは以下のように計算しています。
- HTTP 1.0 時代のレスポンス値の計算
-
- 「A1」=「ユーザ名」:「レルム」:「パスワード」
- 「A1'」=「A1」のハッシュ値
- 「A2」=「HTTP のメソッド」:「URI」
- 「A2'」=「A2」のハッシュ値
- 「Last」=「A1'」:「nonce」:「A2'」
- 「Response」=「Last」のハッシュ値
- HTTP 1.1 時代のレスポンス値の計算
「qop」の値が空文字でない場合
-
- 「A1」=「ユーザ名」:「レルム」:「パスワード」
- 「A1'」=「A1」のハッシュ値
- 「A2」=「HTTP のメソッド」:「URI」
- 「A2'」=「A2」のハッシュ値
- 「Last」=「A1'」:「nonce」:「nc」:「cnonce」:「qop」:「A2'」
- 「Response」=「Last」のハッシュ値
- HTTP 1.1 時代のレスポンス値の計算
「qop」の値が空文字でなく、アルゴリズムが「MD5-sess」の場合
-
- 「A0」=「ユーザ名」:「レルム」:「パスワード」:「nonce」:「cnonce」
- 「A1」=「A0」のハッシュ値
- 「A1'」=「A1」のハッシュ値
- 「A2」=「HTTP のメソッド」:「URI」
- 「A2'」=「A2」のハッシュ値
- 「Last」=「A1'」:「nonce」:「nc」:「cnonce」:「qop」:「A2'」
- 「Response」=「Last」のハッシュ値
「レルム」と「nonce」、および「qop」と「algorithm」がサーバからクライアントへ与えられるものです。
それ以外の「ユーザ名」「パスワード」「HTTP メソッド」「URI」「nc」「cnonce」などは、クライアントが自分で生成、または与える必要があります。
とくに「nc」は、レスポンス値の計算回数を指定するもの(こうすることで同一の「nonce」であっても異なるレスポンス値を生成でき、レスポンス値をワンタイムなものとする事ができる)である。
「cnonce」はサーバ認証としてクライアントからサーバへ送られるチャレンジであると考えてもよい。
使用時の注意
計算する前に「AllClear()」関数を使って、プロパティを初期化する事を推奨します。
以前に計算した結果が残っている可能性があるからです。
(それをうまく使って...という考え方もアリですが...)
CreateObject へ渡す文字列は
HTTP Digest 認証 |
sHTTPuse.Digest |
HTTP NTLM 認証 |
sHTTPuse.NTLM |
です
動作環境
直接的に必要な環境は以下です。
使用方法
- BASP21 をインストールしてください。(既にインストールされていれば必要ありません)
- まず、VisualBASIC6.0 のランタイムを Vector などからダウンロードしてインストールします。
(ランタイムが既にインストールされていれば必要ありません)
- ダウンロードしたファイルを解凍しします。
(LHAは、吉崎栄泰氏が、著作権を所有)
- 解凍した出来たディレクトリの、"DLL" 以下のファイルは、COM(ActiveX DLL)です。
- sHTTPuse.dll をインストールするディレクトリへコピーします。
- コマンドプロンプト で、sHTTPuse.dll をコピーしたディレクトリで、"RegSvr32.exe sHTTPuse.dll" を実行し、レジストリに登録します。
(RegSvr32.bat を DLL と同一ディレクトリへコピーして、実行しても同様のことが可能です)
- 以上で、COM コンポーネントとしての、sHTTPuse.dll は登録が完了です。
COM アクセスが可能なものなら、sHTTPuse.dll を利用する事が可能です。
免責など
著作権は保持します。(とりあえず)
このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。
ソースコードについても、各自の責任において改変する事については、自由おこなって頂いて結構です。
「参考になったよ」メールを投げてくれると嬉しいです。(*^_^*)
Version1.0.0.8DownLoad(sHTTPDigest.lzh as 55,506byte) (sHTTPDigest.lzh.base64)
これから....
NTLM のアルゴリズムの実装
CryptAPI COM への移行
SHA1 とかも絡むとこちらの方がいいかもぉ〜...
CryptAPI COM の DES メソッドは自由度が低いので、この計画はありえないでしょう。
自分で CryptAPI を COM ラップするような事になれば....どうなるかは分かりませんが...
- ver1.0.0.5 の現状は
- HTTP Digest の MD5 は baba 氏の BASP21
- NTLMHash の MD4 は CryptAPI COM
- LanManHash と HTTP NTLM の DES は sComCrypt.sDES
- HTTP NTLM の BASE64 は sCOMBase64.dll
なので、一本化したいな〜
確かに、モジュール開発の醍醐味/ごった煮のような状態なんだけどぉ〜...
mail to active@window.goukaku.com