VisualBasic2008Expressでプログラムしています。
ソフトを配布したいのですが、有償にしたいと思います。そこで、WindowsXP以降のように、オンライン・アクティベーションを導入したいと思います。その方法はありますか? また、あるとすれば、どのようにすればよいのでしょうか?
オンライン・アクティベーションに供するためのレンタルサーバは、借りる用意があります。
>その方法はありますか?
あります。
>どのようにすればよいのでしょうか?
代金支払い時に、以下の情報を要求し、認証サーバに登録する。
(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)にあたる情報は要求しないものが多いので、そのあたりのさじ加減も調整する必要があると思います。
自分も有償ではありませんが、特定の人のみに配りたいのでアクティブ化のソフトを作ったことがあります。
簡単な流としては、
となります。
まず、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文は<>ではなく=の方が良いかもしれません、どちらにしろ完全に起動を防げるワケではないのであしからず。
おお、具体的でgoodです。助かります。ありがとうございます。
うおお、複雑ですね。
クラックされないソフトを作ろうと思ったら、VBは不向きで、Cとかのプロが使う言語を使ったほうがよいということでしょうかね。