Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
1

Как сделать чтобы переменная создавалась 1 раз, а при закрытии программы не удалялась

18.11.2015, 22:38. Показов 2437. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я делаю форму входа с паролем, но при этом у меня возникла проблема.
public static string key; Объявил в одной форме переменную.
А в другой кнопке button1 в той же форме код:
if (key==null)
{ key = "yaadmin"; }
Т.е. мне необходимо чтобы пароль как бы уже был задан но, если что чтобы его можно было поменять и вот в этом вопрос возник. Вот на другой форме у меня код такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text==Form1.key)
            {
                if (textBox3.Text==textBox2.Text)
                {
                    Form1.key = textBox2.Text;  
                }
                else
                {
                    textBox3.Text = "";
                }
            }
            else
            {
                textBox1.Text = "";
            }
            this.Close();
        }
Т.е. если программу не закрывать, то всё работает хорошо, в переменной новый пароль сохраняется, но когда я закрываю программу, пароль у меня остаётся "yaadmin".
Если что-то не понятно уточняйте, я отвечу. Интересная задача, но с моими знаниями чувствую не потяну.
Миниатюры
Как сделать чтобы переменная создавалась 1 раз, а при закрытии программы не удалялась  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2015, 22:38
Ответы с готовыми решениями:

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

Строковые оптимизации, чтобы не создавалась новая строковая переменная на каждом шаге цикла
Итак, есть подобный код: static int SomeCount(List<string> array) { int count = 0; ...

Как сделать, чтобы когда пишешь с нескольких textbox в один label, инфа не удалялась бы, а добавлялась
private void textBox2_TextChanged(object sender, EventArgs e) { label.Text =...

Как мне сделать так, чтобы данный текстовый файл был открыт один раз при запуске программы и закрыт при закрытии программы?
Привет! Возник следующий вопрос. Программа состоит из основного окна Form1 и нескольких Unit. По...

15
116 / 115 / 64
Регистрация: 03.06.2013
Сообщений: 582
18.11.2015, 22:43 2
Я не очень понял, но вы хотите запустить программу, а там уже не стандартный пароль, а тот который вы ставили?
0
Эксперт .NET
5876 / 4753 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
18.11.2015, 23:03 3
gen1usqq,
Если в программе система аутентификации действительно является средством защиты важных данных, то заданный пароль шифруется и затем записывается в файл, который тоже шифруется/прячется (в зависимости от степени паранойи).
Если нужно просто сделать защиту от дурака или это учебная работа, то можно просто сохранить в файл / сериализовать / записать в settings и т.п.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
19.11.2015, 10:57  [ТС] 4
именно так.

Добавлено через 1 минуту
Понимаете, я хочу чтобы переменная была всегда в программе, и при закрытии программы данные сохранялись и переменная не удалялась, т.е. переменная существовала всегда. Как можно это сделать?
0
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,271
Записей в блоге: 9
19.11.2015, 11:14 5
Цитата Сообщение от gen1usqq Посмотреть сообщение
Понимаете, я хочу чтобы переменная была всегда в программе, и при закрытии программы данные сохранялись и переменная не удалялась, т.е. переменная существовала всегда. Как можно это сделать?
Хранить в БД (в зашифрованном виде) - думаю это верно. Ещё можно использовать сирелизацию.
https://msdn.microsoft.com/ru-... 33843.aspx
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
19.11.2015, 13:13  [ТС] 6
Не могли бы вы мне показать пример кода, как реализовать данную задачу? Буду очень признателен.

Добавлено через 35 минут
И ещё, зачем мне БД, если мне нужно хранить всего лишь значение 1 стринговой переменной??
0
Эксперт .NET
5876 / 4753 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
19.11.2015, 13:32 7
gen1usqq,
1) класс формы сохранения пароля:
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
private void button1_Click(object sender, EventArgs e)
{
    string pass=textBox1.Text;
    if (pass.Length<5)
    {
        MessageBox.Show("Увеличьте длину пароля!");
        return;
    }
    savePass(pass);
}
 
void savePass(string pass)
{
    StringBuilder sb = new StringBuilder(pass);
    for (int i = 0; i < sb.Length; i++)
    {
        sb[i] = (Char)((Int32)sb[i] + (i % 2 == 0 ? 1 : -1)); //шифруем
    }
    pass = sb.ToString();
    using (StreamWriter sw = new StreamWriter(Application.StartupPath + "\\ItIsNotPassword.txt", false, Encoding.Default)) // сохраняем в файл, о котором никто не догадается, что там пароль
    {
        sw.Write(pass);
    }
}
2) класс формы аутентификации:
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
private void button1_Click(object sender, EventArgs e)
{
    if (!checkPass())
    {
        MessageBox.Show("Неверный пароль!");
        Application.Exit(); //или другие действия
    }
    else
    {
        this.Close();
    }
}
 
bool checkPass()
{
    string readPass, enteredPass;
    enteredPass = textBox1.Text; 
    if (!File.Exists(Application.StartupPath + "\\ItIsNotPassword.txt"))
        return false;
    using (StreamReader sw = new StreamReader(Application.StartupPath + "\\ItIsNotPassword.txt", Encoding.Default))
    {
        readPass = sw.ReadLine();
    }
    StringBuilder sb = new StringBuilder(readPass);
    for (int i = 0; i < sb.Length; i++)
    {
        sb[i] = (Char)((Int32)sb[i] + (i % 2 == 0 ? -1 : 1)); //расшифровываем
    }
    readPass = sb.ToString();
    return (readPass == enteredPass);
}
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
19.11.2015, 13:46  [ТС] 8
Опять же повторюсь наверное, я не хочу использовать файл, ибо это как мне кажется не особо безопасно. Есть какие либо пути хранения переменной всё время? Не зависимо от запуска либо закрытия программы????
0
2 / 2 / 2
Регистрация: 03.11.2015
Сообщений: 8
19.11.2015, 15:41 9
Возникает вопрос: хранения где? Вам предложили а базе данных, в файле. Нет? Тогда придумайте, где вы хотите хранить переменную.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
19.11.2015, 17:18  [ТС] 10
А в самой программе переменную просто не удалять и не очищать память от неё, нельзя так сделать? Если можно то как?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.11.2015, 18:32 11
Я в одном своем проекте сделал так: в ресурсы программы загнал другую небольшую программу, которая меняет пароль. Сам пароль хранится в виде хэша SHA так же в ресурсах. При нажатии "сменить пароль" сменяющая пароль прога распаковывается из ресурсов и запускается, после чего основная закрывается. В качестве параметров той проге подаются новый и старый пароль, к которым прилеплены в конце определенные символы(чтобы нельзя было просто распаковать сменяющую пароль прогу из ресурсов и ею сменить пароль без знания тех символов). Далее, если все верно, сменяющая пароль прога залезает в ресурсы основной и меняет там хэш пароля, после чего открывает основную прогу с параметром, указывающим, успешно ли сменен пароль. Заказчик был доволен, ибо никаких лишних файлов а пароль есть, но, понятное дело, от кого-то более-менее серьезного, способного декомпилировать все это дело, данный способ бесполезен.

Добавлено через 1 минуту
Да, и распакованная прога для смены пароля в конце удаляется

Добавлено через 8 минут
Цитата Сообщение от gen1usqq Посмотреть сообщение
А в самой программе переменную просто не удалять и не очищать память от неё, нельзя так сделать? Если можно то как?
Вот как вы себе это представляете хотя бы теоретически? Переменные находятся в оперативной памяти, а она, как известно, не предназначена для долговременного хранения чего-то и очищается от данных конкретной программы сразу как ее закрыли, и при выключении компа данные в ней не сохраняются. А на жестком диске хранение происходит в виде файлов-что вам и предложили.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
19.11.2015, 19:03  [ТС] 12
То что вы мне описали, является для меня пока что, сложновато, мне это задание дали в хабзе ( типо задание на практику), я хотел его сделать круто, но видимо придётся создать файл и в нём хранить пароль, но мне не нравится, то что файл будет открытым, т.е. в него может любой зайти и что хочешь с ним делать.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.11.2015, 19:17 13
Ну тогда храните просто хэш пароля в файле. А если файла нет-юзер сам виноват что удалил. И в конце символы к нему прилепите-чтобы юзер не мог просто свой хэш подложить, если пронюхает, что за алгоритм хэширования там. И эффект будет примерно тот же-только файл будет глаза мозолить.

Добавлено через 5 минут
Вообще попытки запаролить вход в прогу-дело, надо сказать, совершенно бесполезное. Кому надо все равно взломают, так или иначе. Тем более на шарпе, который в легкую декомпилируется. Пароли имеет смысл использовать тогда, когда защищаемые им данные зашифрованы или находятся где-то на сервере, к которому у юзера доступа нет.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
19.11.2015, 20:28  [ТС] 14
а что такое хэш если не сложно поясните?

Добавлено через 58 минут
Ладно вы меня убедили и я удалил в программе, использование пароля, но у меня ещё очень интересная проблема не могли бы вы мне объяснить как сделать? https://www.cyberforum.ru/csha... ost8361601
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
20.11.2015, 00:38 15
Цитата Сообщение от gen1usqq Посмотреть сообщение
а что такое хэш если не сложно поясните?
Говоря вкратце, это некое необратимое преобразование над над любыми данными, в результате которого на выходе последовательность байт фиксированного размера. То есть подать можно подать последовательность байтов любой длины-а результат будет одной длины. Зная хэш пароля, пароль из него восстановить нельзя, а вот проверить, правильный ли пароль-можно, проведя над введенным паролем то же самое преобразование. Правда, для всего этого существует проблема с коллизиями-для некоторых данных хэши будут одинаковы, при том, что сами данные разные. Но для хорошей хэш функции отыскать их не так-то просто, так что все ими активно пользуется-никто не хранит пароли в виде текста, только их хэши. Подробнее в википедии.
1
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 135
20.11.2015, 10:21  [ТС] 16
Последний вопрос к вам, скажите можно ли как-нибудь сделать в компоненте listview, чтобы в программе в таблицу можно было вводить данные, а после сохранять эти данные в файл, очень нужно спасайте плиз).
0
20.11.2015, 10:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2015, 10:21
Помогаю со студенческими работами здесь

Сделать так, чтобы при закрытии книги удалялась кнопка
Добрый день! Вопрос, наверное, простой, но я с ним промучалась уже два дня. Как программно...

как сделать чтобы форма создавалась один раз
Как сделать так, чтобы при нажатии на кнопку форма создавалась только один раз? В голову идет...

Как при активации чекбокса сделать так, чтобы текстареа удалялась?
Нужен простой пример с функцией яваскрипт. Существует текстареа и чекбокс Как при активации...

Как сделать так, чтобы при нажатии на кнопку в StringGrid создавалась еще 1 строка снизу
Есть StringGrid и с 1 строкой, вводятся данные в стандартные компоненты и после нажатия кнопки они...


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

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