IP認証を入れたいのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
splash
記事: 16
登録日時: 10年前

IP認証を入れたいのですが・・・

#1

投稿記事 by splash » 10年前

C++ CLR で↓のようなグローバルIP認証プログラムを作りたいのですが

*********************************************
プログラムの起動

ネットワーク認証をする(サーバーへの接続)

IPアドレスが登録されている

起動
**************************************************
色々調べてみると
まず、http://checkip.dyndns.org/このようなサイトを利用して ... gex::Match(html, "\d{1,3}([.]\d{1,3}){3}"
などしてIPアドレスを取得すればいいというのはわかったのですが、具体的にどのようなコードを書けばいいかがまったくわかりません。
IPを取得したあとサーバーに接続して認証する処理などはあとで考えるとして、とりあえずIPを取得する具体的な方法を知りたいです。
どなたか教えていただけないでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: IP認証を入れたいのですが・・・

#2

投稿記事 by h2so5 » 10年前

認証サーバーに接続したときにサーバー側でIPアドレスは分かるので、事前にIPアドレスを調べる必要はないと思いますが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#3

投稿記事 by softya(ソフト屋) » 10年前

グローバルIP認証プログラムとは、具体的に何をするために必要な動作でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#4

投稿記事 by splash » 10年前

すいません、説明不足だったようです。

あるソフトを作ったのですがそのソフトを特定の人だけに有料で販売しようとしています。
しかし、何も認証をかけずに配布してしまうと2時配布されるなどの危険性がありますので、IP認証をかけようと思っています。

>認証サーバーに接続したときにサーバー側でIPアドレスは分かるので、事前にIPアドレスを調べる必要はないと思いますが。
確かにそうですね、しかし認証サーバーに接続したとしても、そこでIPの認証を行わないといけないので、やはりサーバーから文字例を取得する処理を書かないといけないと思うんですよね・・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#5

投稿記事 by softya(ソフト屋) » 10年前

splash さんが書きました:すいません、説明不足だったようです。

あるソフトを作ったのですがそのソフトを特定の人だけに有料で販売しようとしています。
しかし、何も認証をかけずに配布してしまうと2時配布されるなどの危険性がありますので、IP認証をかけようと思っています。

>認証サーバーに接続したときにサーバー側でIPアドレスは分かるので、事前にIPアドレスを調べる必要はないと思いますが。
確かにそうですね、しかし認証サーバーに接続したとしても、そこでIPの認証を行わないといけないので、やはりサーバーから文字例を取得する処理を書かないといけないと思うんですよね・・・・
一般的にグローバルIPアドレスはモデム接続時に変動するので認証には使えません。
グローバルIPは共用で、ローカルIPしか持たないユーザーも考えられます。
モバイル接続していた場合は、移動時に変化します。
などなどの理由により、グローバルIPを使うのは難しいです。

【補足】
ちなみにCLRのC++/CLI(マネージドコード)は逆コンパイルされやすいので有料ソフト販売には不向きかと思いますがご存知でしたか?
難読化や暗号化などを施す必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#6

投稿記事 by splash » 10年前

逆コンパイルされやすいのは知りませんでした、しかし基本的に私の作ったソフトを買うのは、プログラムなどがまったくできない方だと思うので、逆コンパイルの危険性などはあまりないと思います。
一応簡単なパックはしようと思いますけど・・・

>一般的にグローバルIPアドレスはモデム接続時に変動するので認証には使えません。

確かにそうですね、しかしそういうことも把握した上でグローバルIPを使おうとしています。

コード:


311 ページを読み込んでファイルに保存
using namespace System::Net;
using namespace System::IO;

WebClient^ wc = gcnew WebClient();
wc->DownloadFile("http://www.google.co.jp/", "D:\\google.html");

このようなコードを見つけたので試してみたのですが、ファイルが保存できませんね~><

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#7

投稿記事 by softya(ソフト屋) » 10年前

> 確かにそうですね、しかしそういうことも把握した上でグローバルIPを使おうとしています。

電源をいれる度に変わるので毎日変わる人もいるんですが、それでも良いんですね。

> グローバルIPは共用で、ローカルIPしか持たないユーザーも考えられます。

こういうケーブルテレビ局のインターネットやマンション共有の方は使えなくても良いという認識でよいでしょうか?
あるいは、他人とIPがかぶっても良いと言うことですか?

> このようなコードを見つけたので試してみたのですが、ファイルが保存できませんね~><

どうダメだったかを説明してもらえますか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#8

投稿記事 by splash » 10年前

すいません、親切にグローバルIPが不向きなことを指摘して頂いてるのに無視するようになってしまいますが・・・
> グローバルIPは共用で、ローカルIPしか持たないユーザーも考えられます。
そういう方は別の認証方法を考えています。
>電源をいれる度に変わるので毎日変わる人もいるんですが、それでも良いんですね。
新しいIPを毎日手動で登録できるサイトを作るつもりです。

>どうダメだったかを説明してもらえますか。
コンパイルはできてコードを実行できるのですが、実行したあとファイルの保存先に指定したディレクトリをみるとどこにもHTMLファイルが見当たりません。

コード:

#pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 
WebClient^ wc = gcnew WebClient();
				 wc->DownloadFile("http://www.google.co.jp/", "C:\TEST\google.html");
}
// using namespace System::Net;       using namespace System::IO;   

↑の2つは↑の方のUsingがたくさんあるところに追加しました	  
C++ CLRのフォームアプリケーションで作ってます。
このようなコードを書いたのですが・・・・

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: IP認証を入れたいのですが・・・

#9

投稿記事 by h2so5 » 10年前

splash さんが書きました: >電源をいれる度に変わるので毎日変わる人もいるんですが、それでも良いんですね。
新しいIPを毎日手動で登録できるサイトを作るつもりです。
そのサイトの認証はどうするのですか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#10

投稿記事 by softya(ソフト屋) » 10年前

>> グローバルIPは共用で、ローカルIPしか持たないユーザーも考えられます。
>そういう方は別の認証方法を考えています

こちらで統一すれば簡単なのではないでしょうか。

コード:

エスケープされるので"C:\\TEST\\google.html"
じゃないかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#11

投稿記事 by splash » 10年前

はい、おっしゃる通りだと思います。
しかし、その認証方法(ローカルIP)にするにしてもサーバーとの認証を行わないといけないのでサーバーからデーターを取得する必要があります。

エスケープされることを忘れてました(汗)ありがとうございます

無事HTMLファイルが作られたのですが、指定したGoogleのTOPページではなく、IEを開いた時に最初にでてくるページを取得していました・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#12

投稿記事 by softya(ソフト屋) » 10年前

> サーバーからデーターを取得する必要があります。

これは、グローバルIPは関係ないですよね。

【補足】
やっぱり、グローバルIPが必要な理由が分かんないですね。
サーバーからデーターを取得する = グローバルIPが必要  分かりづらかったので修正。
サーバーからデーターを取得する = クライアント側にグローバルIPアドレスの情報が必要 
じゃないですから。

> 無事HTMLファイルが作られたのですが、指定したGoogleのTOPページではなく、IEを開いた時に最初にでてくるページを取得していました・・・

WebClient()の仕様では?
HttpClient()じゃないので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#13

投稿記事 by splash » 10年前

>サーバーからデーターを取得する = グローバルIPが必要
じゃないですから。

そういうことを言っているのではありません、グローバルIPを使わないにしてもサーバーから何らかのデータを取得しないと認証が行えないので・・・
例えばC++でローカルIPを調べてそのアドレスが1111だったとして、サーバーからデータを取得して1111がそのデータの中にあるかを確認できるようなプログラムを組みたいのです。
別にグローバルIPにこだわっているわけではありません。

HttpClient()の使い方についてソースコードなどをみせてもらえるとありがたいです。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: IP認証を入れたいのですが・・・

#14

投稿記事 by YuO » 10年前

softya(ソフト屋) さんが書きました: WebClient()の仕様では?
HttpClient()じゃないので。
うーん,普通にWebClientで取得できるのですけどね……。
Fiddlerで見ても普通に繋げていますし。

splash さんが書きました:はい、おっしゃる通りだと思います。
しかし、その認証方法(ローカルIP)にするにしてもサーバーとの認証を行わないといけないのでサーバーからデーターを取得する必要があります。
認証自体はサーバー側にやらせればいいと思いますよ。
認可の情報もサーバーから送ればよいですし。
.NET FrameworkにはDiffie-Hellman鍵交換はないですが楕円曲線Diffie-Hellman鍵交換 (ECDH) がありますから,
鍵交換をECDHで行ってAES等で認証の確認を行えばよいでしょう。

特定のマシンであることを要求するなら,インストールプロセスで秘密鍵を作って公開鍵をサーバーに送信,
認証情報をその鍵で署名することでクライアントの特定をすればよいと思います。
オフトピック
というか,ユーザー名とパスワードの認証で足りない,というのはよっぽどな気がしますが……。

以下おまけ。
WebClientを使った検証用C#コード。

コード:

using System;
using System.IO;
using System.Net;

class Program
{
	static void Main ()
	{
		var client = new WebClient();
		client.DownloadFile("http://www.google.co.jp/", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "google.html"));
	}
}
HttpClientだとこんな感じ。

コード:

using System;
using System.IO;
using System.Net.Http;

class Program
{
	static void Main ()
	{
		using (var client = new HttpClient())
		{
			var awaiter = client.GetStreamAsync("http://www.google.co.jp/").GetAwaiter();
			using (var streamIn = awaiter.GetResult())
			using (var streamOut = File.OpenWrite(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "google.html")))
			{
				streamIn.CopyToAsync(streamOut).Wait();
			}
		}
	}
}
これだけなら,どう考えてもasync/await使った方が賢い。なので,C++/CLIにはないですが,async/awaitを使った場合。

コード:

using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
	static void Main ()
	{
		MainImpl().Wait();
	}

	static async Task MainImpl()
	{
		using (var client = new HttpClient())
		{
			using (var streamIn = await client.GetStreamAsync("http://www.google.co.jp/"))
			using (var streamOut = File.OpenWrite(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "google.html")))
			{
				await streamIn.CopyToAsync(streamOut);
			}
		}
	}
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#15

投稿記事 by softya(ソフト屋) » 10年前

>そういうことを言っているのではありません、グローバルIPを使わないにしてもサーバーから何らかのデータを取得しないと認証が行えないので・・・
>例えばC++でローカルIPを調べてそのアドレスが1111だったとして、サーバーからデータを取得して1111がそのデータの中にあるかを確認できるようなプログラムを組みたいのです。
>別にグローバルIPにこだわっているわけではありません。

私から見ると正規ユーザーに負担を強いる穴だらけの認証と思えます。
ご本人が問題ないと思っているのなら、これ以上は差し出がましい事言うつもりはありません。

>HttpClient()の使い方についてソースコードなどをみせてもらえるとありがたいです。

グローバルIPの参照はWebClient()で支障がないはずなんです。確認されてますか?
グーグルサイトはそうなるだけです、これはWebClient()はIEのようなものですから、そう言う動作をするだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#16

投稿記事 by splash » 10年前

すいません、いろいろあって返信遅れました。

YuOさんが書いてくれたコードを参考にWEBclientを使いIP認証を入れることができたのですが、やはりみなさんが指摘されていたようにIP認証だと毎日変わる人もいますし、WEBclientでの認証だとセキュリティー面で考えても効率が悪いと思うんですよね・・・
じゃあなんでIP認証に拘ったのか?って言われそうですが一回自分のプログラムの腕を上げるためにもIP認証を作ってみたかったんですよね・・・・

実際にこの認証方法を使って知り合い数人に自分が作ったソフトを配布したりもしてみたました。

これでこのソフトの感想なども聞けて、いよいよまったく知らない他人に有料で販売していこうと思います。

そこでデバッグなどをされても大丈夫なように強力な認証を入れようと思っています。
あまり書くと、このソフトを使った人がこのスレをみて勘付かれるといろいろめんどうなので詳しくは書けませんがユーザー個人のpcを識別する方法はIP認証以外に考えました。
しかし、この方法だけだとサーバーを仲介していないので、遠隔で特定のユーザーに対して認証を停めてソフトを起動できないようにすることができません、なのでこの認証に加えてIDとPWでの認証を入れようと思っています。
*****************************************************************************************************************************************************************************************************************************************************
具体的にはまず、このソフトが実行されたらIDとPWを入力する画面をだしてユーザーがそこにIDとPWを入力するとclientがサーバーと接続してこのIDとPWが登録されているかをチェック
次にclientがこのソフトが実行されたPCのある情報を取得、取得したらさっきのIDとPWの情報から今取得したPCの情報がサーバーに登録してあるものと一致するかをチェックして一致すればそのままチェック処理を終了一致しなければエラーコードが書かれたメッセージボックスをだして強制終了

*****************************************************************************************************************************************************************************************************************************************************
というようなコードを書きたいのですがサーバーのプログラムの知識がないため、どのようにしてIDとPWの認証を入れたらいいのかがわかりません、YuOさんの言っていた鍵交換の方法もあまり理解できていません。
IDとPW認証のソースや参考サイトを教えてくれませんか。
使っている言語はC++です。
レンタルサーバーを持っているので認証のサーバーはそこを使おうと思っています。

↑の認証方法は私の少ない知識のなかで考えついた方法ですので他にもっといい方法があるならそちらを教えていただけると嬉しいです。

ソフト屋(外出中)

Re: IP認証を入れたいのですが・・・

#17

投稿記事 by ソフト屋(外出中) » 10年前

クライアントの耐タンパー性と通信認証の保証問題とサーバー側の認証安全性を混同しているので、やりたい事をするにはものすごく勉強不足だと思います。
あとサーバー側を純粋なC++でSQLやらsocket処理を書くつもりでしょうか?
今可能な知識の範囲でできる事で妥協するか、ものすごく勉強するかどちらかを選ばれたほうが良いと思います。

splash
記事: 16
登録日時: 10年前

Re: IP認証を入れたいのですが・・・

#18

投稿記事 by splash » 10年前

私は、ものすごく勉強する必要があるなら頑張ってしようと思っています、C++だって前はほとんどわからなかったのにだいぶわかるようになってきました。
↑に書いた認証方法をするにはどのような勉強が必要なのですようか?
C++でサーバー側の処理を書くのが難しいのであればほかの言語でも構いません。
なにか参考サイトやなどを教えてもらえませんか?

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: IP認証を入れたいのですが・・・

#19

投稿記事 by taketoshi » 10年前

C++とWinsock(TCP接続)を使ってデータ配信のサーバーを作ったことが有ります。
データ配信サーバにクライアントの権限振り分け機能とクライアントのバージョン識別機能を実装しました。

バージョン違いの場合はソフトウェアを強制終了させるように組んだので
応用すればソフトウェアの起動認証サーバになるでしょう。
私はシステムの都合上パソコンのユーザー名をサーバに送り認証しました。

まず、クライアントとサーバで簡単な通信規約(プロトコル)を決めます。

例えばですが、UserRequestという文字列を「ユーザー認証」と決めましょう。
クライアント起動時にクライアントはサーバに対してUserRequestという文字列を含むヘッダーを送ります。
サーバはそのヘッダーを解析して登録されている情報と照合しクライアントに対してソフトが起動できるかどーかのフラグデータを送ります。
クライアントはその情報を受信してソフトウェアを起動すればよいですしダメならば強制終了するように実装します。

ここでUserRequestという文字列と一緒にクライアントから何を送るかをキーにすればよいと思います。
事前にキーファイルを配布してそれが存在するかどうかのフラグでも良いです。
送付するキーファイルにPWとメールアドレスから生成した暗号でも仕込んでおけば早々破られないのではないでしょうか。
そしてクライアントにもPWとメールアドレスを登録するような仕組みにしておくのです。

私が開発したのは常時接続タイプの1台vs30台位の台数を相手にする小規模サーバーなので大人数を相手にするのは想定してません。
ここから先は不明瞭ですがTCPだと同時接続数の絡みがありますのでUDPとかで実装すればいいのかな?
若しくは認証が終わったら再度クライアントから接続遮断リクエスト等を送りTCP接続を自動切断するようにしないとだめかもしれません。

>C++でサーバー側の処理を書くのが難しいのであればほかの言語でも構いません。
C++ CLRはサッパリ知りませんが、他の言語でも構わないという事ですので、経験談を提示してみました。


私はこの本を読んでサーバを開発しました

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: IP認証を入れたいのですが・・・

#20

投稿記事 by softya(ソフト屋) » 10年前

販売されるのならコストを意識しないと行けませんよ。
たとえば勉強に1年とからかかるなら、コストとしては数百万円(企業ならもっと)の損失が出ます。
その損失に見合うだけの売上があれば良いですが無い場合は、掛けてはいけないコストと言うことになります。
つまり、セキュリティはコストがかかるのでセキュリティの強化にかかるコストと、ゆるいセキュリティで受ける損害を考えながら決定すべき事なのです。
採算度外視!と言うのも splashさんの選択ですので、どちらを選択されても構いません。

ここからはやる前提で書きます。
ちなみにクライアント側でセキュリティをやる過ぎるとウィルス対策ソフトにウィルスと誤認されやすいので、そこは注意してください。
※ そのぐらい怪しいことをしないとプログラムを保護できません。

あと、分かりませんと聞く前に出来るだけご自分で調べてください。
入り口は案内できますが、ここから先はご自分で進むしか無い道なので、ここの掲示板を多分当てに出来ないと思います。
ここで聞いている時点で、セキュリティ情報を漏らしているに等しいですし。
※ 特に耐タンパー性は、資料も少ないですしね。掲示板に書くと効果を失いかねません。

【補足】
ここもタダですし読んだほうが良いかな。
「IPA セキュア・プログラミング講座」
http://www.ipa.go.jp/security/awareness ... index.html
ちなみに私も専門家じゃないので、あてにされるとご期待に添えないと思います。

ここのリンクにある書籍などが入り口としての参考になると思います。
「Secure Programming 関連」
http://mcn.oops.jp/glossary/security/se ... amming.htm
ただし、みんな古いので海外サイトを自分で漁る覚悟は必要です。
何年も掛かると思いますが頑張ってください。

>C++でサーバー側の処理を書くのが難しいのであればほかの言語でも構いません。

レンタルサーバーで利用可能になっている言語など環境を書いて貰わないと答えづらいですが、PHPなどは情報が多いと思います。データベースはMySQLなどでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る