Как создать серийный ключ для защиты приложения

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

Take customername
Sign customername using privatekey and sha/dsa algorithm

Затем можно проверить лицензию, расшифровав ее с открытым ключом, и проверив совпадения имени пользователя.

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

Многие другие приложения просто предоставляют пользователю Guid при совершении покупки.

т.е. 5bd1060b-8608-4817-93ca-207f7c828e2f

и пользователь должен ввести свой адрес электронной почты и руководство, чтобы лицензировать свое приложение.

Это выглядит как более точное решение для пользователя, но я не понимаю, как такое приложение проверяет действительный guid по недействительному guid, если только оно не выполнено в режиме онлайн путем проверки пар адрес электронной почты / guid в базе данных. Но мне бы очень хотелось, чтобы какая-то проверка выполнялась без онлайн-проверки:

& gt; Приложение не будет работать, если интернет-соединение / мой сервер не работает или же b> они могут обойти проверку, отключив доступ в интернет

EDIT:

My understanding solution as proposed by answer below:

Пользователь совершает покупку
Принять адрес электронной почты + соль
Шифрование с SHA1 дает 160-битный хэш
Преобразование в шестнадцатеричное представление дает 20 шестнадцатеричных значений, т.е. 40 символов
Лоп последние 8 символов, чтобы дать Guid
Электронный адрес пользователя электронной почты и адрес электронной почты, который они вводят в программу Программа проверяет это соединение, беря адрес электронной почты, добавляя соль, шифруя ectera и проверка генерирует действительный гид.

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

My current method for another program:

Я сгенерировал пару открытый ключ / закрытый ключ
Пользователь совершает покупку
Я генерирую лицензию, подписав адрес электронной почты
BaseEncode сгенерированной лицензии
Отправить лицензию пользователю
Программа проверяет лицензию путем базового декодирования и дешифрования с открытым ключом

Моя проблема заключалась в том, что когда я подписываю адрес электронной почты слишком длинный, поэтому я в конечном итоге помещаю его в файл вместо того, чтобы пользователь вводил его в поле, но, возможно, проблема в том, что я использую base64encoding, а не конвертирую в Hex.

Как долго может длиться вывод подписи, зависит ли он от длины ввода или всегда один и тот же?

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

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

Конечно, они могут взломать приложение, но если приложение будет регулярно обновляться, это потребует много усилий.

So in summary: Правильно ли я понял, какой метод лучше, и сколько данных генерируется для второго подхода.

Ответы на вопрос(2)

Ваш ответ на вопрос