Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/58: Рейтинг темы: голосов - 58, средняя оценка - 4.50
106 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 101
Записей в блоге: 1
1

Активация ключом

08.02.2015, 01:32. Показов 10605. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят я хочу сделать чтобы программу можно было активировать ключом - они должны браться из программы (мы их туда записываем)

Потом при запуске вылезает форма где надо ввести ключи и если он верный то у нас появляется лицензия программы
Я хочу чтобы при каждый запуске программы не надо было вводить ключ а ввёл один раз и всё
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2015, 01:32
Ответы с готовыми решениями:

Запустить консольное приложение с ключом
Допустим приложение называется Name.exe. Надо сделать так, что бы при запуске приложения с...

Как зашифровать и расшифровать текст с ключом?
Вводим в консоли любую строку, вводим ключ под эту строку, дальше текст перемешивается, далее...

Что делать с ключом и вектором AES?
Мне надо зашифровать допустим "ggqgqg3t3gggggg335" и потом расшифровать. Вот что я делаю ...

Подписать сигнатуру секретным ключом (MD5, 32-bit)
api_key=376892265asdad5d12726d8bbfbd8912b3&id=302221&timestamp=1510235730&nonce=309127 Как...

11
2 / 2 / 2
Регистрация: 01.07.2013
Сообщений: 33
08.02.2015, 02:32 2
Несколько способов:
1. При запуске программы проверять наличие файла serial.txt (например). Если такового файла нет или он пустой - выводим форму ввода ключа. Иначе если файл не пустой, но ключ в файле не соответствует правильному ключу - вывод сообщения (допустим) о том, что была попытка взлома программы. Ну а если файл существует и ключ в нем вписан правильно, тогда происходит запуск программы
2. Сделать запись ключа в реестр и потом считывать оттуда каждый раз при запуске программы ключ и проверять его на правильность
3. Создать сайт, который будет иметь базу данных адресов компьютеров, которые зарегистрировали программу. Программа посылает запрос на сервер и получает, есть ли текущий компьютер в списке зарегистрированных или нет
4. Сделать инсталлятор с вводом ключа
5. Сделать в программе возможность "не показывать окно ввода ключа"
6. Создать файл, наличие которого будет знаменовать о том, что программа зарегистрированна (файл есть - нет ввода ключа, файла нет - вводим ключ и создаем файл)
7. Сделать ключом имя флешки (которая будет являтся тем самым "регистрационным ключом") а потом при запуске программы проверять наличие флешки
8. Создать две версии программы, одна будет требовать ключ, вторая собственно сама программа. Пользователь вводит ключ и ему выдается ссылка на адрес, где можно получить копию работающего ПО
9. Тот же пункт, что и 8, только выдавать не автоматически а самому

К чему все это? Способов много, какой хотите - выбирайте сами
0
106 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 101
Записей в блоге: 1
08.02.2015, 09:32  [ТС] 3
Я хочу поговорить о 5 и о 2 способе

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

Я хочу просто обговорить о том что если пользователь удалит файл и запросит новый ключ (Он может меня обмануть)
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
08.02.2015, 12:06 4
Цитата Сообщение от TwerTrue Посмотреть сообщение
о 2 способе
Не очень хороший способ. Как то пытался применить, но на некоторых машинах программа крашилась (ятд, не было правд для доступа к реестру или еще что).
Сейчас использую вариацию способа 6 (с небольшими доработками), но без проверки на сервере (не хочу привязывать работу программы к наличию сети).
Цитата Сообщение от TwerTrue Посмотреть сообщение
пользователь удалит файл и запросит новый ключ
Ну такое возможно, но можно обговорить количество предоставляемых одному пользователю лицензий (к примеру, три вполне достаточно).
1
106 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 101
Записей в блоге: 1
08.02.2015, 14:02  [ТС] 5
Можешь дать код с твоими доработками буду очень благодарен
0
2 / 2 / 2
Регистрация: 01.07.2013
Сообщений: 33
08.02.2015, 19:07 6
Не думал, что кому-то понравится 5 и 6 способ)
0
2 / 2 / 0
Регистрация: 23.12.2016
Сообщений: 80
30.03.2017, 09:07 7
Чувак тут про привязки лучше даже не спрашивай их на этом форуме не кто делать не умеет.

Вот для тебя написал, не кто больше бы не стал этого делать.

Using (референсы)

C#
1
2
3
4
5
6
7
8
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Management;
using System.Security.Principal;
using System.Diagnostics;
using System.ComponentModel;
Program.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static class Program
    {
        public static string K1 = "";
 
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
        }
    }
 
    public class DE
    {
        public static string GS()//GetSerial
        {
            string test1 = "ABWGDSQILFPKBVCMN";
            string str1 = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
            foreach (ManagementObject queryObj in searcher.Get())
            {
                str1 = queryObj["ProcessorId"].ToString();
            }
            return str1 + test1;
        }
    }
}
На форму поставь 2 label'a 2 texbox'a и 2 button'a


На событии Form_Load пишем:
C#
1
2
3
4
5
6
7
8
9
10
if (DE.GS() == K1) //if (DE.GS() == K1 || DE.GS() == K2 || DE.GS() == K3)
{
this.Text = "Активирован";
textBox1.Text = DE.GS();
}
else
{
this.Text = "Не активирован";
textBox1.Text = DE.GS();
}
После InitializeComponent

Напиши это
C#
1
public static string K1 = "";//тут список твоих ключей



По эвент клик на кнопке вход в программу.

C#
1
2
3
4
5
6
7
8
if (textBox2.Text == "тут имя" & DE.GS() == K1 || textBox2.Text == "тут имя" & DE.GS() == K2)
            {
                MessageBox.Show("Успешный вход!");
            }
            else
            {
                MessageBox.Show("Ключ требует покупки.");
            }
на кнопку копировать

C#
1
Clipboard.SetText(DE.GS());// копирование в буфер обмена
надеюсь помог
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.05.2017, 18:48 8
Вот Вам ещё 1 пример взятый из BHF

Плюсы данной привязки:
•Не требуется хостинг и определённых знаний/навыков в web-программировании.

Минусы данной привязки:
•Нельзя запретить пользователю доступ к нашей программе. Вообще можно будет пошаманить, но стоит ли оно того? Тем более это будет несколько неудобно. Вообщем, прочитав далее, вы поймёте.

Перейдём к самой привязке:
Реализуется она довольно-таки просто, но нам понадобится 2-3 программы. Обо всём по порядку... Для начала создадим саму форму для авторизации (она у нас будет одна, а результат выведем в Label). Кидаем на форму TextBox, Button и Label(не обязательно, вместо него вы ставите запуск нужного вам окна).

Далее прописываем код кнопке:
C#
1
2
3
4
5
6
7
string Ferrum = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);
ManagementObject Disk = new ManagementObject("win32_logicaldisk.deviceid="" + Ferrum + ":"");
Disk.Get();
string diskLetter = (Disk["VolumeSerialNumber"].ToString());
string SysKey = (diskLetter.ToString());
if (thirteenTextBox1.Text != SysKey) label1.Text = "Не верный SYS-KEY";
else label1.Text = "Успешно";
И по желанию можно добавить конструкцию try-catch. Но это не всё, так как мы будем кидать юзеру софт для получения его ID, то он сам сможет активировать себе программу и всё. Нам нужно зашифровать данный ключ:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try
{
    string Ferrum = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);
    ManagementObject Disk = new ManagementObject("win32_logicalDisk.deviceid="" + Ferrum + ":"");
    Disk.Get();
    string DiskLetter = (Disk["VolumeSerialNumber"].ToString());
    string SysKey = (DiskLetter.ToString());
    if (textBox1.Text != new Cipher().Codeс(SysKey, 5)) //5 - шаг сдвига
        label1.Text = "Не верный SYS-KEY";
    else label1.Text = "Успешно";
}
catch
{
    label1.Text = "Ошибка";
}
Для шифрования мы возьмём обычный Шифр Цезаря, но вы можете выбрать иное шифрование, а потом ещё и в MD5 перевести для железобетонной надёжности:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Tape
{
    string tape;
    public Tape(string symbol)
    {
        tape = symbol;
    }
    public string Replacement(string symbol, int key)
    {
        int Position = tape.IndexOf(symbol);
        if (Position == -1) return "";
        Position = (Position + key) % tape.Length;
        if (Position < 0) Position += tape.Length;
        return tape.Substring(Position, 1);
    }
}
class Cipher : List<Tape>
{
    public Cipher()
    {
        Add(new Tape("A0B1C2D3E4F5G6H7I8J9KLMNOPQRSTUVWXYZ"));
    }
 
    public string Codeс(string symbol, int key)
    {
        string res = "", tmp = "";
        for (int i = 0; i < symbol.Length; i++)
        {
            foreach (Tape v in this)
            {
                tmp = v.Replacement(symbol.Substring(i, 1), key);
                if (tmp != "")
                {
                    res += tmp;
                    break;
                }
            }
            if (tmp == "") res += symbol.Substring(i, 1);
        }
        return res;
    }
}
Вообщем-то на данном этапе у нас уже есть авторизация. Теперь осталось разобраться с тем, как получить ID железа пользователя и сгенерировать ключ. Создаём программу, которую будем кидать пользователю, чтобы получить ID железа. Кидаем на форму TextBox и Button и прописываем код для кнопки:
C#
1
2
3
4
5
6
7
8
9
10
11
try
{
    string Ferrum = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);
    ManagementObject Disk = new ManagementObject("win32_logicaldisk.deviceid="" + Ferrum + ":"");
    Disk.Get();
    textBox1.Text = (Disk["VolumeSerialNumber"].ToString());
}
catch ()
{
    textBox1.Text = "Ошибка";
}
Пользователь скидывает нам код, мы его шифруем и скидываем ему ключ активации. Для того, чтобы зашифровать: Кидаем на форму Button и 2 TextBox'а и прописываем код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        textBox2.Text = new Cipher().Codeс(textBox1.Text, 5);
    }
    catch (Exception)
    {
        textBox1.Text = "Ошибка";
    }
}
class Tape
{
    string tape;
    public Tape(string symbol)
    {
        tape = symbol;
    }
    public string Replacement(string symbol, int key)
    {
        int Position = tape.IndexOf(symbol);
        if (Position == -1) return "";
        Position = (Position + key) % tape.Length;
        if (Position < 0) Position += tape.Length;
        return tape.Substring(Position, 1);
    }
}
class Cipher : List<Tape>
{
    public Cipher()
    {
        Add(new Tape("A0B1C2D3E4F5G6H7I8J9KLMNOPQRSTUVWXYZ"));
    }
 
    public string Codeс(string symbol, int key)
    {
        string res = "", tmp = "";
        for (int i = 0; i < symbol.Length; i++)
        {
            foreach (Tape v in this)
            {
                tmp = v.Replacement(symbol.Substring(i, 1), key);
                if (tmp != "")
                {
                    res += tmp;
                    break;
                }
            }
            if (tmp == "") res += symbol.Substring(i, 1);
        }
        return res;
    }
}
Ну как-то так... Гайд получился длинным, а способ в определённом случае неудобным, но для софта, который даётся раз и навсегда - самое то! Теперь немного поясню за шмот: Вы скидываете покупателю 2 программы, первая - программа, которую он купил, вторая - для получения ID железа. Покупатель скидывает ID железа, полученный через вторую программу, вы его зашифровываете и скидываете ему ключ активации.
0
Эксперт .NET
11069 / 6986 / 1571
Регистрация: 25.05.2015
Сообщений: 21,072
Записей в блоге: 14
07.05.2017, 19:12 9
chaleureux, обфусцировать программу будете? Что, если WMI не работает? Зачем шифровать, если проверку можно отключить перекомпиляцией? Зачем отдельная программа для получения ID, если это может делать продаваемая программа?
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
07.05.2017, 19:28 10
Rius, Это просто пример) Я с ним ничего не собираюсь делать, пока) Есть и лучше способы привязки.
0
0 / 0 / 0
Регистрация: 11.07.2017
Сообщений: 6
22.07.2017, 17:36 11
А нельзя ли сделать так же только чтобы ключи читались с хостинга допустим там добавил ключей пять
челу его даю и он себе прогу активирует
0
Эксперт .NET
11069 / 6986 / 1571
Регистрация: 25.05.2015
Сообщений: 21,072
Записей в блоге: 14
22.07.2017, 17:40 12
Каспер же и прочие делают? Значит можно. Делайте.
0
22.07.2017, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2017, 17:40
Помогаю со студенческими работами здесь

[VkNet] Элемент с тем же ключом уже был добавлен
При выполнении кода, на некоторых странах выдаёт исключение: System.ArgumentException: &quot;Элемент с...

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

Шифрование алгоритом AES со своим ключом любого размера
Помогите найти код данного шифрования только со своим ключом любого размера? Мне необходимо...

Алгоритм шифрования и дешифорвания строковых данных методом XOR с ключом.
Кто может, напишите хотя бы один алгоритм, пожалуйста. Алгоритм шифрования и дешифорвания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru