Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
102 / 24 / 12
Регистрация: 12.12.2013
Сообщений: 211
Записей в блоге: 1

Авторизация пользователя с шифрованным паролем (hash random) в приложение

04.07.2014, 12:32. Показов 2749. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В наличии ДБ СУБД Firebird, в которой присутствует таблица USERS с полями ID (integer not null) – первичный ключ, LOGIN (varchar(32) not null) (уникальный ключ), NAME (varchar(100)), FIRED (integer default 0 not null), HASH (varchar(200) not null) - hash, SALT(integer not null) - random. Авторизация пользователей через приложение (исходников нет). (Логины и пароли активных пользователей известны)
Так как структура БД устраивает, а функционал приложения оставляет желать лучшего начал создание своего приложения. Точнее многое уже работает через несколько моих различных приложений (писал на C# с использованием ADO.NET), а теперь настало время систематизировать и свести к единому интерфейсу.
Собственно сам вопрос:
Как реализовать авторизацию пользователей в новом приложении используя данные из вышеуказанной таблицы?? Каким образом реализовать шифрование паролей при создании нового пользователя? И как считывать при вводе пароля в окне авторизации?

Добавлено через 2 часа 41 минуту
Цитата Сообщение от jcp Посмотреть сообщение
Как реализовать авторизацию пользователей в новом приложении используя данные из вышеуказанной таблицы?? Каким образом реализовать шифрование паролей при создании нового пользователя? И как считывать при вводе пароля в окне авторизации?
Для новых пользователей это все понятно что используя System.Security.Cryptography.RNGCryptoSe rviceProvider.
Больше интересует использование текущих паролей (чтение из таблицы и расшифровка)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2014, 12:32
Ответы с готовыми решениями:

Авторизация пользователя БД (администратор и гость, каждый со своим паролем)
Помогите сделать защиту на бд нужно с помощью Combobox сделать администратор и гость и чтоб у каждого был свой пароль

Hash API Авторизация
Здравствуйте, столкнулся с проблемой авторизации на своём сайте. При отправке данных скрипт выдает данную ошибку:Warning:...

Проблема с SendKeys.SendWait. Приложение зависает, если на удаленном компьютере происходит авторизация в системе или смена пользователя
Здравствуйте. Вообщем пишу сервис, который принимает через сеть символы с клавиатуры и "нажимает" их. Возникла проблема. Если на...

2
36 / 36 / 16
Регистрация: 26.11.2011
Сообщений: 199
06.07.2014, 12:59
Лучший ответ Сообщение было отмечено jcp как решение

Решение

вот пример класса пароля который я когда-то нашел и до сих пор пользуюсь
Разберешься как он функционирует со своим думаю проблем не будет
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
internal class Password
    {
        private byte[] _salt;       // синхропосылка
        private byte[] _hash;       // хэш пароля
        /*все четыре свойства просто возвращают значения
         * соответствующих полей объекта
         */
        internal string Salt
        {
            get { return Convert.ToBase64String(_salt); }
        }
 
        internal string Hash
        {
            get { return Convert.ToBase64String(_hash); }
        }
 
        internal byte[] RawSalt
        {
            get { return (byte[])_salt.Clone(); }
        }
 
        internal byte[] RawHash
        {
            get { return (byte[])_hash.Clone(); }
        }
        internal Password(string salt, string hash)
        {
            /*Конструктор с двумя строковыми аргументами
             * просто преобразует синхропосылку и хэш из base64
             * в двоичное представление и сохраняет в
             * соответствующих полях класса
             */
            _salt = Convert.FromBase64String(salt);
            _hash = Convert.FromBase64String(hash);
        }
        internal Password(byte[] salt, byte[] hash)
        {
            /*Конструктор, принимающий массивы байт,
             * создает копии входных массивов
             */
            _salt = (byte[])salt.Clone();
            _hash = (byte[])hash.Clone();
        }
        internal Password(char[] clearText)
        {
            /*Конструктор с одним аргументом генерирует
             * случайную синхропосылку и вычисляет хэш
             * предоставленного пароля, используя внутренний
             * метод HashPassword()
             */
            _salt = GenerateRandom(6);
            _hash = HashPassword(clearText);
        }
        /*Метод Verify сначала вычисляет хэш предоставленного
         * пароля, используя все тот же внутренний метод
         * HashPassword, после чего сравнивает байты сохраненного
         * хэша с байтами только что вычисленного хэша. Совпадение
         * всех до одного байтов хэша означает, что пароль верный.
         */
        internal bool Verify(char[] clearText)
        {
            byte[] hash = HashPassword(clearText);
 
            if (hash.Length == _hash.Length)
            {
                for (int i = 0; i < hash.Length; i++)
                {
                    if (hash[i] != _hash[i])
                        return false;
                }
 
                return true;
            }
 
            return false;
        }
        /*Статический метод Generate просто генерирует
         * массив случайных байтов и преобразует его
         * в base64-строку.
         */
        private static char[] Generate()
        {
            char[] random = new char[12];
 
            // генерируем 9 случайных байтов; этого достаточно, чтобы
            // получить 12 случайных символов из набора base64
            byte[] rnd = GenerateRandom(9);
 
            // конвертируем случайные байты в base64
            Convert.ToBase64CharArray(rnd, 0, rnd.Length, random, 0);
 
            // очищаем рабочий массив
            Array.Clear(rnd, 0, rnd.Length);
 
            return random;
        }
        /* Метод записывает синхропосылку и пароль в поток на
         * основе массива байтов, а затем вычисляет хэш
         * содержимого потока. В качестве хэш-функции используется
         * алгоритм SHA-256.
         */
        private byte[] HashPassword(char[] clearText)
        {
            Encoding utf8 = Encoding.UTF8;
            byte[] hash;
 
            // создаем рабочий массив достаточного размера, чтобы вместить
            byte[] data = new byte[_salt.Length
                        + utf8.GetMaxByteCount(clearText.Length)];
 
            try
            {
                // копируем синхропосылку в рабочий массив
                Array.Copy(_salt, 0, data, 0, _salt.Length);
 
                // копируем пароль в рабочий массив, преобразуя его в UTF-8
                int byteCount = utf8.GetBytes(clearText, 0, clearText.Length,
                  data, _salt.Length);
 
                // хэшируем данные массива
                using (HashAlgorithm alg = new SHA256Managed())
                    hash = alg.ComputeHash(data, 0, _salt.Length + byteCount);
            }
            finally
            {
                // очищаем рабочий массив в конце работы, чтобы избежать
                // утечки открытого пароля
                Array.Clear(data, 0, data.Length);
            }
 
            return hash;
        }
        /*Метод GenerateRandom генерирует массив указанной длины,
         * состоящий из случайных байтов.
         */
        private static byte[] GenerateRandom(int size)
        {
            byte[] random = new byte[size];
            RandomNumberGenerator.Create().GetBytes(random);
            return random;
        }
 
    }
2
102 / 24 / 12
Регистрация: 12.12.2013
Сообщений: 211
Записей в блоге: 1
06.07.2014, 15:48  [ТС]
Спасибо за прекрасный пример!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2014, 15:48
Помогаю со студенческими работами здесь

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

Удалить пользователя с заданным паролем
Мне нужно уже в сделаной мною структуре, удалить пользователя с заданным паролем(пароль задан в типе decimal(простите, такое задание :) )....

Постояно просит пользователя с паролем
День добрый! Есть два компьютера в домене, на одном установлен принтер. При подключении с одного компьютера к другому запрашивается...

Автозаполнение форм или же HTTP base авторизация с логином и паролем
Всем добрый день. Хочу написать приложения которое будет отправлять запрос и получать ответ в виде xml. Но сервер защищен HTTP...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru