プログラムをロックして試用モードにできるシステムを作成するためのガイダンスを探しています。ガイダンスが必要な部分は、キーを作成/チェックするアルゴリズムです。どうあるべきかについて何か提案はありますか? 私はc#を使用しています。
3 に答える
基本的に - ソフトウェアが他人のコンピュータにあると、彼らは好きなだけソフトウェアを変更することができ、分解を証明し、法的罰則を適用する法的措置を除いて、ソフトウェアを止めることはできません.
機能を本当に保護したい場合は、安全な機能をオンラインに保ち、Web サービスを介して呼び出します。そうすれば、彼らはあなたの Web サービスを使用するために支払いを強いられます。ただし、シリアルキーを生成する方法を見つけたい場合。以下は、「難しい」シリアルキーを生成する方法を説明した投稿です。これは、作成に時間がかかりますが、検証には少し時間がかかります。この種のアルゴリズムを使用すると、データベースでシリアルキーを事前に生成してから、顧客に配布できます。唯一の問題は、繰り返しになりますが、誰かがアプリケーションを分解して、コードのライセンス部分を削除する可能性があることです。代わりに、ソフトウェアをダウンロードし、すべての更新をダウンロードするために、ユーザーが有効なシリアル キーを持っている必要があるようにします。これにより、合法的かつ正当な顧客になるインセンティブが提供されます。したがって、これらのシリアルを使用する方法の例は次のようになります: 以下のコードで 100 個のシリアルの組み合わせを生成します。それらを保存してから、顧客に販売します。シリアル コード、プロダクト キー (番号) を伝えます。
次に、アクティベーションに関しては、それをあなたのウェブサイトに入力すると、ウェブサイトからソフトウェアが送信されます。
あなたの Web サイトは、シリアル キー (入力したプロダクト キー) を取得し、それをソフトウェアの秘密のコード フレーズと組み合わせます。(以下の例ではアルファ) 3 つの部分が結合されて適切な強度/難易度の SHA256 ハッシュが生成される場合、登録が成功したと見なされます。さらに、ユーザーのデータベースと照合して、そのシリアルが関連する顧客と一致するかどうかを確認できます。本当に安全にしたい場合は、製品のバイナリをダウンロードし、シリアル キーの検証に成功した後に Assembly.Load を介してそれらをロードするランチャー アプリケーションを作成できます。とにかく - 再投稿が始まります。
再投稿:
シリアル キーでは、いくつかのことを考慮する必要があります。
単純な Guid.NewGuid(); の使用を指しているリンクを見たことがあります。アプローチし、文字列に対していくつかの変換を行って、カスタム スタイルのシリアル キーを作成します。これは簡単に行うことができますが、製品所有者はデータベース内のシリアル キーを追跡する責任があり、最終的に誰かが Guid.NewGuid(); を使用して機能するシリアル キーをランダムに見つける可能性があります。彼ら自身。地球上の全員が同時に Guid の生成を開始した場合、衝突の可能性が非常に高くなります。
Guid.NewGuid(); の上でより複雑なアルゴリズムを使用することにより、衝突イベントの可能性を低くする一種の解決策があります。
このために、私は以下を使用する傾向があります。
- Guid.NewGuid(); (最初の 16 文字のみ、- (ハイフン) を除く)
- 常に増加または変化する値。(ノンス) (int が機能します: i++ など)
- ネットワーク内でプライベートかつ安全に保つ秘密のソルト。
- 難しさの要因 : この原則をビットコインから借用する.
わかりました、GUID から最初の 16 桁を取得していると想像してみましょう。次に、それをノンスと秘密のソルトと組み合わせ、SHA256 を使用して値からハッシュを導き出します。次に、難易度係数を使用して、ハッシュが必要な量の 0 またはその他の文字で始まるかどうかを判断できます。
例: ハッシュの先頭に 6 つの 0 がある場合、適切に安全なシリアル キーを見つけたので、すべてのデータを保存します。
安全を意味する場合、シリアルを見つけたことを意味します。これは、プロダクト キー (ナンス) と組み合わせて秘密のソルトと組み合わせて使用すると、生成基準を満たすハッシュになります。
いくつかのサンプル コードを以下に示します - 私は退屈だったので、非常に大雑把に作成しました。
これは、アプリケーションがプロダクト キーとシリアル番号をアクティベーション サーバーに送信できるという考え方です。サーバーは秘密のソルトを知っています。次に、true または false を返して、生成されたハッシュがセキュリティ要件を満たしているかどうかを判断します。そうでない場合: シリアルが無効であるか、提供されたキーに対して有効ではありません。必要な 0 がある場合: 有効なシリアルです。
Guid theGuid;
string Hash = "";
int iAccess = 0;
string PrivateSalt = "Alpha";
string SourceString = "";
string guidString;
while (true)
{
theGuid = Guid.NewGuid();
guidString = theGuid.ToString().Replace("-", "").Substring(0,16);
SourceString = guidString + "|" + iAccess.ToString() + "|" + PrivateSalt;
byte[] data = Encoding.Default.GetBytes(SourceString);
Hash = Crypto.GenerateSHA256(data);
if (Hash.StartsWith(GetDiff()))
{
break;
}
iAccess++;
}
Console.WriteLine(SourceString+" Gives hash "+Hash);
string s1, s2, s3, s4;
s1 = guidString.Substring(0, 4);
s2 = guidString.Substring(4, 4);
s3 = guidString.Substring(8, 4);
s4 = guidString.Substring(12, 4);
string serial = s1 + "-" + s2 + "-" + s3 + "-" + s4;
Console.WriteLine(serial + " :" + SourceString + " Gives hash " + Hash);
GetDiff() は基本的に単なる文字列です: "000000";
このメソッドの出力例は次のようになります。
d9c9-f6f0-45be-427a :d9c9f6f045be427a|15135|Alpha Gives hash 000000f718f69c8389d496e01d1e992946fe1b8cf72bc4200a7a2b800b40aa0a
fe49-70b9-08d8-40df :fe4970b908d840df|9096414|Alpha Gives hash 000000e29cfccfb54d1e7edc816feb084f1a2cd11a20c3132a965f9048fc9bf4
7f58-0636-c853-4f0a :7f580636c8534f0a|12297217|Alpha Gives hash 0000007bb44f39a964bbe985885451c3dc0e037fcd12951261404e48819bf89b
6f65-82d3-d95b-4882 :6f6582d3d95b4882|15064854|Alpha Gives hash 000000f1a3bed79e441108cfd26d8733d3fc10f5cd66d234ed35fe2b769663a3
edee-b8b7-9f6f-40ab :edeeb8b79f6f40ab|17782415|Alpha Gives hash 000000b70b96e7b008a96a860efc572fe868154ae81e67b9397249a51f2db71c
0948-4bb3-7de4-4054 :09484bb37de44054|21105690|Alpha Gives hash 000000ec7317eccd5fd9bb701759a2b0e77d37099347d9d665f4b492a69ca3ec
bbf5-5119-bf4e-463c :bbf55119bf4e463c|21715642|Alpha Gives hash 000000a134c886d01606da83cd5e8f672fddb6aa061968e9f08202c781514b16
80f6-c9c5-0ddf-436d :80f6c9c50ddf436d|26450310|Alpha Gives hash 00000092305b2956381c23dacba5b8ff9a37ab994148b37677732dc2a0650386
0a4f-143b-b5f5-48ca :0a4f143bb5f548ca|33691865|Alpha Gives hash 00000054ecdae57c6ec686b6084faf68ae49a78f7c07bbe8e51357d76de63870
プレフィックスに 0 を追加すると、難易度を上げることができます。これは、シリアルの組み合わせを見つけるのに時間がかかることを意味しますが、より安全になります。
明らかに、これらのデータの組み合わせをどこかに保存して、アクティベーション中にシリアル コードとプロダクト キー (ノンス) を比較できます。
私の例では、シリアル キー (16 桁)、インクリメント int、および秘密のソルトにアルファという単語を使用しています。
これにより、シリアルキーの生成が遅くなり、CPU を集中的に使用しますが、検証は非常に高速になります。
IsSerialValid("edee-b8b7-9f6f-40ab", 17782415);
public bool IsSerialValid(string serialCode, int ProductCode)
{
string SourceString = serialCode.Replace("-", "") + "|" + ProductCode.ToString() + "|" + "Alpha";
byte[] data = Encoding.Default.GetBytes(SourceString);
string Hash = Crypto.GenerateSHA256(data);
if (Hash.StartsWith(GetDiff()))
{
return true;
}
return false;
}
秘密のソルトは、開発中のさまざまな製品に対応するコード フレーズである可能性があります。これにより、複数の製品ラインでプロダクト キー (ノンス) の値を再利用できます。
最善の方法は、実際にハードコーディングされた独自のソケット プロトコルを実装することです。そのため、ハッカーはそれをデコードできず、常に変更する必要があります。また、ライセンスを確認するには、ソケット サーバーに連絡するだけでよく、ソケット サーバーはデータベースに連絡して、キーが有効かどうかを確認できます。
これは私がそれを行う方法であり、ちょっと簡単に実装できます
dotPeek、JustDecompile、.NET Reflectorなど、アプリケーションをソース コードに簡単に逆アセンブルできるツールがあることを忘れています。あなたの保護は簡単に取り除かれます。SO には、難読化やシリアル番号などを扱う類似のスレッドが多数あります。コードの難読化に関する 2 つのリンクを次に示します。
https://stackoverflow.com/questions/1988451/net-難読化
正直なところ、保護に多くの時間を費やすことになり、時間の無駄になる可能性があります。これは残念ですが現実です。