Эффективный метод для шифрования файла лицензии?

22
задан Robert Harvey 7 May 2013 в 16:29
поделиться

9 ответов

Это кажется, что Вы хотите использовать Общедоступную/Частную криптографию для подписания маркера лицензии (фрагмент XML или файл, например), таким образом, можно обнаружить вмешательство. Самый простой способ обработать его состоит в том, чтобы сделать следующие шаги:

1) Генерируют пару ключей для Вашей компании. Можно сделать это в командной строке Visual Studio с помощью инструмента SN. Синтаксис:

sn -k c:\keypair.snk

2) Использование пара ключей для сильного именования (т.е. знак) клиентского приложения. Можно установить это использование вкладки подписания на странице свойств на приложении

3), Создают лицензию для клиента, это должно быть XML-документом и подписать его с помощью Закрытого ключа. Это включает просто вычисление цифровой подписи и ступает для выполнения, это может быть найдено в:

http://msdn.microsoft.com/en-us/library/ms229745.aspx

4) На клиенте, при проверке лицензии Вы загружаете XmlDocument и используете Ваш Открытый ключ для проверки подписи, чтобы доказать, что в лицензию не вмешались. Детали о том, как сделать это, могут быть найдены в:

http://msdn.microsoft.com/en-us/library/ms229950.aspx

Для обхождения ключевого распределения (т.е. обеспечение клиента использует правильный открытый ключ) можно на самом деле вытянуть открытый ключ от самого блока со знаком. Таким образом обеспечение Вас не имеет другого ключа для распределения и даже если кто-то вмешивается в блок, .net платформа умрет с исключением безопасности, потому что строгое имя больше не будет соответствовать самому блоку.

Для получения по запросу открытого ключа от клиентского блока Вы хотите использовать код, подобный:

    /// <summary>
    /// Retrieves an RSA public key from a signed assembly
    /// </summary>
    /// <param name="assembly">Signed assembly to retrieve the key from</param>
    /// <returns>RSA Crypto Service Provider initialised with the key from the assembly</returns>
    public static RSACryptoServiceProvider GetPublicKeyFromAssembly(Assembly assembly)
    {
        if (assembly == null)
            throw new ArgumentNullException("assembly", "Assembly may not be null");

        byte[] pubkey = assembly.GetName().GetPublicKey();
        if (pubkey.Length == 0)
            throw new ArgumentException("No public key in assembly.");

        RSAParameters rsaParams = EncryptionUtils.GetRSAParameters(pubkey);
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(rsaParams);

        return rsa;
    }

я загрузил демонстрационный класс с большим количеством полезных Утилит Шифрования на Snipt в: http://snipt.net/Wolfwyrd/encryption-utilities/ , чтобы помочь получить Вас на Вашем пути.

я также включал пример программы в: https://snipt.net/Wolfwyrd/sign-and-verify-example / . Образец требует, чтобы Вы добавили его к решению с шифрованием utils библиотека и обеспечили тестовый XML-файл и файл SNK для подписания. Проект должен быть установлен быть подписанным с SNK, который Вы генерируете. Это демонстрирует, как подписать тестовый XML-файл с помощью закрытого ключа от SNK и затем проверить от открытого ключа на блоке.

Обновление

Добавленный актуальное сообщение в блоге с подробным хорошим пробегает на файлах лицензии

39
ответ дан Wolfwyrd 29 November 2019 в 04:04
поделиться

Используйте XML-файл со знаком. Подпишите его с частью с закрытым ключом пары ключей и проверьте его с частью с открытым ключом в Вашем программном обеспечении. Это дает Вам oppertunity, чтобы проверить, была ли лицензия изменена и также проверять, допустим ли файл лицензии.

Подписание и проверка XML-файла со знаком документируются в MSDN.

, конечно, логично, что Вы подписываете файл лицензии в своей собственной компании и отправляете файл лицензии клиенту, который тогда помещает файл лицензии в папку для Вас для чтения.

, Конечно, люди могут сократить/взламывать Ваш распределенный блок и сорвать проверку знака xml, но с другой стороны, они всегда будут в состоянии сделать так, независимо от того, что Вы делаете.

7
ответ дан Frans Bouma 29 November 2019 в 04:04
поделиться

Почему Вы должны были бы зашифровать его? Если это вмешивается Вас, боятся (например, кто-то увеличивающий число пользователей), Вы могли, возможно, просто подписать его с, например, цифровое свидетельство Вашей организации вместо этого?

1
ответ дан Eyvind 29 November 2019 в 04:04
поделиться

Единственный способ предоставить своего рода безопасности лицензирование состоит в том, чтобы вызвать вход в систему онлайн против учетных данных, содержат собой (действительно абстрактный разговорный).

Все другие методы занимают больше времени и поэтому больше денег, чтобы реализовать, взломать и злоупотребить Вашим программным обеспечением вместо того, чтобы покупать лицензию.

.NET имеет некоторые хорошие криптографические классы, но поскольку Вы упомянули при кодировании en-/decription лицензии все могут декомпилировать его легко.

1
ответ дан Oliver Friedrich 29 November 2019 в 04:04
поделиться

или возможно Вы хотите связать лицензию на конкретную машину, например, генерируя ключ лицензии на основе md5 ценности c двигателя PC. тогда Ваша лицензия была бы конкретной машиной.

0
ответ дан melaos 29 November 2019 в 04:04
поделиться

Похоже, что образцы MSDN используют параметры по умолчанию, и это приводит к подписи, зависящей от компьютера, так что вы не можете подписаться на одной машине и проверить на произвольной другой машине. Я изменил логику в этих примерах, чтобы использовать ключи в моем snk на подписывающей машине и ключи из моей сборки на проверяющей машине. Это было сделано с использованием логики из образца MSDN и подпрограмм из (очень хорошо сделанного) образца ExcryptionUtils.cs, ссылка на который приведена выше.

Для подписи файла я использовал следующее:

RSACryptoServiceProvider rsaKey = EncryptionUtils.GetRSAFromSnkFile(keyFilePath);

Для проверки файла я использовал следующее:

RSACryptoServiceProvider rsaKey = EncryptionUtils.GetPublicKeyFromAssembly
   (System.Reflection.Assembly.GetExecutingAssembly());

Кстати: я заметил, что проверка подписи XML игнорирует комментарии XML.

1
ответ дан 29 November 2019 в 04:04
поделиться

RE: Не включайте в свой код весь ключ. Используйте sn -p для извлечения публичной части в файл. Используйте это в своем коде, который вы распространяете, для проверки лицензии.

Используя код из статей MSDN, я создал небольшое приложение (LicMaker), чтобы облегчить это. Приложение подписано полной парой ключей. Входными данными является неподписанный файл лицензии .XML. Результатом будет исходная подпись XML + в подписанном файле .LIC. Мой продукт также подписан тем же файлом полной пары ключей. Продукт проверяет, не был ли изменен файл .LIC. Работает отлично. Я не использовал sn -p для этого решения.

-1
ответ дан 29 November 2019 в 04:04
поделиться

Ответ Wolfwyrd превосходен, но я просто хотел предложить намного более простую версию метода Wolfwyrd GetPublicKeyFromAssembly (который использует множество вспомогательных методов из любезно предоставленной библиотеки Wolfwyrd) .

В этой версии это весь код, который вам нужен:

/// <summary>
/// Extracts an RSA public key from a signed assembly
/// </summary>
/// <param name="assembly">Signed assembly to extract the key from</param>
/// <returns>RSA Crypto Service Provider initialised with the public key from the assembly</returns>
private RSACryptoServiceProvider GetPublicKeyFromAssembly(Assembly assembly)
{
    // Extract public key - note that public key stored in assembly has an extra 3 headers
    // (12 bytes) at the front that are not part of a CAPI public key blob, so they must be removed
    byte[] rawPublicKeyData = assembly.GetName().GetPublicKey();

    int extraHeadersLen = 12;
    int bytesToRead = rawPublicKeyData.Length - extraHeadersLen;
    byte[] publicKeyData = new byte[bytesToRead];
    Buffer.BlockCopy(rawPublicKeyData, extraHeadersLen, publicKeyData, 0, bytesToRead);

    RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
    publicKey.ImportCspBlob(publicKeyData);

    return publicKey;
}
6
ответ дан 29 November 2019 в 04:04
поделиться

При реализации кода подписи / проверки будьте осторожны, не помещайте его в отдельную сборку. Защита от несанкционированного доступа для кода доступа теперь очень легко обойти, как объясняется в статье Защита от несанкционированного доступа CAS нарушена: последствия для лицензирования программного обеспечения .

Обязательный отказ от ответственности и заглушка: компания, которую я основал производит лицензионное решение OffByZero Cobalt .

0
ответ дан 29 November 2019 в 04:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: