Здравствуйте. Раскритикуйте, пожалуйста решение. Меня интересует только вопрос безопасности (то есть не надо флудить, пожалуйста о цене и др. и пр.) сейчас: имеется база данных и клиентское приложение. Пользователь получает доступ после ввода правильного пароля. Но пароль можно подглядеть, перехватить по сети итд. как будет: Каждый пользователь получает смарт-карту. Для того, чтобы получить доступ к приложению нужно ее вставить в ридер. Тогда происходит взаимная аутентификация следующим образом: *карта генерирует случайное число RNDc (8 байт) *сервер шифрует это число по алгоритму 3DES (ключ 16 байт), получаем RNDcTk *сервер генерирует свое случайное число RNDt *RNDcTk и RNDt передаются карте *карта расшифровывает RNDcTk и сравнивает его с RNDc. если не совпадают, то exit *если карта нас впустила, то она передает серверу зашифрованное RNDt (ключ 16 байт) *сервер расшифровывает и также сравнивает. если совпали, то карта хорошая дальше пользователь вводит PIN-код (это сделано, если карту украдут или перепутают): #если PIN верный, то карта даст доступ к файлу, в котором хранится GUID пользователя #этот GUID идет серверу, который определяет по GUID-у права пользователя Будем считать, что злоумышленник постоянно прослушивает канал от сервера до карты, он может исследовать клиентское приложение под отладчиком. Он ваще крут. Но он не знает двух ключей, которыми шифруются RNDc и RNDt. Оборудование, которым можно вытащить ключи из карты он не имеет. Утащить с сервера ключи он тоже не может. Надежно ли это? Можно перехватить GUID любого пользователя и подсовывать его, чтобы получать нужные права. Над этим подумаю (за умные мысли буду благодарен). Вопрос в том, нормально ли продуман процесс взаимной аутентификации? я считаю, что даже имея корректную карту, но не зная ключей, невозможно изготовить новую карту, либо вмешаться в обмен с сервером и доказать ему, что мы хороший пользователь.
#если PIN верный, то карта даст доступ к файлу, в котором хранится GUID пользователя #этот GUID идет серверу, который определяет по GUID-у права пользователя Пункт с гуидом чтоб небыл статичен можно оформить в виде *сервер генерирует свое случайное число RNDt *RNDcTk и RNDt передаются карте Тоесть с сервера приходит рандомное число которым шифруется GUID и передается назад серверу для проверки, сервер зная число расшифровывает и проверяет. Тким образом Guid если перехвтить действителен только одну сессию. Из всех систем аутентификации мне больше всего защищенной кажется система с наличием мобильного телефона. У пользователя есть Логин: Номер телефона пароль: личный пароль (указан при регистрации) Для логина в систему пользователь вводит свои данные, дальше на мобильный телефон приходит код который нужно ввести для подтверждения авторизации. таким образом, чтоб получить доступ нужно украсть логин, пароль еще и номер телефона. Есть конечно и минуса, это затраты на систему сообщений.
PaCHER число идущее с сервера можно перехватить. Имхо, шифровать лучше какими нить боле-мене статичными динамическими данными типа текущей даты, можно, также, алгоритм шифровки менять по дням недели или фазам луны.
PaCHER, _basmp_, спасибо, что ответили. как, правильно, заметил _basmp_ число можно перехватить. Более того, злоумышленником может быть тот же пользователь программы, тогда он просто глянет это число в отладчике и зашифрует GUID. Да, это интересно. Но по условию я работаю со смарт-картами ACOS3. По условию злоумышленник знает все алгоритмы. Безопасно можно шифровать только на сервере. Линия передачи и все данные, которые приходят клиентскому приложению прослушиваются. По канонам криптографии безопасность должна основываться только на незнании ключей, всякие изворачивания и ухищрения просто оттягивают время. Я немного изменил схему. Теперь GUID в безопасности. Показал начальнику, он одобрил. Схема: 1) юзер вводит PIN (это надо, чтобы менеджеры не путали свои карты и не воровали) 2) если PIN правильный, карта открывает доступ к файлу с ключем USER_KEY (16 байт) 3) этот ключ вместе с RNDc передается серверу 4) сервер шифрует ключем USER_KEY терминальный ключ. Получаем (Tk # USER_KEY) 5) сервер шифрует полученным ключем RNDc. получаем RNDc # (Tk # USER_KEY) 6) сервер передает RNDc # (Tk # USER_KEY) карте. Плюс он передает RNDt 7) в карте изначально хранится ключ (Tk # USER_KEY), которым она расшифровывет присланное значение и сравнивает его, если не совпадает, то exit 8) карта шифрует RNDt еще одним ключем и посылает его серверу 9) сервер расшифровывает и сравнивает Также жду критики и намеков на малейшие слабые места. спасибо. Прилагаю файл с наглядной иллюстрацией (pdf, 20 kb) Примечание: Session_key это ключ, который вычисляется на основе терминального ключа, ключа карты, RNDc и RNDt
А может стоит попробовать senselock (сертифицирован по стандарту eal5+)? В своё время нам так и не смогли его вскрыть даже учитывая неплохое финансирование затеи. Попросту гарантий никто дать не мог и в конечном итоге всё свелось к min сумме 50k зелени и нам ВЕРОЯТНО вскрыли бы прошивку/алгоритм_работы одного ключа. А при правильной реализации, даже этот вариант для Вас будет не страшен.