Как шифровать передачу и хранить пароли пользователей

внешний интерфейс алгоритм Безопасность хакер

зачем писать эту статью

Недавно Github был разоблачен, и открытый пароль был записан во внутренний журнал.

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

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

зашифрованная передача

Существует два основных типа шифрования: симметричное шифрование и асимметричное шифрование.

Симметричное шифрование

Симметричное шифрование: для шифрования и дешифрования используется один и тот же ключ.

Режимы симметричного шифрования:

  • Сторона А выбирает определенное правило шифрования для шифрования информации.
  • Сторона Б использует те же правила для расшифровки информации.

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

Асимметричное шифрование

Асимметричное шифрование: для шифрования и дешифрования требуются два ключа: открытый ключ (открытый ключ, называемый открытым ключом) и закрытый ключ (закрытый ключ, называемый закрытым ключом).

Режим асимметричного шифрования:

  • Сторона B генерирует два ключа (открытый ключ и закрытый ключ). Открытый ключ является общедоступным и может быть получен кем угодно, а закрытый ключ держится в секрете.
  • Сторона А получает открытый ключ Стороны Б, а затем использует его для шифрования информации.
  • Сторона Б получает зашифрованную информацию и расшифровывает ее с помощью закрытого ключа.

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

RSA

Наиболее классическим алгоритмом асимметричного шифрования является алгоритм RSA.

Алгоритм шифрования с открытым ключом RSA был предложен в 1977 году Роном Ривестом, Ади Шамиром и Леонардом Адлеманом. Открытый ключ и закрытый ключ появляются парами, и шифрование с одним может быть расшифровано только с помощью другого, обычно с шифрованием с открытым ключом и дешифрованием с закрытым ключом.

Почему RSA может выполнять асимметричное шифрование?

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

Проще говоря, принцип, используемый RSA, заключается в том, что если произведение двух взаимно простых положительных целых чисел достаточно велико, его чрезвычайно трудно разложить на множители (самый длинный ключ RSA, который был взломан в настоящее время, составляет 768 двоичных битов, в то время как обычное использование ключа не менее 1024 бит).

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

Как войти на гитхаб

Принцип шифрования и дешифрования на уровне передачи практически одинаков, давайте посмотрим, как github передает пароли от аккаунтов.

Я схватил пакет и посмотрел запрос на вход в систему, я обнаружил, что пароль был передан в открытом виде...

image

Итак, безопасен ли этот метод передачи? Это нормально, потому что используется https, но это недостаточно безопасно.

http и https

Для обычных http-запросов вся информация передается в виде простого текста, и пока посредник перехватит любой этап ссылки, это принесет три основных риска:

  • Подслушивание: Третьи стороны могут узнать содержание сообщений.
  • Фальсификация: Третьи стороны могут изменять содержание сообщений.
  • Притворство: третья сторона может выдавать себя за другое лицо, чтобы участвовать в общении.

Как решить эти проблемы? Используйте https.

https можно рассматривать как http + TLS TLS — это протокол шифрования транспортного уровня, а его предшественником является протокол SSL.Если не указано иное, и SSL, и TLS — это один и тот же протокол.

Протокол SSL/TLS предназначен для устранения трех основных рисков, связанных с http, в надежде достичь:

  • Шифрование контента. Вся информация передается в зашифрованном виде и не может быть перехвачена третьими лицами.
  • Аутентификация. Оснащен сертификатом удостоверения личности для предотвращения олицетворения личности. Даже если DNS перехвачен на сторонний сайт, пользователи будут предупреждены о возможности перехвата.
  • целостность данных. Предотвратите олицетворение содержимого или его подделку третьими лицами. С механизмом проверки, как только он будет подделан, обе стороны в общении сразу обнаружат его.

Сказав все это, что делает https? В сочетании со следующей блок-схемой объясните, что происходит с запросом https:

image

  1. Клиент инициирует https-запрос

  2. конфигурация сервера

Как правило, вам нужно обратиться за сертификатом в авторитетную организацию (вы также можете сделать его самостоятельно, что будет рассмотрено в атаке «человек посередине» позже, разница в том, что сертификат, выданный вами, должен быть проверен клиентом, прежде чем вы сможете продолжить доступ, и для подачи заявки используется доверенная компания.Сертификат запрашиваться не будет), сертификат сгенерирует пару открытого ключа A и закрытого ключа B, используемую для шифрования RSA.

  1. отправить сертификат

Основным содержимым этого сертификата является открытый ключ A, а также другая информация, такая как орган, выдавший сертификат, время истечения срока действия и т. д.

  1. Сертификат разбора клиента

Это делается с помощью TLS клиента, в основном для проверки того, действителен ли открытый ключ A, например, орган выдачи, время истечения срока действия и т. д. Если обнаружено исключение, появится окно с предупреждением, указывающее, что существует проблема с сертификат. Если с сертификатом проблем нет, то генерируется случайное значение. После этого запускается процесс асимметричного шифрования: сначала случайное значение шифруется сертификатом.

  1. Отправить зашифрованную информацию

Эта часть передает случайное значение, зашифрованное с помощью сертификата. Цель состоит в том, чтобы позволить серверу получить это случайное значение, и все последующие данные могут использовать это случайное значение (то есть закрытый ключ C) для симметричного шифрования и дешифрования.

  1. Информация о расшифровке сервера

После того, как сервер расшифрует закрытый ключ B, он получит отправленный клиентом закрытый ключ C. На этом процесс асимметричного шифрования RSA завершен.

  1. Передача зашифрованной информации

Сервер шифрует информацию закрытым ключом C.

  1. Информация о расшифровке клиента

Клиент расшифровывает информацию, отправленную сервером, с помощью ранее сгенерированного закрытого ключа C и получает расшифрованное содержимое. В течение всего процесса, даже если третья сторона отслеживает данные, они ничего не могут сделать.

Атака «человек посередине» (MITM)

Описанный выше процесс кажется безупречным? Нет, потому что "люди" - самое уязвимое звено в системе безопасности.

Безопасность информации https полностью основана на надежности сертификата.Что, если посредник подделает сертификат?

Собственный поддельный сертификат хакера должен быть проверен клиентом, прежде чем он сможет продолжить доступ.Пока проверка клиента пройдена, открытый ключ A, закрытый ключ B и закрытый ключ C прозрачны для хакера, и существует никакой защиты данных вообще. , поэтому хакерам нужно только побудить пользователей установить свои собственные поддельные сертификаты, например, используя различные фишинговые неописуемые веб-сайты.

Таким образом, даже использование https для передачи паролей в виде открытого текста не является абсолютно безопасным. Итак, как мы можем обеспечить безопасность пароля?

Способ входа в Baidu

Захватите пакет и посмотрите на запрос входа Baidu и обнаружите, что пароль зашифрован:

image

Как это зашифровано? Мы обнаружили, что есть такой ключевой запрос:

image

Это означает, что пароль шифруется и расшифровывается с использованием RSA. Итак, на что похож этот процесс?

Проверено github, ключевое слово RSA, библиотека JavaScript с наибольшим количеством звездjsencrypt, я был приятно удивлен, обнаружив, что метод шифрования входа в систему Baidu и используемое имя функции соответствуют этой библиотеке. Можем ли мы смело предположить, что весь процесс запроса входа в Baidu в основном такой же, как и в этой библиотеке с открытым исходным кодом? процесс jsencrypt?

image

зашифрованное хранилище

На этом процесс зашифрованной передачи завершен, и теперь сервер получил настоящий пароль пользователя (расшифрованный), так как же сохранить этот пароль?

Никогда не храните пароли в открытом виде

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

Зашифровать пароль с помощью хеш-алгоритма

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

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

Для шифрования часто используются алгоритмы серии MD5 и SHA (такие как SHA1, SHA256, SHA384, SHA512 и т. д.).

Хотя хэширование может повысить безопасность хранения паролей, оно все еще недостаточно безопасно.

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

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

Добавьте «соль» для повышения безопасности

Соль: случайная строка Добавление соли к открытому паролю означает объединение открытого текста со случайной строкой.

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

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

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

Используйте BCrypt или PBKDF2, чтобы увеличить сложность взлома

Для борьбы с брутфорсом нужны очень трудоемкие и не очень эффективные алгоритмы хеширования. Появились алгоритмы BCrypt и PBKDF2.

Самая большая особенность этих двух алгоритмов заключается в том, что мы можем установить количество повторных вычислений через параметры, Чем больше повторяющихся вычислений, тем дольше время. Если для вычисления хеш-значения требуется 1 секунда или более, хакерам будет практически невозможно использовать метод непредвиденных обстоятельств для взлома паролей. Требуется 11,5 дней, чтобы взломать 6-значный чистый числовой пароль, не говоря уже о пароле с высокой степенью защиты.

Суммировать

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

  • использовать https-запрос
  • Шифрование паролей и передача данных с помощью RSA
  • Одностороннее шифрование с помощью BCrypt или PBKDF2 и хранилище

над.