Получи случайную криптовалюту за регистрацию!

Java: fill the gaps

Логотип телеграм канала @java_fillthegaps — Java: fill the gaps J
Логотип телеграм канала @java_fillthegaps — Java: fill the gaps
Адрес канала: @java_fillthegaps
Категории: Технологии
Язык: Русский
Количество подписчиков: 10.33K
Описание канала:

Привет! Меня зовут Диана, и я занимаюсь java разработкой с 2013г.
Делюсь опытом/знаниями по темам:
- Java Core
- Вопросы с собеседований
- Best practices
Комплименты, вопросы, предложения: @utki_letyat

Рейтинги и Отзывы

4.50

2 отзыва

Оценить канал java_fillthegaps и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

0


Последние сообщения 7

2022-02-08 09:32:44 На прошлой неделе мы обсуждали, как защитить данные. На этой неделе я запланировала другую тему — авторизация и аутентификации.

Аутентификация — проверить, что пользователь тот, за кого себя выдаёт

Авторизация — есть ли у пользователя права на конкретное действие

С этим редко бывают сложности. Гораздо интереснее темы, которые идут рядом: JWT, oAuth, SSO и как это всё работает со Spring Security.

Тут легко увлечься, но нельзя сказать, что такие задачи приходят каждый день. Так что сегодня расскажу о JWT, а остальное — как-нибудь потом
1.6K viewsedited  06:32
Открыть/Комментировать
2022-02-04 09:15:00 Security basics, часть 3: HTTPS

Вернёмся к ситуации, которую затронули пару дней назад.

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

Все механизмы безопасности складываются из простых кирпичиков, и HTTPS не исключение:

Браузер присылает свой публичный ключ
Сервер присылает свой публичный ключ
Сервер и браузер вычисляют Общий ключ (shared secret) на основе своих приватных ключей и полученных публичных

Так через ассиметричное шифрование легко переходим к симметричному. Последний пункт выглядит как магия, но это всё математика. Спасибо криптографии за чудесные алгоритмы

Процесс выше называется TLS Handshake.

Скорее всего вы часто видели аббревиатуру SSL. Этот протокол появился в 90е и давно устарел, а ему на смену пришёл TLS. Но многие по старинке говорят SSL, иногда ещё пишется SSL/TLS.

Давайте опишем тот же процесс, но чуть подробней:

Браузер шлёт:

Алгоритмы, которые знает браузер
Свои публичные ключи и соответствующие алгоритмы
Случайное число №1

Сервер

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

Названия выбранных алгоритмов
Свой публичный ключ
Сертификат
Случайное число №2

Обе стороны вычисляют Общий ключ и продолжают общаться

Больше технических подробностей читайте в статье TLS (SSL) handshakes explained. Разберём несколько вопросов "Зачем":

Зачем браузер и сервер переходят на симметричное шифрование? Почему бы не продолжить шифровать сообщения публичными ключами?

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

Зачем в сообщениях случайные числа?

Чтобы избежать Replay attack. Злоумышленник может прослушать сообщение и отправить от своего имени. Или отправить сообщение несколько раз, чтобы запутать получателя. Получатель запоминает число и не принимает сообщения с тем же числом.

Зачем нужен сертификат?

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

Сертификат подписывает:

Сам сервер своим приватным ключом. Браузер распознаёт самоподписанные сертификаты и выдаёт предупреждение. Но для разработки и тестирования такой вариант подойдёт
Специальная организация — Certificate Authority. Список СА хранится в операционной системе и в некоторых браузерах

Следить за сертификатами — задача девопса. Если срок действия сертификата истёк, то пользователи увидят надпись на весь экран, что сайту нельзя доверять.

Зачем мне эта информация?

Чем выше ваша позиция, тем шире круг задач и проблем, которые нужно решать. И здесь очень важен общий кругозор. Плюс, чем больше вы знаете, как устроен мир, тем больше фундамент для ваших собственных решений
1.6K views06:15
Открыть/Комментировать
2022-02-02 09:32:27 Security basics, часть 2: цифровая подпись и немножко терминов

Давайте чётко обозначим разницу между терминами:

Хэширование

Цель — получить краткое представление объекта.

Objects.hash("пирожок") = 564453454

Результат не зависит от внешних параметров. Объект обратно восстановить нельзя. Самые популярный алгоритм — SHA, иногда используется MD5.

Кодирование

Цель — преобразовать сообщение для передачи. Используется при ограничениях на формат сообщений.

Пример: нужно передать JSON туда, где ожидается обычный текст.

Кодировка Base64 переводит любой битовый массив в простые символы — цифры, латинские буквы, +, / и =. Уйдут скобки, кавычки и всё, что может смутить канал передачи или библиотеку получателя.

Base64.encode("{"/пирожок"/}") = "TWFuIGlzIGRpc3Rp="

После получения закодированное сообщение приводится к исходному виду:

Base64.decode("TWFuIGlzIGRpc3Rp=") = "{"/пирожок"/}"

Шифрование

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

Хэширование, кодирование и шифрование — это кирпичики, из которых собираются остальные механизмы безопасности.

Например, электронная подпись

Это файлик с расширением .sig, который прилагается к сообщению и доказывает его подлинность.

Само сообщение передаётся в открытом виде и никак не скрывается.

Как это работает?

Подпись может быть на основе любого алгоритма шифрования:

Симметричный алгоритм (редко используется):

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

Ассиметричный алгоритм:

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

Таким образом электронная подпись — это сочетание хэширования и шифрования. В JDK всё это находится в пакете java.security.
2.1K views06:32
Открыть/Комментировать
2022-02-01 09:01:02 Security basics, часть 1: симметричное и ассиметричное шифрование

Начнём с простой задачи: передать секретное сообщение по общедоступной сети.

Злоумышленник может прослушать канал связи, перехватить сообщение и даже поменять его. Такой тип атаки называется man in the middle

Что делать?

Самое простое — преобразовать сообщение, чтобы при перехвате злоумышленник ничего не понял. Например, сдвинуть каждую букву на 1:
Пирожок → Рйспзпл

Получатель выполнит обратную операцию и расшифрует сообщение.

Но для стандартных алгоритмов то же самое легко сделает и злоумышленник. Поэтому в преобразования вводится дополнительный параметр и формула становится сложнее. Например: символ → символ + k

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

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

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

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

Поэтому чаще применяется ассиметричное шифрование.

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

Публичный ключ свободно распространяется и позволяет шифровать сообщения
Приватный ключ остаётся у получателя. И только он расшифрует полученное сообщение

Самый популярный ассимметричный алгоритм — RSA. Он основан на простых числах, вычислении степени и остатке от деления. Формулы несложные, а шифр получается вполне стойкий.

В последнее время в тренды выходит EdDSA. Он популярен тем, что активно используется в биткоине. Поддержка этого алгоритма появилась только в java 15.

Вообще алгоритмы шифрования используются не только для шифрования, но и входят в состав остальных инструментов безопасности. Но об этом позже
1.7K views06:01
Открыть/Комментировать
2022-02-01 09:01:02 Привет! Тема ближайших двух недель — безопасность.

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

Часть 1. Симметричное и ассиметричное шифрование
Часть 2: Цифровые подписи
Часть 3: HTTPS

А на следующей неделе подробнее поговорим про авторизацию и аутентификацию.
1.8K views06:01
Открыть/Комментировать
2022-01-25 09:01:12 Зачем спрашивать про хэшмэп

Меня раньше раздражали многие вопросы с собеседований:
Перечислить методы класса Object
Рассказать строение HashMap и списков
Расшифровать SOLID
Вставить элемент в сбалансированное дерево

Задают везде по сто раз, они мало связаны с ежедневной работой и вообще неинтересные.

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

Что ожидается от джуниора и мидла:
Hard skills: уметь писать на java, знать основные структуры данных, паттерны и фреймворки
Soft skills: быть приятным в общении, чётко формулировать мысли и возможные проблемы

Хард скиллс более-менее проверяется тестами и конкретными вопросами. Но никто не назовёт себя раздражительным, поэтому софт скиллс проверяются косвенно.

Интервьюер: расскажите устройство HashMap

Кандидат 1: закатывает глаза и вздыхает. Ну там хэши, бакеты, я это уже сто раз рассказывал на другом собесе, давайте дальше

Кандидат 2: чётко и понятно отвечает на вопрос

Кандидат 3: чётко и понятно отвечает на вопрос, упоминает изменения в java 8, готов обсудить ConcurrentHashMap и его эволюцию

Понятно, что Кандидат 2 — отличный парень, Кандидат 3 — вообще лапочка. И по хард скиллам хорошо, и работать с ним будет приятно.

Означают ли стандартные вопросы, что проект скучный?

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

Что делать, если вопросы на интервью стандартные, но хочется показать себя во всей красе?

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

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

Что проверяют у сеньора, когда задают вопрос про HashMap?

Сеньор не только пишет классный код, но и помогает младшим товарищам. Джуниорам и мидлам придётся часто повторять одно и то же, понятно и доброжелательно. Так что вопрос про хэшмэп вполне подойдёт. Хард скиллы проверяются, конечно, другими вопросами.
2.5K views06:01
Открыть/Комментировать
2022-01-21 09:00:28 Intellij IDEA: создать и переместить строку

Как создают строчку обычные люди: долго переводят курсор в конец строки и жмут Enter.

В IDEA достаточно нажать
Shift + Enter
И вы сразу перейдёте на новую строчку

Быстро перемещать строки:
Shift + Alt + (стрелка вверх/вниз)

Если выделить несколько строк, то группа будет двигаться целиком.

Очень простые и приятные фичи
2.1K views06:00
Открыть/Комментировать
2022-01-19 09:00:22 Как написать hashcode лучше, чем IDE

Метод hashcode используется, когда класс работает в качестве ключа в hash-based структурах данных. Следить за тем, как используется класс, не всегда удобно, поэтому есть правило — "Переопределяешь equals — переопредели hashcode".

Метод должен соблюдать контракт:

Если объект не меняется, хэшкод остаётся постоянным
У одинаковых объектов одинаковый хэшкод
Если хэшкод одинаковый, то объекты не обязательно равны

Писать equals и hashcode вручную долго, поэтому часто используется автогенерация в IDE или Lombok аннотация @EqualsAndHashCode. Они создают что-то вроде

public int hashcode() {
return Objects.hash(id, param1, param2);
}

Что не так?

Контракт соблюдается, но суть хэшкода пропадает.

Хэшкод — это быстрая проверка без лишних вычислений. В коде выше результат вычисляется каждый раз на основе множества полей. А по количеству операций Objects.hashcode догоняет equals.

Как считать хэш быстрее:

Использовать одно поле

public int hashcode() {
return id;
}

Сохранять результат в отдельном поле

Подойдёт если у объекта нет id, и основные поля не меняются. Так сделано в классе String:

private int hash;

public int hashCode() {
int h = hash;
if (h==0 && !hashIsZero){
hash = …;
}
return h;
}

Эффект от оптимизации будет заметен, если класс активно участвует в hash-based структурах. В остальных случаях можно оставить автогенерацию.
1.9K views06:00
Открыть/Комментировать
2022-01-19 09:00:22 Первым делом хочу поблагодарить всех, кто ответил на анкету и особенно на последний вопрос. Было много приятных пожеланий и интересных идей! Спасибо

Ну а теперь к делу
1.9K views06:00
Открыть/Комментировать
2022-01-13 09:00:03 Привет!

Каждый автор пишет о том, что ему интересно, и что больше откликается у аудитории. Я в основном пишу про java core, но хочется писать и на другие темы.

Поэтому хочу узнать про вас чуть больше. Ответьте, пожалуйста, на 2 вопроса выше

А если уделите ещё 5 минут и ответите на эту анкету, то сильно мне поможете и напрямую повлияете на будущий контент.
2.0K views06:00
Открыть/Комментировать