From 97c46c0c036d911e21967412241b8d60322f6fad Mon Sep 17 00:00:00 2001 From: DarkCat09 Date: Wed, 26 Jul 2023 12:47:07 +0400 Subject: [PATCH] Real article, but still for testing --- src/content/blog/20230529-post.md | 178 ----------------------- src/content/blog/20230725-crypto-auth.md | 91 ++++++++++++ 2 files changed, 91 insertions(+), 178 deletions(-) delete mode 100644 src/content/blog/20230529-post.md create mode 100644 src/content/blog/20230725-crypto-auth.md diff --git a/src/content/blog/20230529-post.md b/src/content/blog/20230529-post.md deleted file mode 100644 index 3934650..0000000 --- a/src/content/blog/20230529-post.md +++ /dev/null @@ -1,178 +0,0 @@ -# H1 -## H2 -### H3 -#### H4 -##### H5 -###### H6 - -_Hello_ -**world** - -This is just a text for test, i.e. testing text, -so there should be no meaning, no colorful diagrams -with statistics that lie you. - -Maybe I'd better use _"Lorem ipsum"_, but it is already -written in the another sample post. -But... hey, why not? - -Lorem ipsum dolor sit amet, consequeter adipiscing elit -I forgot what's next - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -|Col1|Col2|Col3| -|:--:|:---|---:| -|Some|cool|data| -|12345678|11|00| - -```js -console.log(Object.keys({a:'a',b:'b'})) -``` - -> Quotation - -![Forest](/assets/forest.jpg) - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 - -## 123456 - -![Picture1](https://img2.goodfon.com/original/1920x1080/5/bb/river-forest-trees-water-rocks-mountains-snow-landscape-natu.jpg) - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 - -1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 123456 1234567890 123456789012345678 90123456789012345678 901234567890123456789012345678901234567890123456789 -1234567890 123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789 -12345678901234567 89012345678901234 56789012345678901234567890123456789012345678901234567890123456789 -123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -1234567890123456789012 345678901234567890123456789012345 67890123456789012345678901234567890123456789 -123456789 - -![Picture2](https://img4.goodfon.com/original/1920x1080/b/ba/kanada-ozero-les-kamni-reka-peizazh-luchi-kamen-priroda.jpg) diff --git a/src/content/blog/20230725-crypto-auth.md b/src/content/blog/20230725-crypto-auth.md new file mode 100644 index 0000000..26bd97c --- /dev/null +++ b/src/content/blog/20230725-crypto-auth.md @@ -0,0 +1,91 @@ +# Способы аутентификации и TOTP + +Доступ к любым конфиденциальным (и не очень) данным предоставляется определённому лицу. Для их получения, редактирования, удаления необходимо пройти аутентификацию -- дать понять системе разграничения доступа, что вы имеете право читать и изменять эти данные. + +## Логин и пароль +Самый простой и распространённый вариант -- это связка "логин + пароль". +В качестве логина выбирается либо почта, либо никнейм, либо набор символов, но обязательно что-то уникальное. +Основная проблема такого метода -- аккаунт легко взломать, если использован слабый пароль. Поэтому в формах регистрации обычно устанавливается ограничение по минимальной длине и набору символов. + +Небезопасно хранить пароли в открытом виде, их принято хэшировать. При запросе на вход сервер сопоставляет хэш из базы данных с хэшем введённого пользователем пароля. Совпадает? Возвращаем юзеру токен сессии, сгенерированный CSPRNG (криптобезопасным генератором псевдослучайных чисел), и связываем этот токен с IDшником аккаунта на бэкенде. Затем при выполнении любой операции проверяем токен и, если надо, получаем по айдишнику строку пользователя из БД (если надо узнать какие-то привилегии пользователя, например). + +Однако, пароль "12345" или слабый алгоритм хэширования обеспечивает взлом подбором. Ещё проще, когда утекает база данных вместе с хэшами, которые можно ломать локально, на своём ПК. +Про соль и алгоритмы когда-нибудь потом, в другой статье. Да и соль не всегда спасает. + +Код на PHP для понимания: +(Регистрацию делают примерно так же.) +```php +stmt_init(); +$stmt->prepare('SELECT Id, Hash FROM users WHERE Name = ?'); +$stmt->bind_param('s', $user); +$stmt->execute(); + +// Нет строк с таким юзернеймом -- +// следовательно, незарегистрирован +$stmt->store_result(); +if ($stmt->num_rows < 1) { + echo('User is not registered'); + $stmt->close(); + exit(); +} + +// Вытаскиваем из результата столбцы +// Id => $uid (айдишник юзера) +// Hash => $hash (хэш пароля) +$stmt->bind_result($uid, $hash); +$stmt->fetch(); + +$stmt->close(); +$db->close(); + +// Сопоставление +// введённого пароля -- $pswd +// и хэша из БД -- $hash +if (!password_verify($pswd, $hash)) { + echo('Incorrect password'); + exit(); +} + +// Записываем в сессию айдишник, +// в дальнейшем можно будет по нему +// получать данные о юзере из БД +$_SESSION['uid'] = $uid; +echo('Your ID: ' . $uid); +?> +``` + +## Одноразовый код (OTP) +Интернет-магазины и операторы связи сейчас продвигают более безопасный метод: аутентификация по одноразовой ссылке/коду, который приходит на почту или по SMS. +Для генерации одноразового кода используют различные алгоритмы, о них позже. + +Можно создавать секретный ключ, с помощью которого будут генерироваться коды, при этом придётся его хранить в БД. Утечка = взлом, если известен алгоритм генерации. + +А можно создать токен *входа*, связать его с ID юзера и положить в Redis или оперативную память. +Затем выслать ссылку с токеном на почту (по СМС проблематичнее, там дешевле будут короткие коды). Если прошло некоторое время и юзер так и не использовал ссылку, удаляем токен, через него зайти больше не получится. При первом же использовании токен тоже удаляем -- для идентификации лучше создавать токен *сессии*, обычно такой функционал автоматически предоставляют фреймворки. + +Скомбинированный вариант: временный секретный ключ, на основе которого генерируется одноразовый код, отправляемый по E-Mail/SMS. Ключ не хранится в БД, плюс он временный, взлом почти невозможен. + +## 2FA +Двухфакторная аутентификация, она же 2FA, -- мощный механизм защиты учётной записи.