Основы для программистов: Как безопасно передавать и хранить пароли пользователей?

Java Безопасность

предисловие

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

публика:"маленький мальчик собирает улиток"(Для совместного обсуждения вопросов передачи и хранения паролей)

1. Как безопасно передать пароль пользователя

Чтобы запретить пользовательские пароли работать в Интернете, мы можем легко подумать об использовании протокола https.Давайте сначала рассмотрим знания о https~

1.1 HTTPS-протокол

  • "Три риска http"

Зачем использовать протокол https?"http это не ароматный"• Потому что http — это передача информации в открытом виде. Если вы используете протокол http в огромном сетевом океане, существуют следующие три риска:

  • Риск прослушивания/сниффинга: данные связи могут быть перехвачены третьими лицами.
  • Риск подделки данных: после того, как третья сторона получит данные связи, она злонамеренно изменит их.
  • Риск подделки личных данных: третьи лица могут выдавать себя за других для участия в общении.

Это нормально, если вы передаете неважную информацию, но ужасно передавать конфиденциальную информацию, такую ​​как пароли пользователей. Так что обычно используйте"https-протокол"Передача информации о пароле пользователя.

  • "принцип https"

Каков принцип HTTPS? Почему он может устранить три основных риска HTTP?

https = http + SSL/TLS, SSL/TLS — это протокол шифрования транспортного уровня, который обеспечивает шифрование контента, аутентификацию личности и проверку целостности данных для решения проблемы безопасности при передаче данных.

Для того, чтобы углубить понимание принципа https, давайте рассмотрим его вместе"Полный процесс запроса https"Давайте

    1. Клиент инициирует https-запрос
    1. На сервере должен быть набор цифровых сертификатов, которые можно изготовить самостоятельно или обратиться в центр. Этот сертификат на самом деле представляет собой пару открытого и закрытого ключей.
    1. Сервер отправляет клиенту собственный цифровой сертификат (содержащий открытый ключ, центр сертификации и т. д.).
    1. После того, как клиент получит цифровой сертификат с сервера, он проверит его, в основном, чтобы проверить, действителен ли открытый ключ, например, орган, выдавший сертификат, срок действия и т. д. Если он не пройдет, появится окно с предупреждением. Если с сертификатом проблем нет, сгенерируйте ключ (ключ алгоритма симметричного шифрования, который на самом деле является случайным значением) и зашифруйте случайное значение открытым ключом сертификата.
    1. Клиент инициирует второй запрос в https и отправит зашифрованный клиентский ключ (случайное значение) на сервер.
    1. После того, как сервер получит ключ, отправленный клиентом, он асимметрично расшифрует его с помощью собственного закрытого ключа, получит ключ клиента после расшифровки, а затем использует ключ клиента для симметричного шифрования возвращенных данных, чтобы данные стали зашифрованным текстом.
    1. Сервер возвращает зашифрованный зашифрованный текст клиенту.
    1. Клиент получает зашифрованный текст, возвращенный сервером, и симметрично расшифровывает его своим собственным ключом (клиентским ключом), чтобы получить данные, возвращенные сервером.
  • "Обязательно ли защищен протокол https?"

В процессе передачи данных https данные находятся в зашифрованном тексте.Так безопасно ли использовать протокол https для передачи информации о пароле? фактически"в противном случае"~

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

1.2 Алгоритм симметричного шифрования

Поскольку для передачи пароля пользователя используется протокол https, он по-прежнему"не обязательно безопасно", то мы даем пользователю пароль"зашифрованная ретрансляция"петь ~

Алгоритм шифрования имеет"Симметричное шифрование"и"Асимметричное шифрование"Две категории. Какой тип алгоритма шифрования использовать"надежный"Шерстяная ткань?

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

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

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

1.3 Алгоритм асимметричного шифрования

Как насчет асимметричных алгоритмов шифрования?

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

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

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

мы напрямую"Войти в Байду", возьмите запрос интерфейса и проверьте, как Ифа Дачанг зашифровал его. Можно обнаружить, что существует следующий интерфейс для получения открытого ключа:

Посмотрите еще раз на интерфейс входа в систему и обнаружите, что это алгоритм RSA, а RSA — это"Алгоритм асимметричного шифрования". На самом деле интерфейс Baidu использует библиотеку JavaScript."jsencrypt", звезд на гитхабе достаточно много.

Поэтому мы можем использовать"https + алгоритм асимметричного шифрования (например, RSA)"Перенести пароль пользователя~

2. Как безопасно хранить пароли?

Предполагая, что пароль благополучно дошел до сервера, как сохранить пароль пользователя? Вы не должны хранить пароли в базе данных в виде простого текста! Можно использовать"Алгоритм Hash Digest для шифрования паролей", а затем сохранить в базу данных.

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

2.1 Алгоритм дайджеста MD5 защищает ваш пароль

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

public class MD5Test {
    public static void main(String[] args) {
        String password = "abc123456";
        System.out.println(DigestUtils.md5Hex(password));
    }
}

результат операции:

0659c7992e268962384eb17fafe88364

Как только вы введете его на сайте бесплатного взлома MD5, вы сразу увидите исходный пароль. . .

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

2.2 Алгоритм MD5 + дайджест соли защищает пароль пользователя

Так почему бы не попробовать соль MD5+? что"С солью"?

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

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

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

2.3 Дебют мощного инструмента для повышения безопасности хранения паролей, Bcrypt

Даже с солью пароли можно подобрать методом грубой силы. Следовательно, мы можем взять больше"помедленнее"алгоритм, что удорожает взлом паролей для хакеров и даже заставляет их сдаться. Мощный инструмент для повышения безопасности хранения паролей ~ Bcrypt может дебютировать.

На самом деле Spring Security отказался от MessageDigestPasswordEncoder, рекомендуется BCryptPasswordEncoder, который BCrypt для хэшей паролей. BCrypt родился, чтобы сохранить пароль для разработки алгоритмов, MD5 по сравнению с гораздо медленнее.

Давайте посмотрим пример для сравнения:

public class BCryptTest {

    public static void main(String[] args) {
        String password = "123456";
        long md5Begin = System.currentTimeMillis();
        DigestUtils.md5Hex(password);
        long md5End = System.currentTimeMillis();
        System.out.println("md5 time:"+(md5End - md5Begin));
        long bcrytBegin = System.currentTimeMillis();
        BCrypt.hashpw(password, BCrypt.gensalt(10));
        long bcrytEnd = System.currentTimeMillis();
        System.out.println("bcrypt Time:" + (bcrytEnd- bcrytBegin));
    }
}

результат операции:

md5 time:47
bcrypt Time:1597

Грубое сравнение показывает, что BCrypt в десятки раз медленнее, чем MD5, и если хакер захочет его переборщить, то это будет стоить в десятки раз. Поэтому в целом рекомендуется использовать Bcrypt для хранения пароля пользователя.

3. Резюме

  • Поэтому для передачи паролей пользователей обычно используется протокол https + алгоритм асимметричного шифрования (например, RSA).Для большей безопасности на внешнем интерфейсе может быть построен случайный фактор.
  • Используйте BCrypt + соль для хранения паролей пользователей.
  • При восприятии опасности растрескивания грубой силы,"Включить проверку SMS, графический код подтверждения, временную блокировку учетной записи"и другие защитные механизмы, чтобы противостоять взлому грубой силой.

Ссылка и спасибо

  • Как правильно хранить и передавать конфиденциальные данные? https://time.geekbang.org/column/article/239150[1]
  • Как зашифровать передачу и хранение пароля пользователя https://juejin.cn/post/6844903604944371726#heading-8[2]

публика

  • публика:"маленький мальчик собирает улиток"
  • адрес гитхаба: https://github.com/whx123/JavaHome