Серийный номер для блокировки программы / Сделать пробную версию?
Я ищу руководство по созданию системы, которая позволит мне заблокировать мои программы и перевести их в пробный режим. Часть, с которой я хочу получить руководство, - это алгоритм создания / проверки ключей. У вас есть какие-нибудь предложения по поводу того, каким он должен быть? Я использую C#.
3 ответа
Повторная публикация от: Создание серийного номера для активации продукта
По сути, если программное обеспечение установлено на компьютере, принадлежащем кому-то другому, у него есть возможность модифицировать программное обеспечение столько, сколько ему нужно, и вы не можете остановить его, если не будете поданы в суд, докажете разборку и наложите юридические санкции.
Если вы действительно хотите защитить функциональность, вы должны поддерживать безопасную функциональность в сети и вызывать ее через веб-службы. Таким образом, они вынуждены платить, чтобы использовать ваш веб-сервис. Однако, если вы хотите найти способ генерации серийных ключей. Ниже приведен пост, в котором я описал способ создания "сложных" серийных ключей, на создание которых уходит много времени, но на проверку уходит мало времени. Используя этот тип алгоритма, вы можете предварительно сгенерировать серийные ключи в базе данных, а затем разослать их клиентам. Единственная проблема заключается в том, что еще раз - кто-то может разобрать ваше приложение и просто удалить лицензионную часть кода. Вместо этого я бы сделал так, чтобы у пользователя был действительный серийный ключ, чтобы загрузить программное обеспечение и загрузить все обновления. Это послужило бы стимулом для легального и законного клиента. Итак, примеры того, как вы могли бы использовать эти сериалы, были бы следующими: Вы генерируете 100 комбинаций последовательностей с кодом ниже. Сохраните их, а затем продайте их клиентам. Дайте им серийный код, ключ продукта (номер).
Затем, когда дело доходит до активации, они вводят его на ваш сайт, а затем сайт отправляет им программное обеспечение.
Ваш веб-сайт берет серийный ключ, ключ продукта, который они вводят, и комбинирует его с секретной кодовой фразой для программного обеспечения. (Альфа в приведенном ниже примере) Если соединение трех частей генерирует хэш SHA256 соответствующей силы / сложности, то он будет считать его успешной регистрацией. Более того, вы можете проверить базу данных пользователей, чтобы увидеть, соответствует ли этот серийный номер соответствующему клиенту. Если вы хотите по-настоящему обезопасить себя, вы можете создать приложение запуска, которое загружает двоичные файлы для вашего продукта и загружает их через Assembly.Load после успешной проверки серийного ключа. Во всяком случае - переиздание сейчас начинается.
Repost:
С серийными ключами нужно учитывать несколько вещей.
Я видел ссылки во время моих поисков, которые указывают на использование простого Guid.NewGuid(); подход, а затем сделать некоторые преобразования в строке, чтобы сделать пользовательский стиль серийного ключа. Это легко сделать, но на вас, владельца продукта, возлагается обязанность отслеживать серийные ключи в базе данных, и в конце концов кто-то может случайно найти серийные номера, которые работают с помощью Guid.NewGuid(); самих себя. Если все на планете начали генерировать Guids одновременно, шансы столкновения становятся очень вероятными.
Существует своего рода решение, которое уменьшает вероятность столкновения, используя более сложный алгоритм поверх Guid.NewGuid();
Для этого я склонен использовать:
- Guid.NewGuid(); (Только первые 16 символов, минус символ - (дефис)
- Постоянно увеличивающееся или изменяющееся значение. (Nonce) (int будет работать: i++ и т. Д.)
- Секретная соль, которую вы будете хранить в безопасности в своей сети.
- Фактор сложности: заимствование этого принципа у биткойнов.
Хорошо, давайте представим, что я беру первые 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) для нескольких линий продуктов.
Что ж, лучшим способом было бы реализовать собственный протокол сокетов, который действительно жестко закодирован, чтобы хакеры не могли его декодировать, и вы должны постоянно менять его. Также, чтобы проверить лицензию, вам нужно просто связаться с вашим сервером сокетов, а сервер сокетов может просто связаться с базой данных и проверить, является ли ключ действительным или нет.
Вот как я бы это сделал, и это может быть реализовано довольно легко
Вы забываете, что есть такие инструменты, как dotPeek, JustDecompile или .NET Reflector, которые могут легко разобрать ваше приложение в исходный код. Ваша защита может быть легко удалена. Здесь на SO много похожих тем, которые касаются запутывания, серийных номеров и т. Д. Вот две ссылки о запутывании кода.
https://stackru.com/questions/1988451/net-obfuscation
Альтернатива для обфускации в мире.NET
Честно говоря, вы потратите много времени на защиту, которая может оказаться пустой тратой времени. Это неудачно, но это реальность.