алгоритм одноразового пароля (как математический, так и основанный на времени и действии) - PullRequest
2 голосов
/ 20 декабря 2011

Я пытаюсь разработать веб-сайт и соответствующую вспомогательную программу (установленную на компьютере пользователя).Веб-сайт и программа будут взаимодействовать друг с другом (в основном AJAX), но это будет представлять серьезную угрозу безопасности, если любая другая веб-страница может отправлять запросы программе.Я хочу найти решение, которое чрезвычайно затрудняет внедрение запросов на мошенничество в мою программу (установленную на компьютере пользователя).Мои мысли о том, чтобы использовать одноразовые пароли, но у меня ограниченные знания в области безопасности, и поэтому я прошу у вас ваши мысли.

Я придумал этот алгоритм одноразового пароля (псевдо):

function otp(seed, counter, unix_timestamp, action)
{
    for(i = 0; i < counter; ++i)
    {
        seed = sha256(seed + i);
    }
    str = seed;

    str = sha256(str + unix_timestamp/60);
    str = sha256(str + action);
    otp = substr(str,0,4); //Convert the first for bytes to an int.
    return (int)otp;
}

Он должен иметь следующие свойства:

  • Может использоваться только один раз, (На каждом поколении otp будет увеличиваться "счетчик" => новое семя)
  • Будетизменяться каждую минуту (зависит от времени).
  • Привязан к действию (логин, ...), зависит от конкретного действия.
  • Может быть легко сгенерирован отдельно и позже может бытьсинхронизированы.

Если каждый запрос содержит код OTP и значение счетчика, это безопасно?Если нет, каковы ваши советы для достижения этой цели?Я действительно хочу все те свойства, которые я упомянул выше.

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 20 декабря 2011

Ваш подход разумен в принципе.Имейте в виду, однако, что множественные вызовы вашей хэш-функции не имеют смысла - либо они безопасны при первом проходе, либо вовсе не безопасны.Кроме того, вы прямо сейчас используете только начальное число для фактической аутентификации запросов (что-либо еще будет известно потенциальному злоумышленнику), и любая слабость в начальном поколении становится недостатком в аутентификации.

Я не знаюиз конкретных недостатков SHA256.Тем не менее, ваша проблема в целом довольно распространена и ее гораздо проще описать и решить стандартными терминами.Вы хотите аутентифицировать запрос к вашей программе.Ваша удаленная программа должна надежно определить подлинность запроса.Эту проблему легче всего решить с помощью криптографии с открытым ключом.Например, создайте пару ключей GnuPG , сохраните закрытый ключ на своем веб-сайте, распространите открытый ключ вместе с вашей программой и подпишите любую команду, которую вы отправите программе, с помощью закрытого ключа.Клиентская программа обычно получает запросы и проверяет их подлинность только через один вызов GnuPG.

4 голосов
/ 21 декабря 2011

Для этого уже существует стандарт, называемый HOTP ( RFC 4226 ). Вы должны использовать это, а не изобретать велосипед, поскольку его проверяли люди с большим опытом в криптографии, чем мы.

Вы не указали, кто ваши противники; если они являются пользователями своей машины, имейте в виду, что в действительности невозможно предотвратить их компрометацию любой схемы, которую вы хотите придумать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...