Генерация серийного номера для активации продукта

Прежде всего, это не вопрос генерации серийного номера для других продуктов. Я не собираюсь "взламывать" другие продукты.

Вот мои требования:

  • Я хотел бы создать серийный номер стандартного вида: AILU7-ABCDE-54321-1234-AFCK-17UDF
  • Мне нужен какой-то процесс, который проверяет, является ли этот серийный номер "действительным" - эта часть не должна быть чрезвычайно сложной. т. е. если бы все числа суммировались до значения больше X - я бы с этим согласился, но если бы существовали решения, которые справились бы с этой сложностью для меня, я был бы рад их использовать.
  • Процесс, который проверяет серийный номер, не может быть на стороне сервера. т.е. я не могу сделать запрос на внешний веб-сервер, чтобы проверить, что серийный номер действителен.
  • Мне нужен какой-то способ вытащить метаданные из серийного номера. то есть после того, как я проверил, что серийный номер правильный, мне нужно иметь возможность считывать из него некоторые значения: "ограничение пользователя", "срок действия" и т. д.
  • Проверка серийного номера будет осуществляться с помощью приложения ASP.NET MVC 3. Генерация серийного номера не должна быть выполнена таким образом.

Я не ищу серебряную пулю, которая будет выполнять все эти требования, но более или менее некоторые ссылки на документацию или существующие библиотеки, которые помогут мне начать работу. Единственная библиотека, которую я видел, - это библиотека XHEO DeployLX; что слишком много для моих нужд.

Не могли бы вы предоставить мне любую информацию, которая могла бы указать мне правильное направление?

3 ответа

Решение

Вы проверили статью Брэндона Оленя по этому вопросу?

В Delphi, но теория держит любой язык.

Существует множество библиотек, одна из которых может быть http://skgl.codeplex.com/ & http://softwareprotector.codeplex.com/ и также поставляется с пакетом nuget.

С серийными ключами нужно учитывать несколько вещей.

Я видел ссылки во время моих поисков, которые указывают на использование простого Guid.NewGuid(); подход, а затем сделать некоторые преобразования в строке, чтобы сделать пользовательский стиль серийного ключа. Это легко сделать, но на вас, владельца продукта, возлагается обязанность отслеживать серийные ключи в базе данных, и в конце концов кто-то может случайно найти серийные номера, которые работают с помощью Guid.NewGuid(); самих себя. Если все на планете начали генерировать Guids одновременно, шансы столкновения становятся очень вероятными.

Существует своего рода решение, которое уменьшает вероятность столкновения, используя более сложный алгоритм поверх Guid.NewGuid();

Для этого я склонен использовать:

  1. Guid.NewGuid(); (Только первые 16 символов, минус символ - (дефис)
  2. Постоянно увеличивающееся или изменяющееся значение. (Nonce) (int будет работать: i++ и т. Д.)
  3. Секретная соль, которую вы будете хранить в безопасности в своей сети.
  4. Фактор сложности: заимствование этого принципа у биткойнов.

Хорошо, давайте представим, что я беру первые 16 цифр из руководства. Затем я объединяю это с Nonce и секретной солью, а затем использую SHA256, чтобы получить хеш из значений. Затем я могу использовать коэффициент сложности, чтобы определить, начинается ли хэш с числа 0 или другого желаемого символа.

Например: если у хеша есть шесть нулей с префиксом, я сохраняю все данные, так как я только что нашел достаточно безопасный серийный ключ.

Когда я имею в виду безопасность, я имею в виду, что я нашел серийный номер, который в сочетании с ключом продукта (Nonce), а затем используется с секретной солью, приводит к хэшу, который соответствует моим производственным критериям.

Ниже приведен пример кода - сделано очень грубо, потому что мне было скучно.

Идея заключается в том, что ваше приложение может отправить ключ продукта и серийный номер на сервер активации. Сервер знает секретную соль. Затем он возвращает истину или ложь, чтобы определить, соответствует ли сгенерированный хэш требованию безопасности. Если это не так: серийный номер недействителен или недействителен для предоставленного ключа. Если он имеет требуемые 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 к префиксу. Это означает, что поиск серийных комбинаций займет больше времени, но также сделает его более безопасным.

Очевидно, вы бы где-то хранили эти комбинации данных, поэтому во время активации вы можете сравнить серийный код и ключ продукта (Nonce).

В моем примере: я использую Serial Key (16 цифр), Incrementint и слово Alpha для секретной соли.

Это делает генерацию последовательных ключей медленной и интенсивной, но делает проверку их очень быстрой.

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;
        }

Секретная Соль может быть кодовой фразой, которая отображает различные продукты, которые вы, возможно, разрабатываете. Это позволяет повторно использовать значения ключей продукта (Nonce) для нескольких линий продуктов.

Другие вопросы по тегам