サーバーを使ったログイン認証方法を教えてください。

タグの編集
投稿者 ikakawaiidesu  (中学生) 投稿日時 2012/11/25 05:22:12
みなさんはじめまして、Ikakawaiidesuです。

VBもまだ未熟なので文におかしいところもあるかもしれませんがお許しください。

VBWindowsアプリケーションでサーバーを使ったログイン方法を教えてください。


たとえば、サーバー(Dropbox等)に書かれたパスワード(改行で複数にわけているとして)を、
VBで取得し、もしTextboxに入力されたパスワードとサーバーのパスワードのどれかと
一致していればForm2を表示し、正しくなければエラーを表示させたいです。

どなたか教えてください。
投稿者 ikakawaiidesu  (中学生) 投稿日時 2012/11/25 05:26:23
あ、すいません、追記です。


VBのバージョンはVisual Studio2010 Ultimateです。
投稿者 daive  (社会人) 投稿日時 2012/11/25 09:09:01
>サーバー(Dropbox等)
https://www.dropbox.com/privacy#acceptable_use
Dropbox のご利用規定
【抜粋始】
セキュリティまたは認証手段の違反または回避
【抜粋了】
など、利用規定に違反しない手順を調べる、
機能提供が有るかどうかを、調べる。
(APIの提供があるかどうか、など。)
まずは、其処からです。

API提供が有る場合は、
規約違反、法令違反、に注意して、使用します。
API提供が無い場合で、自動ログインアプリの使用が、許可されている場合は、
規約違反、法令違反、に成らない様に、使用します。
不明な場合は、サイト作成者などに、
問い合わせします。

検索ワード例: Dropbox API
投稿者 YuO  (社会人) 投稿日時 2012/11/25 16:35:12
えーっと,Dropboxにログインするのではなく,クライアントソフトウェアの使用権限チェックみたいなことをしたいのですよね。
# システムを提供するサーバーへのログインであれば,サーバーが認証と認可の為の機構を提供すべきなので。

Dropboxにパスワードを置くのではなく,なんらかのプログラムを動かせるサーバーを用意して,
サーバーにパスワード (とユーザー名等の付帯情報) を渡し,サーバー側で判断させるのがよいと思います。
Web環境ではないため,ECDH (楕円曲線DH) 使った鍵交換でソルトを渡してハッシュした結果をサーバーに渡すなどの方法で,
平文パスワードをネットワークに流さないための手段を講じられます。
man-in-the-middle対策でSSLも用意したいところです。
# 固定のソルトでハッシュした後,追加情報として鍵交換したデータでハッシュする。サーバー側は固定のソルトによるハッシュデータがあればよい。

固定のソルトであれば,Dropbox上のパスワードファイルもハッシュしておくことで平文パスワードをネットワークに流さない,は対応できます。
投稿者 ikakawaiidesu  (社会人) 投稿日時 2012/11/28 02:04:20
はい、Dropboxにログインするのではなく、

Dropboxのpublicフォルダに配置されているPass.txtに記入されている
パスワードをVBで取得し、Textboxの内容と一致していればForm2を表示するプログラムを
作りたいと思ってます。ですが、やはりDropboxのほかにサーバーが必要となるのでしょうか?
投稿者 ヴァン  (社会人) 投稿日時 2012/11/28 09:57:25
こんにちは。

アプリ(フォーム)が起動できるかどうかの条件をサーバー側に持っておきたいということでしょうか?
シェアウェア的なアプリで、パスワード流出を防ぐ目的で、毎月パスワードを変更するとか?
投稿者 YuO  (社会人) 投稿日時 2012/11/28 10:33:41
> Dropboxのpublicフォルダに配置されているPass.txtに記入されている
> パスワードをVBで取得し、Textboxの内容と一致していればForm2を表示するプログラムを
> 作りたいと思ってます。ですが、やはりDropboxのほかにサーバーが必要となるのでしょうか?

セキュリティの面をまったく無視するならば,Pass.txtをダウンロードするだけですから,
Dim dropboxPassword = New WebClient().DownloadString(DropboxUri)

で取得できます。
# 実際には非同期処理にすべきであるため,このコードは推奨されません。

ただし,これは例えばFiddler ( http://www.fiddler2.com/fiddler2/ ) のようなプロキシ型のデバッガや,
Winshark ( http://www.wireshark.org/ ) のようなパケットキャプチャで通信を調べることで,
簡単にパスワードが取得できてしまいます。


セキュリティ面で安全なのは,サーバー側で認証を行うことです。
これにより,「正しいパスワード」の参考情報がサーバー側のみに存在するため,
クライアント側でいくらキャプチャしても送信したパスワード情報のみしか取得できないためです。
この場合,サーバー自身がパスワードやそれをハッシュした情報を持っているため,Dropbox自体が不要です。

サーバーを用意できない等の理由により,どうしてもクライアント側で認証したいとしても
パスワードそのまま (平文) を流せばパスワードがわかってしまいます。
なので,ハッシュ値を返すなどして,平文がわからないような工夫を必要とします。
クライアント側では,入力されたパスワードをサーバー側と同一の方法でハッシュ値を計算して同一のハッシュ値になることを確認することで,認証を行います。
# ユーザー名と固定値をソルト (パスワードの撹拌用情報) として使うなどの工夫は存在します。

なお,通常,暗号化ではなくハッシュを使います。
暗号化では復号可能であることが前提であるのに対して,ハッシュは復号不可能であることが前提だからです。
投稿者 ikakawaiidesu  (社会人) 投稿日時 2012/11/30 04:44:50
>>ヴァン様
>アプリ(フォーム)が起動できるかどうかの条件をサーバー側に持っておきたいということでしょうか?
>シェアウェア的なアプリで、パスワード流出を防ぐ目的で、毎月パスワードを変更するとか? 
はい、パスワード流出を防ぐ目的で毎月パスワードを変更します。

>>YuO様
>セキュリティの面をまったく無視するならば,Pass.txtをダウンロードするだけですから,
>Dim dropboxPassword = New WebClient().DownloadString(DropboxUri)
できました!ありがとうございました!!ですが、この場合Pass.txtにはパスワードが
複数あったとして、それが改行で区切られている場合は使えないのでしょうか?

投稿者 (削除されました)  () 投稿日時 2012/11/30 10:26:38
(削除されました)
投稿者 (削除されました)  () 投稿日時 2012/11/30 10:28:25
(削除されました)
投稿者 YuO  (社会人) 投稿日時 2012/11/30 11:05:54
> はい、パスワード流出を防ぐ目的で毎月パスワードを変更します。
平文を流したのでは意味が無いことは理解されていますか。

Fiddlerをインストールして起動して,
・キャプチャを有効にする
→[File]-[Capture Traffice]にチェックが付いた状態
・DropboxのダウンロードがHTTPSならHTTPSのキャプチャも有効にする
→[Tools]-[Fiddler Options]の[HTTPS]タブ,[Capture HTTPS CONNECTs]と[Decrypt HTTP traffic]にチェック
とした状態で,プログラムを通信させてみてください。

なお,FiddlerがHTTPS通信をキャプチャする場合,無効なSSL証明書とされてエラーになると思うので,
Site: SSL通信で信頼されない証明書を回避するには?[C#、VB、2.0、3.0、3.5] - @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/867sslavoidverify/sslavoidverify.html
にあるコードを一時的に追加して,無効なSSL証明書のチェックをバイパスしてください。
# 私はfiddlerの証明書を信頼できる証明書に追加していますが,この方法は推奨される方法ではありません。

[Web Sessions]ペインにキャプチャされた通信が並び,実際に対象となる通信を選択して右側の[Inspectors]タブを選択すると,通信の内容が分かり易く表示されていると思います。
下側,ResponseのTextViewには平文のパスワードが丸々載っていると思います。
つまり,正しくないパスワードであっても,サーバーからパスワード情報が手に入ってしまいます。

ハッシュを使うのは,パスワードをそのまま見られなくするための工夫です。
ソルトを使うことで,解析を困難にする効果もあります。
# 世の中にはレインボーテーブルというものがあってですね……。
このあたりは,パスワードの保存方法に関するセキュリティ知識になります。
Webサイト構築で新たに必要となることが多いため,Webサイトのセキュリティの書籍やサイトなどに書かれています。
e.g.) http://www.amazon.co.jp/dp/4797361190/


ちなみに,WebClientのProxyプロパティにGlobalProxySelection.GetEmptyWebProxy()を設定することで,Fiddlerではキャプチャできなくなります。
しかし,WinsharkはIP通信自体をキャプチャするため,これを回避することはできません。


> この場合Pass.txtにはパスワードが
> 複数あったとして、それが改行で区切られている場合は使えないのでしょうか?
なぜですか。
複数行あるなら複数行あるとして扱えばよいだけです。
投稿者 ikakawaiidesu  (中学生) 投稿日時 2012/12/1 00:12:47
>>複数行あるなら複数行あるとして扱えばよいだけです。 

いえ、複数行のは別のパスワードとして扱いたいのです。
投稿者 YuO  (社会人) 投稿日時 2012/12/1 01:46:14
>>>複数行あるなら複数行あるとして扱えばよいだけです。 
> いえ、複数行のは別のパスワードとして扱いたいのです。

再度書きます。
複数行あるなら複数行あるとして扱えばよいだけです。
各行を別のパスワードとして扱いたいのであればそう扱えばよいのです。
投稿者 ikakawaiidesu  (中学生) 投稿日時 2012/12/1 02:16:15
>YuO様

あ、なるほど!やっと言葉の意味に気づきました。
解決しました。皆さんありがとうございました!