anight
Новичок
Цифровые подписи - HOWTO
DiMA wrote:
> Ну что, поговорили и забыли? Некий товарищ с высоты своих знаний
> заявил, что тут изобретен велосипед (хотя изобретать то и нечего - все
> очевидно из свойств функции md5) и более ничего не уточнил.
я рад, что мою высоту знаний оценил аж DiMA
как и обещал - уточняю.
maxim wrote:
> а если кратко, то в чем суть цифровых подписей? как их использовать?
ээ.. попробую на простом примере:
допустим есть сервер, на нем n зарегистрированных пользователей
каждый пользователь может менять информацию о себе и только о себе.
форма, через которую это делается должна содержать два hidden поля - логин и пароль этого пользователя.
после отсылки формы сервер проверяет логин и пароль - СВЕРЯЕТСЯ С БАЗОЙ ДАННЫХ (важно!) - и если все ок - записывает изменения.
в данном примере пароль является необходимым, т.к. подтверждает что
пользователь тот, за кого он себя выдает.
а теперь пример этой же задачи, но с применением цифровых подписей.
форма содержит 2 hidden поля: логин и цифровую подпись этого логина - пароль вообще не нужен
для генерации цифровой подписи сервер может использовать примерно такую
формулу:
$sign = md5($login . "SoMeSuPeRdIfFiCuLtPaSsWoRd"
а проверять ее так:
if (md5($login_from_form . "SoMeSuPeRdIfFiCuLtPaSsWoRd" != $sign_from_form)
{ /* auth failed */ }
else
{ /* go on */ }
с одной стороны разницы никакой, но в случае авторизации с цифровой подписью
серверу не нужно лазить в базу чтобы проверить
есть ли там такой логин и пароль. и это принципиальное отличие.
сервер МОЖЕТ АВТОРИЗОВАТЬ КЛИЕНТА исходя исключительно из данных формы!
т.е. сервер "подписал" логин пользователя. и пользователь в принципе не
может подделать эту подпись, разве что перебором 128 - битной md5.
для авторизации, обсуждавшийся тут
http://phptalk.unet.ru/p/read.php?f=1&i=21007&t=21007
(собственно, с чего разговор и начался)
подошел бы следующий алгоритм:
1) сервер генерирует случайное 128 битное число $random и отсылает его
клиенту.
2) клиент на javascript получает $client_md5 = md5($client_password .
$random)
3) сервер проверяет его:
if (md5($server_password . $random) == $client_md5)
{ /* go on */ }
else
{ /* auth failed */ }
эта схема не оставляет надежд тому, кто будет пытаться совершить атаку путем
перехвата http трафика.
однако для пущей безопасности можно добавить то, что предложил DiMA: а
именно добавлять в аргумент md5 кроме random - время.
[... to be continued ...]
DiMA wrote:
> Ну что, поговорили и забыли? Некий товарищ с высоты своих знаний
> заявил, что тут изобретен велосипед (хотя изобретать то и нечего - все
> очевидно из свойств функции md5) и более ничего не уточнил.
я рад, что мою высоту знаний оценил аж DiMA
как и обещал - уточняю.
maxim wrote:
> а если кратко, то в чем суть цифровых подписей? как их использовать?
ээ.. попробую на простом примере:
допустим есть сервер, на нем n зарегистрированных пользователей
каждый пользователь может менять информацию о себе и только о себе.
форма, через которую это делается должна содержать два hidden поля - логин и пароль этого пользователя.
после отсылки формы сервер проверяет логин и пароль - СВЕРЯЕТСЯ С БАЗОЙ ДАННЫХ (важно!) - и если все ок - записывает изменения.
в данном примере пароль является необходимым, т.к. подтверждает что
пользователь тот, за кого он себя выдает.
а теперь пример этой же задачи, но с применением цифровых подписей.
форма содержит 2 hidden поля: логин и цифровую подпись этого логина - пароль вообще не нужен
для генерации цифровой подписи сервер может использовать примерно такую
формулу:
$sign = md5($login . "SoMeSuPeRdIfFiCuLtPaSsWoRd"
а проверять ее так:
if (md5($login_from_form . "SoMeSuPeRdIfFiCuLtPaSsWoRd" != $sign_from_form)
{ /* auth failed */ }
else
{ /* go on */ }
с одной стороны разницы никакой, но в случае авторизации с цифровой подписью
серверу не нужно лазить в базу чтобы проверить
есть ли там такой логин и пароль. и это принципиальное отличие.
сервер МОЖЕТ АВТОРИЗОВАТЬ КЛИЕНТА исходя исключительно из данных формы!
т.е. сервер "подписал" логин пользователя. и пользователь в принципе не
может подделать эту подпись, разве что перебором 128 - битной md5.
для авторизации, обсуждавшийся тут
http://phptalk.unet.ru/p/read.php?f=1&i=21007&t=21007
(собственно, с чего разговор и начался)
подошел бы следующий алгоритм:
1) сервер генерирует случайное 128 битное число $random и отсылает его
клиенту.
2) клиент на javascript получает $client_md5 = md5($client_password .
$random)
3) сервер проверяет его:
if (md5($server_password . $random) == $client_md5)
{ /* go on */ }
else
{ /* auth failed */ }
эта схема не оставляет надежд тому, кто будет пытаться совершить атаку путем
перехвата http трафика.
однако для пущей безопасности можно добавить то, что предложил DiMA: а
именно добавлять в аргумент md5 кроме random - время.
[... to be continued ...]