web-dev-qa-db-ja.com

保護Javaライセンスまたはキーによるアプリケーション

キーまたはライセンスを持つマシンでのみ実行されるデスクトップアプリケーションを作成したいと思います。これはどのように達成できますか?

10
Ahmed Aswani

これはあなたがそれをどれだけ安全にしたいかに完全に依存します...

Javaの問題は、逆コンパイルできることです。したがって、誰かが望む場合は、ソフトウェアをダウンロードして逆コンパイルしてから、設定したセキュリティをすべて削除することができます(その後必要に応じて再配布してください)。

これは、マスマーケットに行って販売することを計画している場合にのみ問題になりますが、実際には著作権侵害が問題になります。

これについて心配していない場合は、オンラインまたはオフラインで確認できます。

私が働いている会社はオンライン方式を使用しています。いくつかの手順があります。

編集:古い方法はメンテナンスの悪夢だったので、私はこれがどのように機能するかを変更しました。

  1. ライセンスファイル
    • (これには実際に必要なものを含めることができます。ユーザーごとに一意である必要があります。ほとんどの人は通常、一般的な服装を使用します。
    • name
    • company
    • email
    • 次にkey。つまり、JDU8-AJS9-88DF-SASF-ASF9よく見かけるようなもの。
  2. プログラムはライセンスファイルからハッシュを生成します。
    1. ライセンスファイルのすべてのデータを文字列に入れます
    2. 文字列をハッシュ関数に渡す このページ 方法を示すことができます。
  3. プログラムをオンラインで(サーバー上で)チェックします。データはHTMLリクエスト(post/get/json /必要なもの)にエンコードされ、ライセンス検証ページに送信されます。ライセンス検証ページはデータを検証します。データにはランダムに生成された文字列が含まれています。この文字列は、確認ページで別のパスワードを生成するために使用されます。次に、これはプログラムに返されます。プログラムは、ランダムな文字列を使用して独自のパスワードを生成しました。 2つが一致すると、プログラムが起動します。

キーを生成するには、同じハッシュ関数を使用してから、ハッシュをサーバーにアップロードします。

オフラインにしたい場合は、私が推測するコードにハッシュを含めて、そこでチェックすることができます。

ただし、私は決してセキュリティの専門家ではなく、博士号の一部として会社のために開発しているだけであることを指摘しておく必要があります。これが私がやった方法です。

編集:この画像は役立つかもしれません:

enter image description here

2番目の編集:

プロセスに「オフライン検証」を含めました。これは実際にはオフライン検証ではなく、ユーザーをプロキシとして使用するだけです。ユーザーは別の方法でインターネットにアクセスする必要があります。

それはこのように動作します:

  1. インターネット接続が見つかりません:ユーザーに4桁のコードを提供します
  2. ユーザーはオフライン確認ページに移動します(モバイルでの使用にも最適化されています)
  3. ユーザーはドロップダウンリストから使用するソフトウェアを選択します
  4. ユーザーがユーザー名を入力します(このフィールドはエントリを記憶します)
  5. ユーザーは、プログラムが提供したコードを入力して送信します
  6. ウェブページは4桁のコードを提供し、それをプログラムに入力すると開始されます。
  7. プログラムは、ライセンスファイルにいくつかの特別なデータを追加します。これは、このプロセスを次の週/月/ただし長い間繰り返す必要がないことを意味します。

プログラムがオンラインで正常に検証されるたびに、ライセンスファイルにオフラインアクセスパスワードも追加されます。これは、一時的なインターネットのダウンタイムに対して堅牢であり、インターネットが1週間/月/どのくらいの時間ダウンした場合にのみ機能を停止します。のために働くように設定します。

24
will

オンラインで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ドングルを使用してライセンスを管理することもできます。

シンプルさ、労力、価格の間で妥協するために必要な完璧なシステムはありません。

0
jocelyn