предисловие
Когда мы разрабатываем веб-сайт или приложение, первая проблема, которую необходимо решить, это"Как безопасно передать и сохранить пароль пользователя". Также время от времени происходит утечка пользовательских баз некоторых крупных компаний, что имеет очень большое негативное влияние. Поэтому, как безопасно передавать и хранить пароли пользователей, является обязательным для каждого программиста. Эта статья научит вас безопасно передавать и хранить пароли пользователей.
публика:"маленький мальчик собирает улиток"(Для совместного обсуждения вопросов передачи и хранения паролей)
1. Как безопасно передать пароль пользователя
Чтобы запретить пользовательские пароли работать в Интернете, мы можем легко подумать об использовании протокола https.Давайте сначала рассмотрим знания о https~
1.1 HTTPS-протокол
- "Три риска http"
Зачем использовать протокол https?"http это не ароматный"• Потому что http — это передача информации в открытом виде. Если вы используете протокол http в огромном сетевом океане, существуют следующие три риска:
❝❞
- Риск прослушивания/сниффинга: данные связи могут быть перехвачены третьими лицами.
- Риск подделки данных: после того, как третья сторона получит данные связи, она злонамеренно изменит их.
- Риск подделки личных данных: третьи лица могут выдавать себя за других для участия в общении.
Это нормально, если вы передаете неважную информацию, но ужасно передавать конфиденциальную информацию, такую как пароли пользователей. Так что обычно используйте"https-протокол"Передача информации о пароле пользователя.
- "принцип https"
Каков принцип HTTPS? Почему он может устранить три основных риска HTTP?
❝https = http + SSL/TLS, SSL/TLS — это протокол шифрования транспортного уровня, который обеспечивает шифрование контента, аутентификацию личности и проверку целостности данных для решения проблемы безопасности при передаче данных.
❞
Для того, чтобы углубить понимание принципа https, давайте рассмотрим его вместе"Полный процесс запроса https"Давайте
❝❞
- Клиент инициирует https-запрос
- На сервере должен быть набор цифровых сертификатов, которые можно изготовить самостоятельно или обратиться в центр. Этот сертификат на самом деле представляет собой пару открытого и закрытого ключей.
- Сервер отправляет клиенту собственный цифровой сертификат (содержащий открытый ключ, центр сертификации и т. д.).
- После того, как клиент получит цифровой сертификат с сервера, он проверит его, в основном, чтобы проверить, действителен ли открытый ключ, например, орган, выдавший сертификат, срок действия и т. д. Если он не пройдет, появится окно с предупреждением. Если с сертификатом проблем нет, сгенерируйте ключ (ключ алгоритма симметричного шифрования, который на самом деле является случайным значением) и зашифруйте случайное значение открытым ключом сертификата.
- Клиент инициирует второй запрос в https и отправит зашифрованный клиентский ключ (случайное значение) на сервер.
- После того, как сервер получит ключ, отправленный клиентом, он асимметрично расшифрует его с помощью собственного закрытого ключа, получит ключ клиента после расшифровки, а затем использует ключ клиента для симметричного шифрования возвращенных данных, чтобы данные стали зашифрованным текстом.
- Сервер возвращает зашифрованный зашифрованный текст клиенту.
- Клиент получает зашифрованный текст, возвращенный сервером, и симметрично расшифровывает его своим собственным ключом (клиентским ключом), чтобы получить данные, возвращенные сервером.
- "Обязательно ли защищен протокол 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