web-dev-qa-db-ja.com

Webアプリケーションのライセンスキーソリューション、最善のアプローチは何ですか?

上司からの依頼に困りました。私は小規模な新興企業で働いており、かなり大きな会社の保守契約を締結して定額制のWebアプリケーションを開発しました。大企業が請求書を最後の1秒間だけ支払う方法についての恐ろしい話を知っていたので、支払われない場合はソフトウェアが機能しなくなるような方法でこのWebアプリケーションのライセンスを取得できるようにして、自分自身を保護することを決定しました。

これは以前にデスクトップアプリケーションで実行されたことがありますが、これは内部でホストするWebアプリケーションであり、インターネットからアクセスできません。

これを行うための最良の方法は何ですか?フットプリントを小さくして、配布したライセンスキーを更新できるようにしたいと考えています。

誰かが似たようなことをしましたか?私たちは完全に頭から離れていますか?誰かより良い提案がありますか?

14
maple_shaft

このようなものを実装する方法はたくさんありますが、ここではそれほど難しくない方法を紹介します。

ブラックリストに登録されたライセンスキーのハッシュを含むファイルをホストする、どこかで公開されているWebサイトが必要です。このファイルをどのように管理するかはあなた次第ですが、ファイル自体に必要なのは1行あたりのハッシュだけです。

次に、ソフトウェアは定期的にこのファイルのダウンロードを開始し(ほとんどのサーバー側の言語がこれに対応しています)、インストールされているライセンスキーのハッシュを検索します。見つかった場合、アプリケーションはブラックリストが削除されるまでアプリケーションが停止することを認識しています。

これには、MD5または類似のものとシークレットで十分です。より洗練されて、アプリケーションにリクエストをサイトに送信させ、その場でデータベースで検索することもできますが、ファイル(私が想定しているものの場合、短いリストであることが望ましい)は小さいままであり、最も簡単な方法。

さらに難しいのは、アプリケーションを停止状態に保つことです。結局のところ、これを内部のどこかに保存する必要があります。つまり、過度に明白である場合は簡単に破壊される可能性があり、過度に明白でない場合でも、適切なテーブルを復元することで簡単に元に戻すことができます/ファイル。したがって、私は2番目の保護方法も提案します。

このメソッドは、「LIVE」または「DEAD」(または十分に類似した何か)をテーブルまたはファイルに格納しますが、再びハッシュされます。これは、ソルトとタイムスタンプでハッシュする必要があります。アプリケーションのページが実行されるたびに、ハッシュ値の「LIVE」+ salt + timestampでこの値を確認し、有効なタイムスタンプの範囲(たとえば、1日、2日、1週間、1か月など)を許可します。範囲が大きいほど、パフォーマンスが低下することに注意してください。物事が一致する(または一致が見つかる)限り、アプリは生きています。そうでない場合、特殊ファイルまたはテーブルの値が「LIVE」であっても、タイムスタンプがしきい値の範囲外になるため、バックアップから復元しようとすると、その値は引き続き無効になります。

要約すると(これは、何らかのチェックサムやその他の方法など、ライセンスキーのvalidityをチェックするプログラム的な方法があることを前提としています)。

  • CheckBlacklist
    • ライセンスキーをソルトでハッシュに変換する
    • サーバーからブラックリストファイルをリクエストする
    • 私のハッシュはファイルにありますか?
    • YESの場合、 "DEAD" + salt +タイムスタンプのハッシュを格納します(日に切り捨てられます。時間+日+分を格納する必要はありません)。
    • NOの場合、「LIVE」+ソルト+タイムスタンプのハッシュを格納(切り捨て)
  • IsKeyAlive
    • "LIVE" + salt +切り捨てられたタイムスタンプからハッシュを作成します
    • DeadAliveハッシュの読み込み
    • 彼らは同意しますか?
    • はいの場合、私たちは生きています。 TRUEを返します。
    • いいえの場合は、おそらく死んでいますが、タイムスタンプウィンドウ内にいる可能性があります:
      • タイムスタンプから1日を引き、ハッシュを繰り返します。
      • 今同意しますか?
      • はい? TRUEを返す
      • タイムスタンプに日を追加してハッシュを繰り返す
      • 今同意しますか?
      • はい? TRUEを返す
    • この時点で、タイムスタンプの範囲外になり、一致しません。 FALSEを返します。 (キルアプリ)

さて、善はこれが失敗する可能性がある100万と1つの方法があることを知っています。考えられるすべての方法を検討し、信頼できるシステムを構築します(ブラックリストファイルをダウンロードできない場合にクライアントが正しいと想定する方法を含む)。テスト、テスト、テストを行い、展開する前にさらにテストを行います。問題が発生すると、クライアントの信頼が失われるためです。

9
Kerri Shotts

他の答えはすでに技術面をカバーするのに良い仕事をしています。ただし、法的な側面も考慮してください。

彼らが支払わない場合、あなたは彼らのアプリをブロックする権利さえありますか?契約でこれについて前もって言及しなかった場合、たとえ支払いが失効したとしても、あなたはそれをする権利を持たないかもしれません(あなたが必ずしもあなたが売ったものを取り戻す権利がないというように)。また、多くの国には「コンピュータプログラムの操作」を禁止する特別な法律があります。あなたが行うことがそうであると見なされ、刑事責任にさらされる可能性さえあります。

ですから、まずは弁護士に相談して、お湯に浸からないようにしてください。

結局、法制度だけに頼るほうがいいかもしれません。彼らが支払わない場合は交渉し、それでも問題が解決しない場合は訴訟を起こしてください。多くの国では、契約状況が明確であれば、訴訟は比較的簡単で安価です(たとえば、ドイツでは Mahnbescheid を20ユーロ未満で取得できます)。

4
sleske

それらが内部でホストしている場合、これはあなたが出荷する可能性のある他のソフトウェアとどう違うのですか?たとえば、デスクトップの在庫表示アプリケーションを出荷する場合にどうするかを考えて、それを実行します。

2
David Thornley

システムが内部でホストされている場合、リモートサーバーとの通信を含む上記のソリューションの多くは機能しない可能性があります。

代わりに、有効期限が含まれているプロジェクト内にライセンスファイルを含めないでください。システムクロックが有効期限を超えると、システムは機能しなくなります。ファイルを保護するには、内容を暗号化して改ざんを防止します。ユーザーが支払いを行うか、1年間更新すると、新しいライセンスファイルが送信されます。

PHPを使用している場合は、ユーザーがコードをすぐに編集できるので、どのようなセキュリティを設定しても、ユーザーは簡単にアクセスしてコードを削除できます。 ASP.NETまたはその他のコンパイル済み言語を使用している場合、コードは変更できないため、これは問題にはなりません。

1
Gavin Coates

(開示-私は ライセンスマネージャー システムのプロバイダーであるAgilis Softwareで働いています)。

最も効果的な解決策は、ライセンスリースで自動化された 製品のアクティベーション を使用することです。箱から出してこれはあなたがすることを可能にします:

  • 顧客のライセンスを自動的にアクティブ化します。アクティベーション時に、各インスタンスはターゲットシステムの選択したパラメーターに自動的にロックされ、それらに設定したライセンス制限がアプリケーションに適用されます(機能の構成、トライアル全体またはサブスクリプションの時間制限の設定など)。
  • 「リース間隔」を設定します。これは、1つのアクティブ化イベントの最大有効期間です。信用が疑われる顧客の場合、これをたとえば2週間に設定できます。これは、2週間ごとに、アプリがバックグラウンドで自動的に「電話をかけ」、ライセンスを再検証することを意味します。彼らが支払いに間に合わない場合は、ホストされているサーバーでそれらのライセンスを無効にすることができ、次の電話ホームでの実行が停止します。
  • ターゲットシステムからのネットワーク接続がない場合は、任意のWeb端末で暗号化されたファイルを交換することにより、ユーザーによるセルフサービスのアクティベーションプロセスが行われます。ユーザーがこの位置にいる場合は、リース期間を長くして、ユーザーの不便さと支払いを受ける必要性のバランスをとることができます。彼らが支払うと、あなたはあなたが好きなだけ長く、永久にリース期間を作ることができます。
1
Dominic

システムによって異なります。 Magnetoのような既存のフレームワークを拡張したり、アプリケーション全体をゼロから作成したりしましたか?後者の場合、ライセンス要件を組み込むことはそれほど難しくありません。アプリケーションを短期間ライセンスで提供するだけで、請求後45日で期限が切れ、後で永久ライセンスが付与されます。

これは、ソースもめくっていないことを前提としています。 :)

1