Риск безопасности одноразового пароля - PullRequest
4 голосов
/ 10 октября 2011

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

Спасибо

Ответы [ 8 ]

4 голосов
/ 10 октября 2011

Просто используйте случайный пароль без шаблонов.Преимущество заключается в том, что вы можете сделать пароль длиннее, если он щелкает по почте, потому что пользователю не нужно его вводить.

3 голосов
/ 10 октября 2011

Я предполагаю, что из описания вашего вопроса, который вы генерируете "одноразовый пароль", на самом деле является некой формой грубого шифрования, когда вы обращаете процесс, чтобы выяснить, к какой учетной записи они относятся.

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

3 голосов
/ 10 октября 2011

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

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

import java.security.SecureRandom;
import java.util.Random;

class Test {

    public static String generatePassword() {
        String chars = "abcdefghijklmnopqrstuvwxyz"
                     + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                     + "0123456789!@%$%&^?|~'\"#+="
                     + "\\*/.,:;[]()-_<>";

        final int PW_LENGTH = 20;
        Random rnd = new SecureRandom();
        StringBuilder pass = new StringBuilder();
        for (int i = 0; i < PW_LENGTH; i++)
            pass.append(chars.charAt(rnd.nextInt(chars.length())));
        return pass.toString();
    }

    public static void main(String[] args) {
        System.out.println(generatePassword());
        System.out.println(generatePassword());
        System.out.println(generatePassword());
    }
}

Выход:

Qp';Md#93Dxh\0|%%Ny7
oqvntn2).~W@%P'EM*AS
WEo2sz2Sm~a'm=Ss&Lu[

2 голосов
/ 11 октября 2011

Не делай этого.Отправьте им URL-ссылку с огромным паролем (защитным билетом) в нем в качестве аргумента URL-адреса и установите свой конец так, чтобы, если этот аргумент присутствовал и был правильным (i), они вошли в систему и (ii)срок действия UUID прекращается либо сразу, либо в течение дня или двух с момента его отправки.Может потребоваться немного времени, в зависимости от вашего контейнера, но это гораздо более безопасно.Я использую java.util.UUID для этого, красиво и долго.

2 голосов
/ 10 октября 2011

Генерация ваших паролей с использованием источника с высокой энтропией - в Unix try / dev / urandom - который эффективно предоставит вам одноразовые пароли.

1 голос
/ 10 октября 2011

Вы правы, у вас есть большая дыра в безопасности, но вы обнаружили не ту дыру!

Ваша проблема в том, что вы отправляете электронное письмо - электронная почта не защищена.

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

Одна хитрость, которую я видел, - спрашивать у пользователя номер Paypal или номер банковского счета. Затем вы делаете несколько депозитов на случайные суммы. Таким образом, они видят депозиты, скажем, за 34, 91 и 82 цента. Затем они используют эти цифры в качестве пароля! Довольно умно, да?

0 голосов
/ 18 ноября 2017

Наличие 6-значного случайного числа в качестве OTP не является угрозой безопасности , если вы отключаете OTP после первого использования . Угадать 6-значное число за одну попытку невозможно. А так как вы получаете только одну попытку, грубой силой тоже не о чем беспокоиться. Просто убедитесь, что вы генерируете действительно случайное число, например используя SecureRandom.

Итак, какие шаги нужно предпринять:

  1. Элемент списка
  2. Генерация 6-значного случайного числа OTP
  3. Соотнесите его с учетной записью (например, пользователь вводит электронную почту и OTP)
  4. При каждой попытке авторизации данного электронного письма пользователя отменять OTP, независимо от того, был ли вход успешным или нет

Используя Java, вы можете использовать следующий метод для генерации OTP:

public static final String getOTP(int length) {

    Random r = new SecureRandom();
    return String.valueOf(r.nextInt((int)Math.pow(10, length)));
}

Надеюсь, что это имеет смысл.

0 голосов
/ 10 октября 2011

Реализация одноразового пароля, который невозможно угадать в вычислительном отношении.

Например, используйте генератор случайных строк для генерации строки длиной 15 символов, используя пул заглавных букв, строчных букв ичисла.

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

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