Реализация генерации и валидации лицензионных ключей на сайте

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация генерации и валидации лицензионных ключей на сайте
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Реализация генерации и валидации лицензионных ключей на сайте

Лицензионный ключ — это строка, которая кодирует права: какой продукт, какой план, дата истечения. Валидация должна работать как онлайн (API), так и оффлайн (криптографическая проверка подписи).

Форматы ключей

Простой случайный ключ: A3K7M-XQ2WP-N8VLR-5HZTB-J4YCS

Хранит только уникальность. Все данные о лицензии — в базе сервера. Онлайн-валидация обязательна.

Ключ с данными (Partial Key Verification): Часть ключа кодирует атрибуты лицензии. Позволяет частичную оффлайн-валидацию.

JWT-токен: eyJhbGciOiJSUzI1NiJ9... — полноценный токен с полезной нагрузкой и RSA-подписью.

Генерация JWT-лицензий

Асимметричная RSA-подпись позволяет клиентскому приложению проверить лицензию без обращения к серверу, используя только публичный ключ:

use Firebase\JWT\JWT;

class LicenseTokenService
{
    public function issue(License $license): string
    {
        $privateKey = file_get_contents(storage_path('keys/license_private.pem'));

        return JWT::encode([
            'iss'        => 'example.com',
            'iat'        => now()->timestamp,
            'exp'        => $license->expires_at?->timestamp ?? 9999999999,
            'license_id' => $license->id,
            'product'    => $license->product_code,
            'plan'       => $license->plan,
            'seats'      => $license->max_seats,
            'features'   => $license->features,
        ], $privateKey, 'RS256');
    }

    public function verify(string $token): array
    {
        $publicKey = file_get_contents(storage_path('keys/license_public.pem'));
        $payload   = JWT::decode($token, new Key($publicKey, 'RS256'));
        return (array) $payload;
    }
}

Валидация в приложении (оффлайн)

// C# пример для desktop-приложения
public class LicenseChecker
{
    private readonly string publicKey = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQEAr...
-----END PUBLIC KEY-----";

    public LicenseResult Validate(string token)
    {
        var handler   = new JwtSecurityTokenHandler();
        var validation = new TokenValidationParameters
        {
            ValidateIssuer           = true,
            ValidIssuer              = "example.com",
            ValidateIssuerSigningKey = true,
            IssuerSigningKey         = GetPublicKey(),
            ValidateLifetime         = true,
        };

        try
        {
            var principal = handler.ValidateToken(token, validation, out _);
            return new LicenseResult { IsValid = true, Plan = GetClaim(principal, "plan") };
        }
        catch (SecurityTokenExpiredException)
        {
            return new LicenseResult { IsValid = false, Error = "License expired" };
        }
    }
}

API для валидации

Route::post('/api/v1/licenses/validate', function (Request $request) {
    $key = $request->input('key');

    $license = License::where('key', $key)->first();

    if (!$license) {
        return response()->json(['valid' => false, 'error' => 'Invalid key'], 404);
    }

    $checks = [
        'active'     => $license->status === 'active',
        'not_expired'=> !$license->expires_at || now()->isBefore($license->expires_at),
        'seats_ok'   => $license->activations()->where('revoked', false)->count() < $license->max_activations,
    ];

    $valid = !in_array(false, $checks);

    return response()->json([
        'valid'      => $valid,
        'product'    => $license->product_code,
        'plan'       => $license->plan,
        'expires_at' => $license->expires_at,
        'errors'     => array_keys(array_filter($checks, fn($v) => !$v)),
    ]);
});

Сроки

Генерация и валидация лицензионных ключей с JWT и API: 4–6 рабочих дней.