[VB.NETでオンラインアクティベーション機能をつけるには?]


VisualBasic2008Expressでプログラムしています。

ソフトを配布したいのですが、有償にしたいと思います。そこで、WindowsXP以降のように、オンライン・アクティベーションを導入したいと思います。その方法はありますか? また、あるとすれば、どのようにすればよいのでしょうか?

オンライン・アクティベーションに供するためのレンタルサーバは、借りる用意があります。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/09 05:25:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:HowManyFiles No.1

回答回数24ベストアンサー獲得回数7

ポイント42pt

>その方法はありますか?

あります。

>どのようにすればよいのでしょうか?

代金支払い時に、以下の情報を要求し、認証サーバに登録する。

  (A)ユーザ名(ユーザが入力)

  (B)メールアドレス(ユーザが入力)

  (C)MACアドレスなどの機器に固有の情報(ソフトウェア側で収集)

認証サーバは秘密の関数(D)により(A), (C)のハッシュ(E)を計算し、メールアドレス(B)に送信する。

ユーザはアプリケーションの制限解除メニューで、登録したユーザ名(A)と認証サーバから送信されたハッシュ(E)を入力する。

アプリケーション側には(D)の逆関数(F)を実装しておき、入力された情報(A),(E)から(C)を逆算し、稼働している計算機の(C)と一致するかを確認し、一致すればアクティベーションの成功となる。

アクティベーションが成功した場合、レジストリの適当な場所にアクティベーション済みであることがわかる情報を記録し、起動時にこの値を確認することでアクティベーションが済んでいるかを確認するよう実装する。


概要としては以上のような感じになると思います。

注意しなければならないのが .Net アプリケーションは簡単にリバースエンジニアリングが可能であるという点です。無料で入手できるソフトウェアを利用することによって、ほぼ製作者が書いたとおりのソースを復元できてしまいます。

つまり、秘密の関数(D)の逆関数(F)は、ユーザからそれほど苦労せずに覗かれてしまうということです。なので、コンパイル時に難読化ツールを用いることで、逆コンパイルされてもできるだけ内容が分からないようにしたり、逆関数(F)だけをC/C++などで実装して P/Invoke するなどして、できるだけ解析しづらくしておく必要があります。

また、何らかの理由で認証サーバの秘密の関数(D)が公知の状態となった場合、誰もがハッシュ(E)を算出できるようになるので、認証サーバの運用にも注意する必要があります。

私はアクティベーションを利用した有料ソフトを制作したことはないので、あくまでも「原理的にはこんな具合です」といった程度の情報だと考えてください。実際に運用するとなると、ユーザがPCを買い換えた際に((C)の情報が変わるので)、認証サーバでハッシュを再発行したりする必要がありますし、シェアウェア程度であれば(C)にあたる情報は要求しないものが多いので、そのあたりのさじ加減も調整する必要があると思います。

id:jjkkjpvb2008

うおお、複雑ですね。

クラックされないソフトを作ろうと思ったら、VBは不向きで、Cとかのプロが使う言語を使ったほうがよいということでしょうかね。

2010/02/02 17:54:32
id:toriimiyukki No.2

回答回数12ベストアンサー獲得回数1

ポイント28pt

自分も有償ではありませんが、特定の人のみに配りたいのでアクティブ化のソフトを作ったことがあります。

簡単な流としては、

  1. 支払いを受け、アクティベーションキーを発行する。
  2. ソフトウェアからアクティベーションキーの確認用サーバーにアクティベーションキーをPOSTしてアクセスする。
  3. サーバー側から、結果のみを返す。
  4. 結果によって起動する。

となります。

まず、VBは使えるそうですが、サーバー上で動かすプログラムが必要となります。

Ruby,Perl...といくつかありますが、自分はPHP+MySQLを使いました(PHPが保証が高いわけではない)。

アクティベーションキーの発行は、MySQLでインサートすれば大丈夫です。

PHP+MySQL >>> http://heteml.jp/support/manual/db-php-mysql/


そしてソフトウェア側では、下記のような感じで認証用PHPにPOSTします。

Try
Dim url As String = "http://hoge.com/active.php"
'文字コードを指定する
Dim enc As System.Text.Encoding = _
    System.Text.Encoding.GetEncoding("utf-8")
'POST送信する文字列を作成
Dim postData As String = "activecode=" & ActiveCode
Dim wc As New System.Net.WebClient()
'文字コードを指定する
wc.Encoding = enc
'ヘッダにContent-Typeを加える
wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
'データを送信し、また受信する
Dim resText As String = wc.UploadString(url, postData)
wc.Dispose()
'XMLに渡す
Dim resXmls As Xml.Linq.XDocument
resXmls = XDocument.Parse(resText)
If resXmls...<Result>.<Active> <> 1
	Close()
End If
Catch
	Close()
End Try

Tryは、ネット接続がないと404エラーになったりするので必要。


また、PHP側では下記のように返します。

<?xml version="1.0"?>
<Result>
  <Active>1</Active>
</Result>

VBでのPOST方法 >>> http://dobon.net/vb/dotnet/internet/webrequestpost.html

XMLパース方法 >>> http://dobon.net/vb/dotnet/file/xmlserializer.html

VBのIF文は<>ではなく=の方が良いかもしれません、どちらにしろ完全に起動を防げるワケではないのであしからず。

id:jjkkjpvb2008

おお、具体的でgoodです。助かります。ありがとうございます。

2010/02/03 20:39:13

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません