Алгоритмы шифрования, которые можно декодировать в программе C # - PullRequest
0 голосов
/ 23 июня 2011

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

Мой первый шаг к base64_encode 3 различным строкам, например:

Name-Expiry-NumberPcs превращается в -> TmFtZS1FeHBpcnktTnVtYmVyUGNz

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

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

Есть мысли?

Ответы [ 5 ]

0 голосов
/ 23 июня 2011

«Хэш», согласно определению, не может быть декодирован, хотя возможен некоторый взлом методом «грубой силы».

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

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

0 голосов
/ 23 июня 2011

Из коробки .NET предоставляет обширную библиотеку алгоритмов безопасности, которые соответствуют стандартной криптографии. Ознакомьтесь с документацией по System.Security.Cryptography и выберите наиболее подходящий вам алгоритм.

Класс Convert имеет статические методы для преобразования строк в и из Base64, так что, опять же, у вас нет проблем в .NET, насколько вам интересно.

Я думаю, вы достаточно хорошо прикрыты. Просто убедитесь, что вы выбрали то, что вам удобно. И поймите, что когда вы выберете алгоритм хеширования, вы не сможете «разархивировать» вывод, только сравните.

0 голосов
/ 23 июня 2011

Хеширование является односторонней операцией: вы не можете декодировать хэшированное значение.

Здесь вы, вероятно, захотите сделать следующее: проверить хеш: создать новый хэш, когда ваша программавыполняется в системе клиента с использованием «живых» значений параметров и убедитесь, что сгенерированный хэш равен тому, который вы дали клиенту в качестве ключа.

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

Если вам необходимо проверить такую ​​информацию, то хеширование не подходит, и вместо этого вам нужно будет шифровать .Шифрование доступно в двух вариантах: симметричное и ассиметричное.

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

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

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

Вопрос, который вы задали, на самом деле может быть червем, и на него нет однозначного ответа.Возможно, вы захотите взглянуть на этот вопрос: https://stackoverflow.com/questions/5132943/licensing-system-for-net и перейти по десяткам ссылок на похожие вопросы здесь, на SO.

0 голосов
/ 23 июня 2011

Я сделал SHA256 в C # (см. System.Security.Cryptography). Однако я не верю, что хеш должен быть декодируемым. Намерение состоит в том, чтобы хэшировать что-то чувствительное (например, пароль), а затем применить ту же самую процедуру хеширования к другому значению и сравнить два хэша.

Похоже, вы ищете алгоритм шифрования (например, AES). Это также доступно в System.Security.Cryptography, как и ряд других алгоритмов.

0 голосов
/ 23 июня 2011

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

В вашем случае вы могли бы сначала кодировать строку в UTF8, чтобы получить массив байтов. Затем зашифруйте этот массив с помощью AES, который даст вам еще один байтовый массив. И, наконец, закодируйте эти зашифрованные данные, используя Base64, чтобы получить читаемую человеком строку.

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

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

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

...