2015-02-15 3 views
3

Я пытаюсь использовать SRP алгоритм, но у меня есть несколько вопросов:Вопросов алгоритма SRP

  1. является то, что хороший выбор, чтобы использовать для регистрации и авторизации алгоритма SRP с SSL/TLS? А для всей другой передачи, используя только SSL/TLS? Я буду использовать C# Sockets для реализации.

  2. Как сгенерировать g, k, N? Можно ли использовать эти константы приложения?

  3. Правильно ли это алгоритм SRP?

    // М-модуль, г-генератор, к-мультипликатор, I-имя пользователя, р-пароль, втор-соль, v проход верификатор

    Регистрация:

    Client : s = randomString(); x = Hash (s, p); v = g^x% N;

    sendToServer (I, s, v);

    save (I, s, v);

    Авторизация:

    Клиент: а = случайная(); A = g^a% N;

    sendToServer (I, A);

    Сервер: если (A!= 0) {b = random(); B = k * v + g^b% N;}

    sendToClient (B, s);

    u = Хеш (A, B);

    if (u == 0) abortConnection();

    Клиент: if (B == 0) abortConnection();

    u = Хеш (A, B);

    if (u == 0) abortConnection();

    x = Хеш (с, р);

    S = ((B - k * (g^x% N))^(a + u * x))% N;

    K = Hash (S);

    Mc = Hash (Hash (N) XOR Hash (g), Hash (I), s, A, B, K);

    sendToServer (M);

    Сервер: S = ((A * (v^u% N))^B)% N; K = Hash (S);

    Ms = Hash (Hash (N) XOR Hash (g), Hash (I), s, A, B, K);

    если (Mc == Ms) {Rs = Hash (A, M, K); sendToClient (Rs);}

    Клиент: Rc = Hash (A, M, K);

    if (Rc == Rs) ALL_OK();

+0

Для большинства приложений я бы не стал беспокоиться о SRP. Положите свои усилия на правильную проверку сертификата/открытого ключа сервера, а затем просто отправьте пароль простым в TLS. – CodesInChaos

+0

@CodesInChaos, так что вы думаете, что правильно настроенного TLS будет достаточно? –

+1

Это было также опубликовано на нем безопасность. Пожалуйста, не размещайте сообщения на нескольких сайтах. – mikeazo

ответ

2

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

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

Итак, в свете моего ответа, взгляните на библиотеку http://bouncycastle.org/, которая должна обеспечить реализацию протокола SRP.

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

+0

Спасибо! Доступен ли SRP в API-интерфейсе bouncycastle? –

+0

Да, см. Http://www.bouncycastle.org/csharp/: «Версия 1.5: добавлена ​​поддержка протокола SRP-6a». – Augustin

0

OpenSSL имеет TLS-SRP.

Для получения значений, которые вы ищите, читайте RFC 5054.

  • N, g и k не обязательно должны быть секретными.
  • Плохо выбранные N и g могут поставить под угрозу безопасность криптографических расчетов , поэтому вы должны знать, что вы делаете , или выбрать значения, рекомендованные в RFC.
  • k, рассчитывается из N и g, поэтому, как только вы их выбираете, вы можете получить k.

Если вы заинтересованы в реализации деталей SRP, у Google есть код, доступный на C - Google csrp code.

Смежные вопросы