7

何よりもまず、これは他の製品のシリアル番号を生成することについての問題ではありません。私は他の製品を「ハッキング」するつもりはありません。

これが私の要件です:

  • 標準のシリアル番号を生成したい:AILU7-ABCDE-54321-1234-AFCK-17UDF
  • そのシリアル番号が「有効」であるかどうかを検証するプロセスが必要です。この部分は、極端に複雑である必要はありません。つまり、すべての数値の合計がXより大きい値になった場合、それで問題ありませんが、この複雑さを処理するソリューションがあれば、喜んで使用します。
  • シリアル番号を検証するプロセスをサーバー側にすることはできません。つまり、シリアル番号が有効であることを確認するために外部Webサーバーにリクエストを送信できません。
  • シリアル番号からメタデータを引き出す方法が必要です。つまり、シリアル番号が正しいことを確認した後、シリアル番号からいくつかの値を読み取ることができる必要があります:「ユーザー制限」、「有効期限」など...
  • シリアル番号の検証は、ASP.NETMVC3アプリケーションを介して行われます。ただし、シリアル番号の生成はそのように行う必要はありません。

私はこれらすべての要件を達成する特効薬を探していませんが、多かれ少なかれ、私が始めるのに役立つドキュメントまたは既存のライブラリへのいくつかのリンクを探しています。私が見た唯一のライブラリはXHEODeployLXライブラリです。これは私のニーズには完全に多すぎます。

私を正しい方向に導くことができる情報を教えてください。

4

3 に答える 3

5

この問題に関するBrandonStaggsの記事をチェックしましたか?

Delphiでは、しかし理論はどんな言語でも保持します。

于 2012-12-12T16:17:11.543 に答える
4

そこにはたくさんのライブラリがあり、そのうちの1つはhttp://skgl.codeplex.com/http://softwareprotector.codeplex.com/で、nugetパッケージも付属しています。

于 2012-12-12T16:22:17.590 に答える
0

シリアルキーでは、いくつかのことを考慮する必要があります。

ハント中に、単純なGuid.NewGuid()を使用することを示すリンクを確認しました。アプローチしてから、文字列に対していくつかの変換を実行して、カスタムスタイルのシリアルキーを作成します。これは簡単に実行できますが、データベース内のシリアルキーを追跡する責任はプロダクトオーナーにあり、1日の終わりに、誰かがGuid.NewGuid()を使用して機能するシリアルをランダムに見つける可能性があります。彼ら自身。地球上のすべての人が同時にGuidを生成し始めた場合、衝突の可能性が非常に高くなります。

Guid.NewGuid()に加えて、より複雑なアルゴリズムを使用することで、衝突イベントの可能性を低くする一種のソリューションがあります。

このために、私は使用する傾向があります:

  1. Guid.NewGuid(); (最初の16文字のみ、-(ハイフン)を差し引いたもの)
  2. 常に増加または変化する値。(ノンス)(intは機能します:i ++など)
  3. ネットワーク内でプライベートで安全に保つ秘密の塩。
  4. 難しさの要因:ビットコインからこの原則を借りています。

OK、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、およびシークレットソルトにAlphaという単語を使用しています。

これにより、シリアルキーの生成が遅くなり、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;
        }

秘密のSaltは、開発している可能性のあるさまざまな製品にマップするコードフレーズである可能性があります。これにより、複数の製品ラインでプロダクトキー(ノンス)の値を再利用できます。

于 2016-01-27T11:04:32.240 に答える