2012-05-03 6 views
2

Я ищу руководство по созданию системы, которая позволит мне заблокировать мои программы и поместить их в пробный режим. Часть, с которой мне нужно руководство, - это алгоритм для создания/проверки ключей, есть ли у вас какие-либо предложения относительно того, как это должно быть? Я использую C#.Серийный номер для блокировки программы/Сделать пробную версию?

+3

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

+0

Возможный дубликат [Лицензионная система для .NET] (http://stackoverflow.com/questions/5132943/licensing-system-for-net) – user7116

ответ

0

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

Это, как я хотел бы сделать это, и это может быть реализовано любопытное легко

0

Вы забываете, что есть такие инструменты, как dotPeek, JustDecompile или .NET Reflector, которые могут легко разобрать приложение в исходный код. Ваша защита может быть легко удалена. На SO есть много похожих тем, которые занимаются обфускацией, серийными номерами и т. Д. Вот две ссылки об обфускации кода.

https://stackoverflow.com/questions/1988451/net-obfuscation

Alternative for Obfuscation in the .NET world

Честно говоря, вы будете тратить много времени на защиту, которые могли бы в конечном итоге, как пустая трата времени. Это несчастливо, но это реальность.

0

Re-сообщение от: Generating a serial number for product activation

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

Если вы действительно хотели защитить функциональность, вы бы сохранили безопасную функциональность в Интернете и вызывают ее через веб-службы. Таким образом, они вынуждены платить за использование веб-службы. Если, однако, вы хотите найти способ генерации серийных ключей. Ниже приводится сообщение, в котором я описывал способ генерации «сложных» серийных ключей, которые занимают много времени, но требуется небольшое количество времени для проверки. Используя этот алгоритм, вы можете предварительно генерировать серийные ключи в базе данных, а затем выставлять их клиентам. Единственная проблема заключается в том, что еще раз - кто-то может разобрать ваше приложение и просто удалить лицензионную часть кода. Я бы сделал это так, чтобы у пользователя был действительный серийный ключ, чтобы загрузить программное обеспечение и загрузить все обновления. Это обеспечило бы стимулы быть законным и законным клиентом. Итак, примеры того, как вы могли бы использовать эти сериальные файлы, были бы следующими: Вы генерируете 100 последовательных комбинаций с приведенным ниже кодом. Сохраните их, а затем продайте их клиентам. Дайте им серийный код, ключ продукта (номер).

Затем, когда дело доходит до активации, они вводят его на свой сайт, а затем сайт отправляет им программное обеспечение.

Ваш веб-сайт принимает серийный ключ, ключ продукта, который они вводят, и объединяет его с секретной кодовой фразой для программного обеспечения. (Alpha в приведенном ниже примере) Если соединение из трех частей создает хеш SHA256 соответствующей силы/трудности, то он будет считать успешную регистрацию. Кроме того, вы можете проверить базу данных пользователей, чтобы узнать, соответствует ли этот серийный номер соответствующему клиенту. Если вы хотите получить действительно безопасное решение, вы можете создать приложение запуска, которое загружает двоичные файлы для вашего продукта и загружает их через Assembly.Load после успешной проверки серийного ключа. В любом случае - начинается повторная публикация.

Repost:

С серийными ключами, которые необходимо рассмотреть несколько вещей.

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

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

Для этого я предпочитаю использовать:

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

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

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

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

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

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

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

В моем примере: Я использую Serial Key (16 цифр), Incrementing int и слово 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) в нескольких продуктовых строках.