none
Генератор ключей для выдачи пользователям RRS feed

  • Вопрос

  • Народ кто нибудь знает, как можно сгенерировать ключ, на основе какой нибудь строки? Например так можно получить хэш пароля:

    using System.Security.Cryptography;
    ...
    String password = "crash54y7b";
    MD5CryptoServiceProvider MyHash = new MD5CryptoServiceProvider();
                byte[] bytetohash = Encoding.Unicode.GetBytes(password);
                MyHash.ComputeHash(bytetohash);
                string passwordHash = Convert.ToBase64String(MyHash.Hash);
    
                MessageBox.Show(passwordHash);

    А как сгенерировать ключ вида: SC3FR-RRTGG-FGGH5-KJKLN-55UT7 или подобный?
    Кстати читал, что тип String лучше вообще не использовать для хранения пароле ключей и т.д. а желательно использовать SecureString (шифрует полученный текст грубо говоря и уничтожается сразу в отличии от String).
    Вообще цель, создать кейген для выдачи ключей пользователям и проверки в программе. Ни разу ничего подобного не писал, так что нужна помощь.
    • Перемещено I.Vorontsov 6 мая 2010 г. 5:58 (От:Visual C#)
    29 апреля 2010 г. 20:22

Ответы

  • Как-то раз я писал защитный механизм. Он получал данные компьютера пользователя (MAC адрес сетевой карты и другие параметры), хэшировал их, после чего подписывал цифровой подписью. Для хэширования можно использовать что-то вроде:

     

    HashAlgorithm hashAlg = new SHA1CryptoServiceProvider();

     

    byte[] hashForSigning = hashAlg.ComputeHash(hash);

    Для подписи:

    RSAPKCS1SignatureFormatter

     

    signature = new RSAPKCS1SignatureFormatter();

    signature.SetHashAlgorithm(

    "SHA1");

     

    byte[] signedData = signature.CreateSignature(hashForSigning);

    Цифровая подпись по сути шифровка ассиметричным алгоритмом. Один ключ, с помощью которого происходит подпись хранится на сервере, информация о другом ключе передается вместе с программой.

    Соответственно при проверке сначала вычисляется хэш данных компьютера пользователя, после чего происходит расшифровка данных, подписанных цифровой подписью с помощью метода VerifySignature, который есть, например, у RSAPKCS1SignatureDeformatter . Если реальный хэш и расшифрованный из цифровой подписи совпадают - все ок.

    Соответственно, механизм состоит из:

    1)Закрытого ключа, с помощью которого подписывается хэш информации о машине пользователя.

    2)Подписанного хэша

    3)Открытого ключа, который поставляется вместе с подписанным хэшем.

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

Все ответы

  • В принципе, можно закодировать ключ асимметричным алгоритмом. Публичным ключом генерировать, а приватным - раскрывать в программе. Дешево и сердито :)
  • Собственно - вам нужен алгоритм или идея? Если идея - генерите последовательность вида SC3FR-RRTGG.... как набор случайных/почти случайных байт и все нагенеренное храните БД, ну и юзерам своим раздавайте, ессесно. Когда кто-то "подсовывает" вам якобы валидный ключ - лезте в БД и сверяйте - было такое нагенерено или как? Вот и все, собственно... Далее варьируется лишь сложность алгоритма генерации.

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

  • Вообще-то это легко обойти. Или же нужно каждый раз проверять валидность ключа. А тогда легче сделать аккаунт на сайте и постоянно подключаться к нему. Но без интернета работать не будет. А вот генерировать ключ гораздо сложнее. И можно не мучиться с проверкой в базе данных. Если может расшифровать, т.е. не вызывает исключения, то ключ валидный. Также можно, при желании, сделать базу данных ключей и периодически проверять, что пользователь не наглеет и не раздает свой "серийник" направо и налево. Достигнуть можно введением максимального количества копий с одним ключом. Могу еще предположить, что ключ можно генерировать на базе, скажем, мак адреса или других мало изменяющихся данных.

    Но это только мои догадки не подтвержденные личным опытом в данном вопросе. 

  • Как-то раз я писал защитный механизм. Он получал данные компьютера пользователя (MAC адрес сетевой карты и другие параметры), хэшировал их, после чего подписывал цифровой подписью. Для хэширования можно использовать что-то вроде:

     

    HashAlgorithm hashAlg = new SHA1CryptoServiceProvider();

     

    byte[] hashForSigning = hashAlg.ComputeHash(hash);

    Для подписи:

    RSAPKCS1SignatureFormatter

     

    signature = new RSAPKCS1SignatureFormatter();

    signature.SetHashAlgorithm(

    "SHA1");

     

    byte[] signedData = signature.CreateSignature(hashForSigning);

    Цифровая подпись по сути шифровка ассиметричным алгоритмом. Один ключ, с помощью которого происходит подпись хранится на сервере, информация о другом ключе передается вместе с программой.

    Соответственно при проверке сначала вычисляется хэш данных компьютера пользователя, после чего происходит расшифровка данных, подписанных цифровой подписью с помощью метода VerifySignature, который есть, например, у RSAPKCS1SignatureDeformatter . Если реальный хэш и расшифрованный из цифровой подписи совпадают - все ок.

    Соответственно, механизм состоит из:

    1)Закрытого ключа, с помощью которого подписывается хэш информации о машине пользователя.

    2)Подписанного хэша

    3)Открытого ключа, который поставляется вместе с подписанным хэшем.

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