Имя: Пароль:
1C
1С v8
Проверить пароль пользователя ИБ
,
0 Dirk Diggler
 
29.02.12
17:55
Как проверить, совпадает ли некая введенная в поле ввода строка с паролем пользователя ИБ Васи Иванова?
1 mikecool
 
29.02.12
17:55
никак
2 ShoGUN
 
29.02.12
17:56
ПользовательИнформационнойБазы.Пароль (InfoBaseUser.Password)
ПользовательИнформационнойБазы (InfoBaseUser)
Пароль (Password)
Использование:

Только запись.
Описание:

Тип: Строка.
Пароль, используемый при стандартной аутентификации.

Доступность:

Сервер, толстый клиент, внешнее соединение.

ТОЛЬКО ЗАПИСЬ. Объяснить, почему?
3 Vladuha
 
29.02.12
17:59
Можно только поменять
4 PR
 
29.02.12
17:59
(0) Без палева так :))
5 Hmster
 
29.02.12
17:59
А подключиться по COM ?
6 Vladuha
 
29.02.12
18:02
(5) имхо единственный вариант
7 Dirk Diggler
 
29.02.12
18:04
(2) Дык в чем проблема? Метод Этопароль(Строка) возврашающий булево решил бы вопрос.
Надо быстро идентифицировать сотрудника на АРМ. Подбежал Вася, решил сделать нечто. Сведения об операции должны быть записаны в РС. Перелогиниваться долго. Было бы просто - выбрал себя в списке справочника Пользователи, быстро вколотил пароль или штрихкод подсунул, и дальше побежал.
8 PR
 
29.02.12
18:06
(7) Ну так и храни их в базе отдельно.
Или OLE.
9 Dirk Diggler
 
29.02.12
18:06
кого их? пароли?
10 Rie
 
29.02.12
18:06
(7) А зачем для этого пароль?
Прибежал Вася, подсунул штрих-код - в РС записалось: "приходил В.Пупкин, сделал ТО-ТО".
11 ShoGUN
 
29.02.12
18:07
(7) Классный метод, как раз для брутфорса :)))
12 Dirk Diggler
 
29.02.12
18:07
(10) Фамилия больше нравится. Тем более, это городить еще сопоставление штрихкодов с васями... Но если больше ничего не придумаю, так и сделаем...
13 Dirk Diggler
 
29.02.12
18:08
(11) Брутфорс на 1С? юморист.
14 PR
 
29.02.12
18:08
(9) Да
15 Stim
 
29.02.12
18:08
можно. подключаясь по ком
16 Dirk Diggler
 
29.02.12
18:09
(14) Ну их потом в ИБ как-то записывать надо, пользюк сам уже так просто его не сменит и т.п. Костылей я и сам придумаю... Ладно. Закрываем вопрос.
17 ShoGUN
 
29.02.12
18:14
(13) Учитывая "сложность" большинства паролей - запросто. Подобрать цифровой пароль из 8 цифр(дата рождения или ещё там какая) - в чём проблема?
18 Dirk Diggler
 
29.02.12
18:20
(17) а не проще прогеру просто заменить его? )
19 ShoGUN
 
29.02.12
18:23
(18) Палево. Поменяешь - назад не вернёшь, а значит не сможешь остаться незамеченным.
20 ShoGUN
 
29.02.12
18:24
Хотя навредить конечно можно - например нагенерить случайных GUID-ов и поставить их вместо паролей ВСЕМ пользователям ))
21 MM
 
29.02.12
18:28
(19) Устаревшие данные, смотрите свойство СохраняемоеЗначениеПароля, разумеется при наличии прав администратора или в привилегированном режиме.
22 ShoGUN
 
29.02.12
18:29
(21) Однако ж. Когда такое появилось?
23 ShoGUN
 
29.02.12
18:31
+(22) Тогда энто автору подходит на ура(правда сравнивать придётся хэши)
24 Dirk Diggler
 
29.02.12
18:37
(23) Хэш строки-то как получить?
25 Ахиллес
 
29.02.12
18:38
(21) И чего? Там хэш. А по какой хэш-функции он вычисляется ты знаешь?
(24) Да не мудри ты. Тебе уж 2 раза сказали, подключайся по COM. Дёшево и сердито.
26 Dirk Diggler
 
29.02.12
18:43
Да ладно. А если вот так:

ПользовательИнформационнойБазы = Вася;  // берем из поля ввода
Пароль = ПарольДляПроверки;
ХэшНастоящегоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;
НачатьТранзакцию();
ПользовательИнформационнойБазы.Пароль = Пароль;
ПользовательИнформационнойБазы.Записать();

ХешВведенногоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;

Если ХешВведенногоПароля = ХэшНастоящегоПароля Тогда
   ИПравдаВася = Истина;
Иначе
   ИПравдаВася = Ложь;
КонецЕсли;
ОтменитьТранзакцию();
27 PR
 
29.02.12
18:44
(24) Думаю, что никак, иначе все становится очень просто, я бы даже сказал ОЧЕНЬ просто :))
28 PR
 
29.02.12
18:45
+(27) Мда, хорошая такая дыра в 1С :))
29 ShoGUN
 
29.02.12
18:50
(25)(26) Всё проще, ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля доступно на чтение и запись. Примерно так:

ПользовательИнформационнойБазы = Вася;  // берем из поля ввода

Пароль = ПарольДляПроверки;
ХэшНастоящегоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;
ПользовательИнформационнойБазы.Пароль = Пароль;
ПользовательИнформационнойБазы.Записать();

ХешВведенногоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;

Если ХешВведенногоПароля = ХэшНастоящегоПароля Тогда
   ИПравдаВася = Истина;
Иначе
   ИПравдаВася = Ложь;
КонецЕсли;

ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля = ХэшНастоящегоПароля;
ПользовательИнформационнойБазы.Записать();

И транзакция не нужна...
30 Dirk Diggler
 
29.02.12
18:50
а с транзакцией не быстрее будет?
31 ShoGUN
 
29.02.12
18:52
(30) Если и будет, то несущественно.
33 PR
 
29.02.12
18:52
Интересно, а почему и чтение и запись для хеша непонятно?
34 ShoGUN
 
29.02.12
18:53
(33) Там есть подвох. Свойство доступно для пользователя с административными правами.
35 pumbaEO
 
29.02.12
18:55
т.е. с привелигированного модуля (вдруг там будет "Выполнить") не сработает?
36 ShoGUN
 
29.02.12
18:56
(35) Не знаю, попробуй, я 25 минут назад узнал об этой фигне :)
37 PR
 
29.02.12
18:59
(34) И что?
Я так думаю, что это из-за того, что можно менять пароль.
Но хеш я думаю хоть и записывается, но вычисляется сам.
38 ShoGUN
 
29.02.12
19:02
(37) Ну дырка это, для админов. С помощью этой дырки можно сохранять полностью список пользователей наружу куда-нибудь и обратно восстанавливать. При этом пароли не светятся.
39 PR
 
29.02.12
19:04
(38) Без записи пароля, через запись хеша?
40 pumbaEO
 
29.02.12
19:04
Интересный вопрос: хеш для одного и того же пользователя и пароля одинаковый для разных баз?
41 Dirk Diggler
 
29.02.12
19:06
конечно. Хэшируется-то только строка пароля.
42 ShoGUN
 
29.02.12
19:06
(39) Ну да, конечно. В никсах /etc/shadow так же сделан по идее.
43 pumbaEO
 
29.02.12
19:08
(42) нет, в никсах добавляется соль для каждого хеша случайная.
44 ShoGUN
 
29.02.12
19:10
(43) Чё-т я не понял, если соль случайная - как второй раз хэш вычислять при проверке пароля? :)
45 PR
 
29.02.12
19:11
(42) Разве из хеша можно получить пароль?
46 ShoGUN
 
29.02.12
19:13
(45) Нельзя(точней очень сложно), но это и не требуется. Проверка пароля - односторонняя операция, тебе не нужно получать пароль из хранимого хэша, тебе нужно получить хэш из введенной строки и сравнить его с хранимым. Это простейший случай, конечно, правильная защита работает не так.
47 pumbaEO
 
29.02.12
19:17
соль пишется в /etc/shadow просто, для одного и того же пароля хеш и соль будет всегда разные, заранее набить табличку соответствия ключей хеш и пароль нереально получаеться. Т.е. к тебе попала запись из /etc/shadow брутфорсить надо заново.
Вот и мне интерестно, если создать в двух разных базах 1-го пользователя и пароль один и тот же, будет ли совпадать хеши.
48 ShoGUN
 
29.02.12
19:18
(47) Кстати да, интересно. Попробуй.
49 ShoGUN
 
29.02.12
19:23
Кстати, ещё одна причина, по которой Пароль доступен только на запись - он просто не хранится в бд, хранится только хэш.
50 pumbaEO
 
29.02.12
19:29
Все печально - хеш вычисляется только для пароля, не зависит от базы и имени пользователя.  
Ну в принципе это и не удивительно, если в 1С для пароля нету зависимости от регистра и больше чем 14 или 10 не отрабатываются.

Так что берегите хеши директоров, а то злобные хакеры...
51 MM
 
29.02.12
19:38
(50) Я вам ещё один секрет открою, там хранится не один хеш, а два. Причём первый рассчитан от пароля приведённого к верхнему регистру, чтобы брутфорс упростить. :)
52 pumbaEO
 
29.02.12
19:40
NWoZK3kTsExUV00Ywo1G5jlUKKs=,NWoZK3kTsExUV00Ywo1G5jlUKKs= - я на 1 баловался. :)
53 PR
 
29.02.12
20:48
(26) Кстати, не работает :))
Надо так:


ПользовательИнформационнойБазы = ПользователиИнформационнойБазы.НайтиПоИмени(Пользователь);

Если ПользовательИнформационнойБазы = Неопределено Тогда
   Предупреждение("Пользователь с таким именем не найден.");
Иначе
   
   ХэшНастоящегоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;
   
   НачатьТранзакцию();
   
   ПользовательИнформационнойБазы.Пароль = Пароль;
   ПользовательИнформационнойБазы.Записать();
   
   ХешВведенногоПароля = ПользователиИнформационнойБазы.НайтиПоИмени(Пользователь).СохраняемоеЗначениеПароля;

   ОтменитьТранзакцию();
   
   Если ХешВведенногоПароля = ХэшНастоящегоПароля Тогда
       Предупреждение("Пароль верный (" + ХешВведенногоПароля + ").");
   Иначе
       Предупреждение("Пароль не верный.");
   КонецЕсли;
   
КонецЕсли;


Пользователя нужно заново в базе искать, иначе хеш старый.
54 MMF
 
01.03.12
13:13
кстати, странная идея у 1С-ников насчет хранения 2-х хешей пароля (приведенного к верхнему регистру).
55 pumbaEO
 
01.03.12
13:15
Почему странная, в 1С пароли регистронезависимые.
56 pumbaEO
 
01.03.12
13:16
ой, бред, согласен странная. Зачем 2 если все равно пароль не зависит от регистра.
57 MMF
 
01.03.12
13:34
Можно легко сделать подмену пароля выбранных юзеров на какой-нить "123" и восстановление на старое значение после входа. Осуществить мечту зловредителей: зайти под недругом и напакостить в базе. К тому же часто пароли хранятся даже не в виде хеша, а в открытом виде в базах с длительной историей. Или пропатчить саму 1С, поскольку клиент проверяет можно ли ему заходить, а не сервер
58 Stim
 
01.03.12
13:35
(53) так и до брутфорса недалеко)
59 pumbaEO
 
01.03.12
13:38
тут вроде sha1, а таблички уже набиты ... какой же тут брутфорса, получил хеш 1С вбил в инете - получил пароль.
60 MMF
 
01.03.12
13:46
(59) таблички набиты для цифр и осмысленных слов
61 Vladal
 
30.03.12
13:47
(26) Конструкцию

Если ХешВведенногоПароля = ХэшНастоящегоПароля Тогда
   ИПравдаВася = Истина;
Иначе
   ИПравдаВася = Ложь;
КонецЕсли;

Можно записать в одну строку:

ИПравдаВася = ХешВведенногоПароля = ХэшНастоящегоПароля;
62 TimonXPumbA
 
16.07.12
15:34
Собственно сам подбор можно описать так, может еще кто нибудь подскажет, как улучшить?

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Слово = /"/";
   КоличествоПроходов = 10;
   Симв = /"1234567890/";
   ДлинаСимволов = СтрДлина(Симв);
   ОчиститьСообщения();
   Сообщить(/"Начало: /" ТекущаяДата());
   Сообщить(/"Вариантов: /"  pow(ДлинаСимволов,КоличествоПроходов));

   Рекурсия(КоличествоПроходов);
   
   Сообщить(/"Конец: /" ТекущаяДата());
КонецПроцедуры

Процедура Рекурсия(Разрядность)
   
   
   Для Н = 1 По ДлинаСимволов Цикл
       Слово = Слово   Сред(Симв,Н,1);
       Если Разрядность <> 1 Тогда
           Рекурсия(Разрядность - 1);
       КонецЕсли;
       
       ОбработкаПрерыванияПользователя();
       
       //Собственно
       Сообщить(Слово);
       //
       
       Слово = Лев(Слово,СтрДлина(Слово)-1);
   КонецЦикла;
       
   
   
КонецПроцедуры
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший