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

Аутентификация пользователя с шифрованием учетных данных

12.05.2015, 17:42. Показов 3080. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно написать программу аутентификации пользователя. Пользователь вводит логин, пароль, имя домена. Данная информация шифруется (якобы для передачи на сервер, но никуда ничего передавать не надо), потом расшифровывается и сравнивается с имеющимся набором пар "логин-пароль". Заранее благодарна!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2015, 17:42
Ответы с готовыми решениями:

Контроль учётных записей пользователя
Есть такая штука в Win 7 - контроль учётных записей пользователя Некоторые проги при запуске...

Аутентификация пользователя
Помогите с программой, как сделать не могу сообразить... В программе должны находится имена...

Аутентификация пользователя
Добрый день! подскажите пожалуйста , где может быть ошибка: дана база данный пользователей (логины...

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

7
309 / 317 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
12.05.2015, 19:34 2
Лучше пары "логин-пароль" тоже в шифрованном виде хранить, а шифровать односторонней функцией
1
0 / 0 / 0
Регистрация: 11.05.2015
Сообщений: 3
12.05.2015, 22:57  [ТС] 3
Не могли бы вы мне помочь написать подобную программу?
0
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
12.05.2015, 23:55 4
Всё что вам понадобится лежит в пространстве System.Security.Cryptography.Например, можно воспользоваться SHA512 шифрованием.Пример есть тут https://msdn.microsoft.com/ru-... .110).aspx
1
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
13.05.2015, 09:56 5
Лучший ответ Сообщение было отмечено Vasenyova как решение

Решение

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

Vasenyova, используйте шифрование AES, там ничего особо сложного нет. Почитать можно тут.
И вот реально работающий класс из одного моего проекта. Умеет преобразовывать строку/массив байт в зашифрованный массив байт и обратно.
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
static class AesCrypt
    {
        public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            byte[] encrypted;
            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                //aesAlg.Padding = PaddingMode.Zeros;
 
                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }
            // Return the encrypted bytes from the memory stream.
            return encrypted;
 
        }
 
        public static byte[] Encrypt(byte[] data, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (data == null || data.Length <= 0)
                throw new ArgumentNullException("Data");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            byte[] encrypted;
            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                //aesAlg.Padding = PaddingMode.Zeros;
 
                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        csEncrypt.Write(data, 0, data.Length);
                        csEncrypt.FlushFinalBlock();
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }
            // Return the encrypted bytes from the memory stream.
            return encrypted;
 
        }
 
        public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
 
            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;
 
            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                //aesAlg.Padding = PaddingMode.Zeros;
 
                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
 
                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
 
                            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }
 
            }
            return plaintext;
        }
 
        public static byte[] Decrypt(byte[] data, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (data == null || data.Length <= 0)
                throw new ArgumentNullException("Data");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
 
            // Declare the string used to hold
            // the decrypted text.
            byte[] result;
            byte[] buffer = new byte[65535];
 
            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                //aesAlg.Padding = PaddingMode.Zeros;
 
                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
 
                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(data))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        int readed = csDecrypt.Read(buffer, 0, buffer.Length);
                        result = new byte[readed];
                        Array.Copy(buffer, result, readed);
                    }
                }
            }
            return result;
        }
    }
Пример использования:
C#
1
2
byte[] encrypted = AesCrypt.Encrypt(sessionID, key, new byte[16]); // шифрование в массив байт
byte[] passwordBytes = AesCrypt.Decrypt(buffer, sessionID, new byte[16]); // дешифрование
Ключ шифрования должен быть 32-байтовым массивом типа byte, вектор инициализации можно задать массивом из нулей.
1
309 / 317 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
13.05.2015, 13:35 6
Цитата Сообщение от Exerion Посмотреть сообщение
Vigelforts,и как вы потом из хэша SHA512 достанете оригинальные значения?
А зачем доставать? Если можно получить оригинальные значения, то это не айс. Для аутентификации хэш-функции более предпочтительней. Даже если злоумышленник узнает механизм шифрования и готовую криптограмму, то получить исходный текст не выйдет(практически)

Добавлено через 4 минуты
Цитата Сообщение от Vasenyova Посмотреть сообщение
Не могли бы вы мне помочь написать подобную программу?
здесь вроде хороший пример
Авторизация пользователя с шифрованным паролем (hash random) в приложение
0
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
13.05.2015, 13:53 7
sldp, вы предполагаете, что на сервере БД хранятся пары логин-пасс, клиент авторизуется, посылая хэш, сервер вычисляет хэш из базы и сравнивает результаты?
В такой схеме две уязвимости:
1. Перехват трафика. Злоумышленнику и ни к чему знать способ шифрования или оригинальный пароль, он просто перехватит сообщение пользователя с хэшем и авторизуется используя его.
2. Взлом БД сервера - доступ ко всем паролям. Даже если там хранятся хэши - доступ ко всем хэшам, по которым происходит аутентификация.
Решение состоит в использовании паттерна "дайджест аутентификации", использующего хэширование совместно с симметричным/ассиметричным шифрованием и уникальным идентификатором сессии для каждого соединения. В таком случае даже декомпиляция клиентской и серверной части, взломы БД и перехват трафика не позволят злоумышленнику авторизоваться.

Однако почему я спрашиваю, как пользователь Vigelforts планирует достать из хэша оригинальный текст, так это потому, что задача топикстартера - закодировать и раскодировать обратно. Хэши тут не помогут.
0
309 / 317 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
13.05.2015, 14:13 8
Exerion, Я согласен, что существует масса атак, которые нужно предотвращать другими способами и полагаться только на этот способ глупо без его связки с другими, но на сколько я знаю при аутентификации зачастую именно хэш-функции используют, а поскольку я сомневаюсь, что человек создавший тему пишет достаточно масштабное рабочее приложение, а скорее либо учебное задание, либо для себя. То в таком случае, если мы где-то храним уже сами хэши, и при вводе пользователя вычисляем новые и сверяем с уже имеющимся, то этого вполне достаточно
0
13.05.2015, 14:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2015, 14:13
Помогаю со студенческими работами здесь

Аутентификация пользователя Yii
Здравствуйте уважаемые форумчане. Только начал изучать Yii. Очень путаюсь, но желаю разобраться....

Аутентификация пользователя firebird 2.1
Добрый день! возникла дурацкая ситуация, в прямом смысле слова. есть БД на firebird 2.1. открыть...

аутентификация пользователя через header()
Подскажите. пожалуйста, почему может не работать аутентификация пользователя через header()... У...

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


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

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