キーまたはライセンスを持つマシンでのみ実行されるデスクトップ アプリケーションを作成したいと考えています。これはどのように達成できますか?
3 に答える
これはあなたがそれをどれだけ安全にしたいかに完全に依存します...
Javaの問題は、Javaを逆コンパイルできることです。したがって、誰かが望むなら、彼らはあなたのソフトウェアをダウンロードし、それを逆コンパイルし、そしてあなたが設定したセキュリティを削除することができます(そして彼らが望むならそれを再配布します)。
これは、マスマーケットに行って販売することを計画している場合にのみ問題になりますが、実際には著作権侵害が問題になります。
これについて心配していない場合は、オンラインまたはオフラインのチェックに行くことができます。
私が働いている会社はオンライン方式を使用しています。いくつかの手順があります。
編集:古い方法はメンテナンスの悪夢だったので、私はこれがどのように機能するかを変更しました。
- ライセンスファイル
- (これには実際に必要なものを含めることができます。ユーザーごとに一意である必要があります。ほとんどの人は通常、一般的な服装を使用します。
name
company
email
- そして
key
。つまり、JDU8-AJS9-88DF-SASF-ASF9
よく目にするようなものです。
- プログラムは、ライセンスファイルからハッシュを生成します。
- ライセンスファイルのすべてのデータを文字列に入れます
- 文字列をハッシュ関数に渡すと、このページでその方法を説明できます。
- プログラムをオンラインで(サーバー上で)チェックします。データはHTMLリクエスト(post / get / json /必要なもの)にエンコードされ、ライセンス検証ページに送信されます。ライセンス検証ページはデータを検証します。データにはランダムに生成された文字列が含まれ、検証ページで別のパスワードを生成するために使用されます。次に、これはプログラムに返されます。プログラムは、ランダムな文字列を使用して独自のパスワードを生成します。2つが一致すると、プログラムが起動します。
キーを生成するには、同じハッシュ関数を使用してから、ハッシュをサーバーにアップロードします。
オフラインにしたい場合は、私が推測するコードにハッシュを含めて、そこでチェックすることができます。
ただし、私は決してセキュリティの専門家ではなく、博士号の一部として会社のために開発しているだけであることを指摘しておく必要があります。これが私がやった方法です。
編集:この画像は役立つかもしれません:
2番目の編集:
プロセスに「オフライン検証」を含めました。これは実際にはオフライン検証ではなく、ユーザーをプロキシとして使用するだけです。ユーザーは別の方法でインターネットにアクセスする必要があります。
それはこのように動作します:
- インターネット接続が見つかりません:ユーザーに4桁のコードを提供します
- ユーザーはオフライン確認ページに移動します(モバイルでの使用にも最適化されています)
- ユーザーはドロップダウンリストから使用するソフトウェアを選択します
- ユーザーがユーザー名を入力します(このフィールドはエントリを記憶します)
- ユーザーはプログラムが提供したコードを入力して送信します
- ウェブページは4桁のコードを提供し、それをプログラムに入力すると起動します。
- プログラムはライセンスファイルにいくつかの特別なデータを追加します。これは、このプロセスを次の週/月/ただし長い間繰り返す必要がないことを意味します。
プログラムがオンラインで正常に検証されるたびに、ライセンスファイルにオフラインアクセスパスワードも追加されます。これは、一時的なインターネットのダウンタイムに対して堅牢であり、インターネットが1週間/月/どのくらいの時間ダウンした場合にのみ機能を停止します。のために働くように設定します。
オンラインでmacIPを使用してマシンのライセンスを追跡できます。Windowsでもレジストリに書き込むことができますが、APIはありませんが、それでも実行できます。レジストリを読むために以下のスニペットを見つけてください-
public static final String readRegistry(String location, String key){
try {
// Run reg query, then read output with StreamReader (internal class)
Process process = Runtime.getRuntime().exec("reg query " +
'"'+ location + "\" /v " + key);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String output = reader.getResult();
// Output has the following format:
// \n<Version information>\n\n<key>\t<registry type>\t<value>
if( ! output.contains("\t")){
return null;
}
// Parse out the value
String[] parsed = output.split("\t");
return parsed[parsed.length-1];
}
catch (Exception e) {
return null;
}
}
また、難読化する場合は、クラスレベルでproGuardを使用してください。
それはあなたが持つことを計画している顧客の数と配布モードにも依存します。ライセンスサーバーを使用できますが、これには顧客のインターネット接続が必要です。USBドングルを使用してライセンスを管理することもできます。
シンプルさ、労力、価格の間で妥協するために必要な完璧なシステムはありません。