Содержание

чат-эротика по веб-камере. Трансляции бесплатно!

-TwiXXX-

4107

#камшоу
#массаж
#стриптиз
#HD+

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

BiatrysEva

1498

#лесбиянки
#трах киски
#сквирт
#Игры

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Blackcurrant

1316

#минет
#глубокий минет
#женская доминация
#натирание киски

Снять лифчик 50

GlobalPrikol

893

#кончают
#глубокий минет
#целуются
#сосание сисек

сперма в рот 863:

SWEET_DREAM_

706

#анальные игры
#танцы
#трах с дилдо
#HD+

ДО АНАЛА 296

letali_letali

4087

#лизание яиц
#сосание яиц
#кримпай
#сосание

shhhh….we are so horny…we want him help us seduce him and make a blue balls

GeraDalla

890

#стриптиз
#лизание клитора
#натирание киски
#lovense

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

ParaWMH

2478

#минет
#кончают на попу
#кончают
#интим с девушками

Сосать член

WilmaArina

805

#фистинг
#дрочка
#сосание клитора
#Игры

Чат WilmaArina

GeraReby

1644

#минет
#дилдо
#мастурбация
#куннилингус

lick nipples

—Twix—

1266

#сосание яиц
#сосание члена
#кончают на попу
#дилдо

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

AngelAndMisha

1974

#дилдо
#фантазирование
#женская доминация
#HD+

Сосать член

BarbyBhayolet

730

#анальные игры
#сношение пар
#фистинг
#женская доминация

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Luisandandrea

1319

#минет
#камшоу
#лизание
#стриптиз

Чат Luisandandrea

dualblue

272

#анальные игры
#фелляция
#ласки ногами
#Игры

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

irisandthiago

469

#минет
#танцы
#ласки ногами
#ручная стимуляция

Чат irisandthiago

Amazonapartyx

221

#анальный фингеринг
#забавы с дилдо
#фистинг
#трах

Чат Amazonapartyx

2sexymilfs

195

#минет
#лизание
#lovense
#Игры

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

lindarey

286

#анилингус
#трах с дилдо
#курение
#онанирование

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

francheskha

867

#анальные игры
#отсос члена
#эксгибиционизм
#трах киски

­Добро пожаловать на 7седьмое небо!

BrendAnTwoBoy

306

#лизание яиц
#жопотрах
#кримпай
#камшот

­Уделите мне своё внимание и токены, об остальном позабочусь я!

GeordyVsMelan

437

#лизание яиц
#трах
#лизание
#римминг

Чат GeordyVsMelan

lii-ann

366

#камшот
#фейсситтинг
#интим с девушками
#Игры

­Я покажу тебе самое горячее шоу!

KataGtGngBng

201

#групповуха
#лизание
#занятие любовью
#лесбиянки

­Смотри не обожгись, в моей комнате очень горячо!

Cazzunubi

159

#кримпай
#кончают
#трах
#мастурбация

­Жаркое общение только у меня в комнате!

SexySluts4u

168

#анальный фингеринг
#общение
#фистинг
#эксгибиционизм

­Характер у меня не самый лучший, зато попа классная!

Amateurcoupl

чат-эротика по веб-камере. Трансляции бесплатно!

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Снять лифчик 50

сперма в рот 863:

ДО АНАЛА 296

shhhh….we are so horny…we want him help us seduce him and make a blue balls

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

Сосать член

Чат WilmaArina

lick nipples

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

Сосать член

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Чат Luisandandrea

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

Чат irisandthiago

Чат Amazonapartyx

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

­Добро пожаловать на 7седьмое небо!

­Уделите мне своё внимание и токены, об остальном позабочусь я!

Чат GeordyVsMelan

­Я покажу тебе самое горячее шоу!

­Смотри не обожгись, в моей комнате очень горячо!

­Жаркое общение только у меня в комнате!

­Характер у меня не самый лучший, зато попа классная!

­Меня тяжело удовлетворить, но я верю, что ты справишься!

­Мои шоу всегда на высшем уровне. Заходи и убедись!

­Поддержите меня токенами и не пожалеете!

Чат noah-ashley29

­Заходите ко мне в комнату, вас ждет замечательное общение!

­Подари мне свои Токены, а я подарю тебе своё внимание!

­Могут пройти минуты и дни, но лучше меня тебе не найти

­Привет! Очень хочу пообщаться с тобой прямо сейчас!

чат-эротика по веб-камере. Трансляции бесплатно!

-TwiXXX-

4107

#общение
#фантазирование
#HD+
#Cam2Cam Prime

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

BiatrysEva

1498

#лесбиянки
#лизание клитора
#натирание киски
#Игры

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Blackcurrant

1316

#анальные ласки
#бдсм
#жопотрах
#лесбиянки

Снять лифчик 50

GlobalPrikol

893

#минет
#камшоу
#общение
#lovense

сперма в рот 863:

SWEET_DREAM_

706

#танцы
#дилдо
#мастурбация
#куннилингус

ДО АНАЛА 296

letali_letali

4087

#из ануса в рот
#кончают в рот
#двойное проникновение
#эякуляция на лицо

shhhh….we are so horny…we want him help us seduce him and make a blue balls

GeraDalla

890

#танцы
#забавы с дилдо
#натирание киски
#HD+

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

ParaWMH

2478

#общение
#трах
#дрочка
#целуются

Сосать член

WilmaArina

805

#лизание
#мастурбация
#сквирт
#Король Чаевых

Чат WilmaArina

GeraReby

1644

#бдсм
#лизание киски
#lovense
#Король Чаевых

lick nipples

—Twix—

1266

#дрочка
#массаж
#дразнение
#lovense

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

AngelAndMisha

1974

#забавы с дилдо
#курение
#стриптиз
#Игры

Сосать член

BarbyBhayolet

730

#камшот
#проглатывание
#сосание клитора
#сквирт

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Luisandandrea

1319

#танцы
#сосание
#женская доминация
#вагинальное сношение

Чат Luisandandrea

dualblue

272

#анальные игры
#эксгибиционизм
#ручная стимуляция
#кончают в киску

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

irisandthiago

469

#лизание яиц
#кончают в рот
#танцы
#лизание

Чат irisandthiago

Amazonapartyx

221

#забавы с дилдо
#трах с дилдо
#фингеринг
#стриптиз

Чат Amazonapartyx

2sexymilfs

195

#общение
#танцы
#целуются
#lovense

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

lindarey

286

#эякуляция на лицо
#трах
#дразнение
#сквирт

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

francheskha

867

#анальные ласки
#минет
#сношение пар
#эякуляция на лицо

­Добро пожаловать на 7седьмое небо!

BrendAnTwoBoy

306

#ласки втроем
#анилингус
#минет
#эксгибиционизм

­Уделите мне своё внимание и токены, об остальном позабочусь я!

GeordyVsMelan

437

#сношение пар
#трах
#римминг
#лизание киски

Чат GeordyVsMelan

lii-ann

366

#лизание яиц
#сосание члена
#кончают на попу
#проглатывание

­Я покажу тебе самое горячее шоу!

KataGtGngBng

201

#трах с дилдо
#фейсситтинг
#эякуляция на лицо
#массаж

­Смотри не обожгись, в моей комнате очень горячо!

Cazzunubi

159

#кримпай
#занятие л

Рунетки пары — смотреть секс пар онлайн в чате!

-TwiXXX-

4107

#общение
#курение
#Игры
#Cam2Cam Prime

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

BiatrysEva

1498

#трах киски
#лизание киски
#натирание киски
#HD+

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Blackcurrant

1316

#бдсм
#минет
#кончают на лицо
#массаж

Снять лифчик 50

GlobalPrikol

893

#кончают на попу
#глубокий минет
#отсос члена
#лизание

сперма в рот 863:

SWEET_DREAM_

706

#минет
#лизание
#сквирт
#Игры

ДО АНАЛА 296

letali_letali

4087

#анальные игры
#сосание яиц
#сосание члена
#дилдо

shhhh….we are so horny…we want him help us seduce him and make a blue balls

GeraDalla

890

#трах с дилдо
#эксгибиционизм
#женская доминация
#натирание киски

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

ParaWMH

2478

#сосание члена
#дрочка
#интим с девушками
#HD+

Сосать член

WilmaArina

805

#мастурбация
#стриптиз
#дразнение
#Игры

Чат WilmaArina

GeraReby

1644

#наслаждение
#ласки ногами
#сосание
#лесбиянки

lick nipples

—Twix—

1266

#сношение пар
#фистинг
#фак машины
#проглатывание

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

AngelAndMisha

1974

#общение
#наслаждение
#ручная стимуляция
#трах киски

Сосать член

BarbyBhayolet

730

#ласки втроем
#лизание яиц
#жопотрах
#фейсситтинг

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Luisandandrea

1319

#анальный фингеринг
#курение
#женская доминация
#сквирт

Чат Luisandandrea

dualblue

272

#сосание яиц
#фелляция
#фингеринг
#эксгибиционизм

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

irisandthiago

469

#лизание яиц
#общение
#кончают на лицо
#ручная стимуляция

Чат irisandthiago

Amazonapartyx

221

#трах с дилдо
#фингеринг
#фистинг
#стриптиз

Чат Amazonapartyx

2sexymilfs

195

#сношение пар
#танцы
#трах с дилдо
#мастурбация

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

lindarey

286

#анилингус
#фантазирование
#дрочка
#лизание клитора

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

francheskha

867

#общение
#эякуляция
#целуются
#онанирование

­Добро пожаловать на 7седьмое небо!

BrendAnTwoBoy

306

#трах
#групповуха
#мастурбация
#сосание клитора

­Уделите мне своё внимание и токены, об остальном позабочусь я!

GeordyVsMelan

437

#сосание члена
#фейсситтинг
#дразнение
#лизание киски

Чат GeordyVsMelan

lii-ann

366

#сношение пар
#кримпай
#наслаждение
#проглатывание

­Я покажу тебе самое горячее шоу!

KataGtGngBng

201

#сосание члена
#ручная стимуляция
#мастурбация
#римминг

­Смотри не обожгись, в моей комнате очень горячо!

Cazzunubi

159

#кримпай
#кончают на лицо
#жесткий трах
#мастурбация

­Жаркое общение только у меня в комнате!

SexySluts4u

168

#фейсситтинг
#ласки ногами
#лизание
#дразнение

­Характер у меня не самый лучший, зато попа классная!

Amateurcoupl

962

#эякуляция
#жесткий трах
#массаж
#мастурбация

­Меня тяжело удовлетворить, но я верю, что ты справишься!

xxlatinx

945

#эякуляция
#занятие любовью
#лизание клитора
#lovense

­Мои шоу всегда на высшем уровне. Заходи и убедись!

ramsamituss

231

#общение
#эякуляция
#без интима
#трах сисек

­Поддержите меня токенами и не пожалеете!

noah-ashley29

567

#общение
#фантазирование
#ласки ногами
#lovense

Чат noah-ashley29

Парный групповой семейный секс в чате bongocams

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Снять лифчик 50

сперма в рот 863:

ДО АНАЛА 296

shhhh….we are so horny…we want him help us seduce him and make a blue balls

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

Сосать член

Чат WilmaArina

lick nipples

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

Сосать член

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Чат Luisandandrea

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

Чат irisandthiago

Чат Amazonapartyx

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

­Добро пожаловать на 7седьмое небо!

­Уделите мне своё внимание и токены, об остальном позабочусь я!

Чат GeordyVsMelan

­Я покажу тебе самое горячее шоу!

­Смотри не обожгись, в моей комнате очень горячо!

­Жаркое общение только у меня в комнате!

­Характер у меня не самый лучший, зато попа классная!

­Меня тяжело удовлетворить, но я верю, что ты справишься!

­Мои шоу всегда на высшем уровне. Заходи и убедись!

­Поддержите меня токенами и не пожалеете!

Чат noah-ashley29

чат-эротика по веб-камере. Трансляции бесплатно!

-TwiXXX-

4107

#танцы
#фантазирование
#курение
#Cam2Cam Prime

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

BiatrysEva

1498

#трах киски
#натирание киски
#сквирт
#HD+

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Blackcurrant

1316

#сосание яиц
#кончают на попу
#кончают в киску
#лизание киски

Снять лифчик 50

GlobalPrikol

893

#кончают внутрь
#целуются
#кончают в киску
#трах киски

сперма в рот 863:

SWEET_DREAM_

706

#минет
#кончают
#танцы
#лизание киски

ДО АНАЛА 296

letali_letali

4087

#кончают в рот
#целуются
#куннилингус
#трах киски

shhhh….we are so horny…we want him help us seduce him and make a blue balls

GeraDalla

890

#анальные игры
#эксгибиционизм
#целуются
#куннилингус

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

ParaWMH

2478

#фантазирование
#трах
#дрочка
#целуются

Сосать член

WilmaArina

805

#лизание киски
#сквирт
#HD+
#Игры

Чат WilmaArina

GeraReby

1644

#анальные ласки
#забавы с дилдо
#целуются
#лизание

lick nipples

—Twix—

1266

#жопотрах
#кончают внутрь
#кончают в киску
#сосание клитора

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

AngelAndMisha

1974

#дилдо
#ручная стимуляция
#женская доминация
#HD+

Сосать член

BarbyBhayolet

730

#сосание члена
#ласки ногами
#лесбиянки
#натирание киски

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Luisandandrea

1319

#фелляция
#ручная стимуляция
#лизание
#сосание клитора

Чат Luisandandrea

dualblue

272

#анальные игры
#фелляция
#сосание члена
#кончают в киску

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

irisandthiago

469

#кончают в рот
#массаж
#мастурбация
#стриптиз

Чат irisandthiago

Amazonapartyx

221

#анальный фингеринг
#забавы с дилдо
#трах с дилдо
#фистинг

Чат Amazonapartyx

2sexymilfs

195

#целуются
#мастурбация
#стриптиз
#Игры

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

lindarey

286

#езда верхом
#наслаждение
#эякуляция на лицо
#жесткий трах

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

francheskha

867

#фелляция
#сношение пар
#дразнение
#сосание клитора

­Добро пожаловать на 7седьмое небо!

BrendAnTwoBoy

290

#фелляция
#минет
#натирание
#женская доминация

­Уделите мне своё внимание и токены, об остальном позабочусь я!

GeordyVsMelan

437

#фелляция
#камшоу
#сосание
#сквирт

Чат GeordyVsMelan

lii-ann

366

#кончают на лицо
#наслаждение
#занятие любовью
#дразнение

­Я покажу тебе самое горячее шоу!

KataGtGngBng

201

#кончают в рот
#кончают на попу
#дилдо
#массаж

­Смотри не обожгись, в моей комнате очень горячо!

общение в эрочате в режиме онлайн – bongacams.org

Заходи ко мне!!! Все просьбы без токенов — бан навсегда! Подглядок нет! Без трусиков. [none]: Собрано [none]: Осталось [

­Заказывай музыку, играй в игры, ставь любовь и наслаждайся!

Снять лифчик 50

сперма в рот 863:

ДО АНАЛА 296

shhhh….we are so horny…we want him help us seduce him and make a blue balls

Hey guys❤️first linda sucks hilary’s nipples and then hilary fucks linda with a strapon❤️[none] [none]

Сосать член

Чат WilmaArina

lick nipples

[none] обратный отсчет, [none] собрано, [none] осталось до спермы на лицо cum on face

Сосать член

­Очень хочу с тобой кончить!!! Не забывайте ставить любовь!

Чат Luisandandrea

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

Чат irisandthiago

Чат Amazonapartyx

­Приветик! Давайте веселиться и общаться. Постараюсь удивить в привате или группе.

Получится ли собрать со всем на сквирт? Наша цель 100тк для обоих чтобы был сквирт получится ли?

­Добро пожаловать на 7седьмое небо!

­Уделите мне своё внимание и токены, об остальном позабочусь я!

Чат GeordyVsMelan

­Я покажу тебе самое горячее шоу!

­Смотри не обожгись, в моей комнате очень горячо!

­Жаркое общение только у меня в комнате!

­Характер у меня не самый лучший, зато попа классная!

­Меня тяжело удовлетворить, но я верю, что ты справишься!

­Мои шоу всегда на высшем уровне. Заходи и убедись!

­Поддержите меня токенами и не пожалеете!

Чат noah-ashley29

­Заходите ко мне в комнату, вас ждет замечательное общение!

­Подари мне свои Токены, а я подарю тебе своё внимание!

­Могут пройти минуты и дни, но лучше меня тебе не найти

­Привет! Очень хочу пообщаться с тобой прямо сейчас!

Пять простых шагов для понимания веб-токенов JSON (JWT) / Хабр

Представляю вам мой довольно вольный перевод статьи 5 простых шагов к пониманию веб-токенов JSON (JWT). В этой статье будет рассказано о том, что из себя следует выделить JSON Web Tokens (JWT), и с чем их едят. Есть какую роль они играют в проверке подлинности пользователя.

Для начала рассмотрим формальное определение.

JSON Web Token (JWT) — это JSON объект, который определен в открытом стандарте RFC 7519.Он считается одним из безопасных способов передачи информации между двумя участниками. Для его создания необходимо определить заголовок (заголовок) с общей информацией по токену, полезные данные (полезные данные), такие как id пользователя, его роль и т.д. и подписи (подпись).
Кстати, правильно JWT произносится как / dʒɒt /

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

Приложение использует JWT для проверки аутентификации следующим образом:

  1. Сперва пользователь переходит на сервер аутентификации с помощью аутентификационного ключа (это может быть пара логин / пароль , либо Facebook ключ, либо Google ключ, либо ключ от другой учетки).
  2. Затем вводит аутентификацию JWT и отправляет его пользователю.
  3. Когда пользователь делает запрос к API приложения, он к нему полученный ранее JWT .
  4. Когда пользователь делает запрос API, приложение может проверить по переданному с запросом JWT является пользователем тем, за кого себя выдает. В этой схеме сервер приложения сконфигурирован так, чтобы проверить, является ли входящий JWT именно тем, что был создан сервером аутентификации (процесс проверки будет объяснен более детально).

Структура JWT

JWT состоит из трех частей: заголовок , заголовок , полезные данные , полезная нагрузка и подпись , подпись . Давайте пройдемся по каждой из них.

Хедер JWT содержит информацию о том, как должна вычисляться JWT подпись. Хедер — это тоже JSON объект, который выглядит следующим образом:

  header = {"alg": "HS256", "typ": "JWT"}  

Поле typ не говорит нам ничего нового, только то, что это JSON Web Token .Интереснее здесь будет поле alg , которое определяет алгоритм хеширования. Он будет при изучении создания подписи. HS256 — не что, как HMAC-SHA256 , для его вычислений нужен лишь один секретный ключ (более подробно об этом в шаге 3). Еще может другой ключ другой RS256 — в отличие от предыдущего, он является ассиметричным и создает два ключа: публичный и приватный. С помощью приватного ключа создается подпись, а с помощью публичного лишь проверяется подлинность подписи, поэтому нам не нужно беспокоиться о его безопасности.

Шаг 2. Создаем PAYLOAD

Payload — это полезные данные, которые хранятся внутри JWT . Эти данные также называют JWT-заявки (заявки). В примере, который мы рассматриваем, сервер аутентификации создает JWT с информацией об id пользователя — userId .

  payload = {"userId": "b08f86af-35da-48f2-8fab-cef3904660bd"}  

Мы положили только одну заявку (претензия) в payload .Вы можете положить столько заявок , сколько захотите. Существует список стандартных заявок для JWT payload — вот некоторые из них:

  • iss (эмитент) — определяет приложение, из которого отправляется токен.
  • sub (тема) — определить тему токена.
  • exp (срок действия) — время жизни токена.

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

Шаг 3. Создаем ПОДПИСЬ

Подпись вычисляется с использованием следующего псевдо-кода:

  const SECRET_KEY = 'cAtwa1kkEy'
const unsignedToken = base64urlEncode (заголовок) + '.'+ base64urlEncode (полезная нагрузка)
const signature = HMAC-SHA256 (unsignedToken, SECRET_KEY)  

Алгоритм base64url кодирует хедер и полезную нагрузку, созданную на 1 и 2 шаге. Алгоритм соединяет закодированные строки через точку. Затем полученная строка хешируется алгоритмом, заданным в хедере на основе нашего секретного ключа.

  // заголовок eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
// полезная нагрузка eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ
// подпись -xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM  

Шаг 4.Теперь объединим все три JWT компонента вместе

Теперь, когда у нас есть все три составляющих, мы можем создать наш JWT . Это довольно просто, мы соединяем все элементы в точку через точку.

  const token = encodeBase64Url (заголовок) + '.' + encodeBase64Url (полезная нагрузка) + '.' + encodeBase64Url (подпись)
// Токен JWT
// eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM  

Вы можете попробовать создать свой собственный JWT на сайте JWT.io.
Вернемся к нашему примеру. Теперь сервер аутентификации может слать пользователю JWT .

Как JWT защищает наши данные?

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

Шаг 5. Проверка JWT

В нашем простом примере из 3 участников мы используем JWT , который подписан с помощью HS256 алгоритма и только сервер аутентификации и сервера приложения знают секретный ключ. Сервер приложения получает секретный ключ от сервера аутентификации во время установки аутентификационных процессов. Приложение знает секретный ключ, когда пользователь делает API-запрос с приложенным к нему токеном, приложение может выполнить тот же алгоритм подписывания к JWT , что в шаге 3 .Приложение может потом проверить эту подпись, сравнивая ее со своей собственной, вычисленной хешированием. Если подписи совпадают, значит JWT валидный, т.е. пришел от проверенного источника. Если подписи не совпадают, значит, что-то пошло не так — возможно, это является признакомой атаки. Таким образом, проверяя JWT , прикрепите доверительный слой (уровень доверия) между собой и пользователь.

В заключение

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

Что дальше?

Подумаем о безопасности и добавим Refresh Token . Смотрите следующую мою статью на эту тему.

Полезные ссылки

  1. 5 простых шагов к пониманию веб-токенов JSON (JWT)
  2. Защита приложений React Redux с помощью токенов JWT
  3. Зачем нужен Refresh Token, если есть Access Token?

.

Безопасность JSON веб-токенов (JWT)

Безопасность JSON Web Tokens (JWT)

Введение

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

Вместе с тем неправильным использованием JWT может негативно сказаться на приложения безопасности. Мы приведем примеры использования JWT, разберем распространенные ошибки реализации в реализации JWT, рассмотрим основные виды атак на эти схемы и дадим рекомендации по их предотвращению.

Формат JWT: описание

В этом разделе статьи мы расскажем, что такое JSON Web Tokens, из каких частей он состоит, как используется для аутентификации пользователей и в чем заключается преимущество JWT в сравнении с классической схемой аутентификации с использованием сессии.

Структура JWT

Согласно RFC-7519, JSON Web Tokens — один из способов представления данных для передачи между двумя или более сторонами в виде JSON-объекта.

Как правило, структурно JWT состоит из трех частей:

  • заголовок — заголовок,
  • Полезная нагрузка

  • — полезная нагрузка,
  • подпись — подпись.

Бывают и исключение, когда в JWT отсутствует подпись.Подобный случай будет рассмотрен далее.

Заголовок и полезная нагрузка — обычные JSON-объекты, которые необходимо закодировать при помощи алгоритма base64url. Закодированные части соединяются друг с другом, и на их основе вычисляется подпись , которая также становится частью токена.

В общем случае токен выглядит следующим образом:

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6InVzZXIifQ.ZvkYYnyM929FM4NW9_hSis7DAxI9_ry 900
 

На рис. 1 можно увидеть, что токен состоит из трех частей, разделенных точками.

Рис. 1. Веб-токен JSON (пример с сайта jwt.io)

Красная часть - заголовок:

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 

В исходном виде:

 {
"typ": "JWT",
"alg": "HS256"
}
 

Фиолетовая часть - полезная нагрузка:

 eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6InVzZXIifQ 

В исходном виде:

 {
  "id": "1337",
  "username": "bizone",
  «iat»: 1594209600,
  "роль": "пользователь"
} 

Голубая часть - подпись:

 ZvkYYnyM929FM4NW9_hSis7_x3_9rymsDAx9yuOcc1I 

Рассмотрим структуру полей более подробно.

Заголовок

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

Эта часть, как было ранее обведено, является JSON-объектом и имеет следующий формат:

 {
"typ": "JWT",
"alg": "HS256"
}
 

Здесь присутствуют следующие поля:

  • typ - тип токена, например JWT;
  • alg - алгоритм, используемый для генерации подписи .

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

Поле alg обязательно для заполнения. В приведенном случае был применен алгоритм HS256 (HMAC-SHA256), в котором для генерации и проверки подписи используется единый секретный ключ.

Для подписи JWT и алгоритмы асимметричного шифрования, например RS256 (RSA-SHA256).Стандарт допускает и других алгоритмов, включая использование HS512, RS512, ES256, ES512, нет и др.

Использование алгоритма none указывает на то, что токен не был подписан. В подобном токене отсутствует часть с подписью, установить его подлинность невозможно.

Полезная нагрузка

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

В нашем случае полезная нагрузка содержит следующий JSON-объект:

 {
"id": "1337",
"username": "bizone",
«iat»: 1594209600,
"роль": "пользователь"
}
 

Здесь присутствуют следующие поля:

  • id - уникальный идентификатор пользователя;
  • имя пользователя - имя пользователя;
  • iat - служебное поле, время генерации токена в формате Unix time;
  • роль - роль пользователя, например admin, user, guest.

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

Подпись

Подпись генерируется следующим образом.

Заголовок и полезная нагрузка кодируются при помощи алгоритма base64url, после чего объединяются в единую строку с использованием точки ( ".") в качестве разделителя.

Генерируется подпись (в нашем примере - алгоритм алгоритма HMAC-SHA256), которая добавляется к исходной строке так же через точку.

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

 подпись = HMACSHA256 (
  base64UrlEncode (заголовок) + "." + base64UrlEncode (полезная нагрузка),
  СЕКРЕТНЫЙ КЛЮЧ
)

JWT = base64UrlEncode (заголовок) + "." + base64UrlEncode (полезная нагрузка) + "." + base64UrlEncode (подпись)
 

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

Подпись приведенного в пример токена можно проверить с использованием секретного ключа test (например, на сайте jwt.io).

Аутентификация с использованием JWT

Схема аутентификации с использованием JWT предельно проста.

Пользователь вводит свои учетные данные в приложении или доверенном сервисе аутентификации.При успешной аутентификации сервис предоставляет пользователю токен, информацию об пользователе (уникальный идентификатор, Ф. И. О., роль и т. Д.).

При обращении токен передается приложению в запросах от пользователя (в cookie, заголовках запроса, POST- или GET-параметрах и т. Д.).

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

Преимущества JWT

Перечислим преимущества использования JWT в сравнении с классической схемой аутентификации, использующей сессию.

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

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

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

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

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

Формат JWT: 9 атаки0005

В этом разделе рассмотрены основные атаки на JWT и даны рекомендации по их предотвращению.

Перехват токена

Перехват пользовательского токена может привести к ряду неприятных последствий.

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

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

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

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

Здесь будут следующие рекомендации:

  • как и в первом случае, использовать защищенное соединение при передаче токенов;
  • ограничить время жизни JWT и использовать механизм токены обновления .
Жетоны обновления

В современных условиях аутентификации, основанных на схемах JWT, после прохождения аутентификации пользователь получает два токена:

  • токен доступа - JWT, на основе которого приложение идентифицирует и авторизует пользователя;
  • токен обновления - токен произвольного формата, служащий для обновления токен доступа.

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

Схема аутентификации в таком случае выглядит следующим образом:

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

Подбор ключа симметричного алгоритма подписи

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

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

В нашем примере из первой части статьи для подписи JWT в ключевой фразе была строка теста.Она простая, короткая и содержащаяся во всех основных словарях для перебора паролей. Злоумышленнику не составит труда подобрать эту ключевую фразу с использованием John the Ripper или hashcat .

Рекомендации для защиты от атаки в этом случае такие:

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

Использование алгоритма none

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

Рассмотрим подобную атаку на нашем примере. Наш токен в незакодированном виде выглядит следующим образом:

Заголовок

:
{
 "typ": "JWT",
  "alg": "HS256"
}
полезная нагрузка:
{
  "id": "1337",
  "username": "bizone",
  «iat»: 1594209600,
  "роль": "пользователь"
}
подпись:
ZvkYYnyM929FM4NW9_hSis7_x3_9rymsDAx9yuOcc1I
 

Предположим, мы хотим, чтобы приложение считало нас администратором.Для этого необходимо установить значение admin в поле роль полезной нагрузки . Но при внесении в токен этого изменения подпись токена станет невалидной, и приложение не примет такой JWT.

Для обхода защитного механизма мы можем попытаться изменить значение поля alg в заголовке токена на none. Наш токен примет следующий вид:

Заголовок

:
{
 "typ": "JWT",
  "alg": "нет"
}
полезная нагрузка:
{
  "id": "1337",
  "username": "bizone",
  «iat»: 1594209600,
  "роль": "администратор"
}
 

Мы используем алгоритм нет, подпись отсутствует.В закодированном виде наш JWT будет выглядеть так:

 eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicIm0sZSI6
 

Этот токен мы и передадим на сервер. Уязвимое приложение, проверив заголовок JWT и обнаружив в нем alg: none , примет этот токен без всяких проверок, как если бы он был легитимным, в результате чего мы получим привилегии администратора.

Чтобы защититься от такой атаки:

  • необходимо вести на стороне приложения белый список разрешенных алгоритмов подписи и отбрасывать все токены с алгоритмом подписи, отличным от разрешенного на сервере;
  • желательно работать строго с одним алгоритмом, например HS256 или RS256.

Изменение алгоритма подписи

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

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

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

Заголовок
:
{
  "alg": "RS256",
  "тип": "JWT"
}
полезная нагрузка:
{
  "id": "1337",
  "username": "bizone",
  «iat»: 1594209600,
  "роль": "пользователь"
}
подпись:
YLOVSKef-paSnnM8P2JLaU2FiS8TbhYqjewLmgRJfCj1Q6rVehAHQ-lABnKoRjlEmHZX-rufHEocDxGUYiGMjMexUQ3zt-WqZITvozJ4pkvbV-mJ1nKj64NmqaR9ZkBWtmF-PHJX50eYjgo9rzLKbVOKYOUa5rDkJPHP3U0aaBXFP39zsGdOTuELv436WXypIZBeRq2yA_mDh23TvzegWCK5sjD4Gh277bCq57tBYjhGIQrDypVe4cWBPlvwFlmG8tdpWGu0uFp0GcbTAfLUlbTSuGROj88BY0XeUs0iqmGlEICES3uqNx7vEmdT5k_AmL436SLedE0VHcyxve5ypQ
 

В кодированном виде он будет следующим образом:

 eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6InVzZXIifQ.YLOVSKef-paSnnM8P2JLaU2FiS8TbhYqjewLmgRJfCj1Q6rVehAHQ-lABnKoRjlEmHZX-rufHEocDxGUYiGMjMexUQ3zt-WqZITvozJ4pkvbV-mJ1nKj64NmqaR9ZkBWtmF-PHJX50eYjgo9rzLKbVOKYOUa5rDkJPHP3U0aaBXFP39zsGdOTuELv436WXypIZBeRq2yA_mDh23TvzegWCK5sjD4Gh277bCq57tBYjhGIQrDypVe4cWBPlvwFlmG8tdpWGu0uFp0GcbTAfLUlbTSuGROj88BY0XeUs0iqmGlEICES3uqNx7vEmdT5k_AmL436SLedE0VHcyxve5ypQ 

В этом случае мы используем для подписи алгоритм RS256, нам понадобятся публичный и приватный ключи.

Публичный ключ:

 ----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ -----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnzyis1ZjfNB0bBgKFMSv
vkTtwlvBsaJq7S5wA + kzeVOVpVWwkWdVha4s38XM / pa / yr47av7 + z3VTmvDRyAHc
aT92whREFpLv9cj5lTeJSibyr / Mrm / YtjCZVWgaOYIhwrXwKLqPr / 11inWsAkfIy
tvHWTxZYEcXLgAXFuUuaS3uF9gEiNQwzGTU1v0FqkqTBr4B8nW3HCN47XUu0t8Y0
e + lf4s4OxQawWD79J9 / 5d3Ry0vbV3Am1FtGJiJvOwRsIfVChDpYStTcHTCMqtvWb
V6L11BWkpzGXSW4Hv43qa + GSYOD2QU68Mb59oSk2OB + BtOLpJofmbGEGgvmwyCI9
MwIDAQAB
----- КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА -----
 

Приватный ключ:

 ----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ RSA -----
MIIEogIBAAKCAQEAnzyis1ZjfNB0bBgKFMSvvkTtwlvBsaJq7S5wA + kzeVOVpVWw
kWdVha4s38XM / pa / yr47av7 + z3VTmvDRyAHcaT92whREFpLv9cj5lTeJSibyr / Mr
m / YtjCZVWgaOYIhwrXwKLqPr / 11inWsAkfIytvHWTxZYEcXLgAXFuUuaS3uF9gEi
NQwzGTU1v0FqkqTBr4B8nW3HCN47XUu0t8Y0e + lf4s4OxQawWD79J9 / 5d3Ry0vbV
3Am1FtGJiJvOwRsIfVChDpYStTcHTCMqtvWbV6L11BWkpzGXSW4Hv43qa + GSYOD2
QU68Mb59oSk2OB + BtOLpJofmbGEGgvmwyCI9MwIDAQABAoIBACiARq2wkltjtcjs
kFvZ7w1JAORHbEufEO1Eu27zOIlqbgyAcAl7q + / 1bip4Z / x1IVES84 / yTaM8p0go
amMhvgry / mS8vNi1BN2SAZEnb / 7xSxbflb70bX9RHLJqKnp5GZe2jexw + wyXlwaM
+ bclUCrh9e1ltH7IvUrRrQnFJfh + is1fRon9Co9Li0GwoN0x0byrrngU8Ak3Y6D9
D8GjQA4Elm94ST3izJv8iCOLSDBmzsPsXfcCUZfmTfZ5DbUDMbMxRnSo3nQeoKGC
0Lj9FkWcfmLcpGlSXTO + Ww1L7EGq + PT3NtRae1FZPwjddQ1 / 4V905kyQFLamAA5Y
lSpE2wkCgYEAy1OPLQcZt4NQnQzPz2SBJqQN2P5u3vXl + zNVKP8w4eBv0vWuJJF +
hkGNnSxXQrTkvDOIUddSKOzHHgSg4nY6K02ecyT0PPm / UZvtRpWrnBjcEVtHEJNp
bU9pLD5iZ0J9sbzPU / LxPmuAP2Bs8JmTn6aFRspFrP7W0s1Nmk2jsm0CgYEAyH0X
+ jpoqxj4efZfkUrg5GbSEhf + dZglf0tTOA5bVg8IYwtmNk / pniLG / zI7c + GlTc9B
BwfMr59EzBq / eFMI7 + LgXaVUsM / sS4Ry + yeK6SJx / otIMWtDfqxsLD8CPMCRvecC
2Pip4uSgrl0MOebl9XKp57GoaUWRWRHqwV4Y6h8CgYAZhI4mh5qZtnhKjY4TKDjx
QYufXSdLAi9v3FxmvchDwOgn4L + PRVdMwDNms2bsL0m5uPn104EzM6w1vzz1zwKz
5pTpPI0OjgWN13Tq8 + PKvm / 4Ga2MjgOgPWQkslulO / oMcXbPwWC3hcRdr9tcQtn9
Imf9n2spL / 6EDFId + Hp / 7QKBgAqlWdiXsWckdE1Fn91 / NGHsc8syKvjjk1onDcw0
NvVi5vcba9oGdElJX3e9mxqUKMrw7msJJv1MX8LWyMQC5L6YNYHDfbPF1q5L4i8j
8mRex97UVokJQRRA452V2vCO6S5ETgpnad36de3MUxHgCOX3qL382Qx9 / THVmbma
3YfRAoGAUxL / Eu5yvMK8SAt / dJK6FedngcM3JEFNplmtLYVLWhkIlNRGDwkg3I5K
y18Ae9n7dHVueyslrb6weq7dTkYDi3iOYRW8HRkIQh06wEdbxt0shTzAJvvCQfrB
jg / 3747WSsf / zBTcHihTRBdAv6OmdhV4 / dD5YBfLAkLrd + mX7iE =
----- КОНЕЦ ЧАСТНОГО КЛЮЧА RSA -----
 

Для тестов мы будем использовать сайт jwt.io (рис. 2).

Рис. 2. Исходный JWT

Как и в примере, модифицируем токен:

Заголовок

:
{
 "typ": "JWT",
  "alg": "HS256"
}
полезная нагрузка:
{
  "id": "1337",
  "username": "bizone",
  «iat»: 1594209600,
  "роль": "администратор"
}
 

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

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6ImFkbWluIn0 

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

Для начала переводим ключ в hex-представление (рис. 3).

Рис. 3. Шестигранное представление ключа

Затем генерируем подпись с использованием openSSL (рис. 4).

Рис. 4. Генерация подписи для JWT

Полученное значение E1R1nWNsO-H7h5WoYCBnm6c1zZy-0hu2VwpWGMVPK2g добавляем к уже имеющейся строке, и наш токен принимает следующий вид:

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6ImFkbWluIn0.E1R1nWNsO-H7h5WoYCZWnm6c1 9001
 

Подставляем в поле secret на jwt.io наш публичный ключ, и JWT успешно проходит проверку (не забудьте поставить галочку secret base64 с кодировкой !) (Рис. 5).

Рис. 5. Успешная проверка подписи JWT

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

  • работать только с одним алгоритмом, например HS256 или RS256;
  • выбирают хорошо известные и проверенные библиотеки для работы с JWT, которые с меньшей вероятностью содержат логические ошибки в процедуре проверки токенов.

Манипуляция ключевыми инструментами

Стандарт RFC-7515 в параметре заголовок kid (идентификатор ключа, идентификатор ключа). Вместе с тем стандарт говорит о том, что формат этого поля строго не определен. Поэтому разработчики вольны интерпретировать его так, как удобно им, часто приводит к различным ошибкам.

Для примера возьмем следующий заголовок JWT:

 {
 "alg": "HS256",
 "тип": "JWT",
 "kid": "1337"
}
 

Предполагается, что для проверки токена будет использован хранящийся в БД ключ с помощью счетатора 1337.В случае ошибок кодирования это может быть уязвимо к SQL-инъекции:

 {
 "alg": "HS256",
 "тип": "JWT",
 "kid": "1337 'union select' SECRET_KEY '- 1"
}
 

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

В следующем предположиме, что для проверки токена будет использован ключ из файла keys / service3.ключ .

 {
 "alg": "HS256",
 "тип": "JWT",
 "kid": "keys / service3.key"
}
 

Если параметр не валидируется, злоумышленник сможет провести атаку Path Traversal (Directory Traversal) и вместо предполагаемого пути до файла с ключом передаст в поле kid путь до какого-либо публичного файла:

 {
 "alg": "HS256",
 "тип": "JWT",
 "kid": "../../../images/public/cat.png"
}
 

Злоумышленник может получить доступ к файлу кот.png и подписать JWT с использованием содержимого этого файла, поскольку этот файл доступен общедоступный (например, он опубликован на одной из страниц сервиса). Сервис же, получив в поле kid путь до файла cat.png , использует его содержимое в качестве ключевого файла для проверки подписи токена (которая успешной, ведь змышленник заранее об этом позаботился).

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

Заключение

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

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

Итак, для безопасного использования JWT следует:

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

.

Обзор способов и протоколов аутентификации в веб-приложениях

Я расскажу о применении различных способов аутентификации для веб-приложений, включая аутентификацию по паролю, по сертификатам, по одноразовым паролям, по ключам доступа и по токенам. Коснусь технологии единого входа (Single Sign-On), рассмотрю различные стандарты и протоколы аутентификации.

Перед тем, как перейти к техническим деталям, давайте немного освежим терминологию.

  • Идентификация - это заявление о том, кем вы были.В зависимости от ситуации, это может быть имя, адрес электронной почты, номер записи, итд.
  • Аутентификация - предоставление доказательств, что вы на самом деле есть тот, кем идентифицировались (от слова «подлинный» - истинный, подлинный).
  • Авторизация - проверка, что вам разрешен доступ к запрашиваемому ресурсу.

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

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

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

Аутентификация по паролю

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

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

HTTP-аутентификация

Этот протокол, описанный в стандарте HTTP 1.0 / 1.1, существует очень давно и до сих пор используется в корпоративной среде. Применительно к веб-сайту работает следующим образом:

  1. Сервер при обращении неавторизованного клиента к защищенному ресурсу, отсылает HTTP-статус «401 Unauthorized» и заголовок «WWW-Authenticate» с указанием схемы и параметров аутентификации.
  2. Браузер, при получении такого ответа, автоматически открывает диалог ввода логина и пароля.Пользователь вводит данные своей учетной записи.
  3. Для этого веб-сайту браузер автоматически использует HTTP-заголовок «Авторизация», в котором передаются данные пользователя для аутентификации сервером.
  4. Сервер аутентифицирует пользователя по данным из этого заголовка. Решение о предоставлении доступа (авторизация) происходит отдельно на основании роли пользователя, ACL или других данных учетной записи.

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

  1. Базовая - наиболее простая схема, в которой имя пользователя и пароль передаются в заголовке Авторизация в незашифрованном виде (в кодировке base64). Однако при использовании протокола HTTPS (HTTP over SSL) является относительно безопасным.

    Пример HTTP аутентификации с использованием базовой схемы.

  2. Дайджест - запрос-ответ, при которой сервер посылает уникальное значение одноразового пароля, а браузер передает хэш пользователя MD5, вычисленный с использованием nonce.Более безопасная альтернативная схема при незащищенных соединений, но подвержена атакам типа "злоумышленник в середине" (с заменой схемы на базовую). Кроме того, использование этой схемы не позволяет применить современные хэш-функции для хранения паролей пользователей на сервере.
  3. NTLM (известная как аутентификация Windows) - также основывается на подходе запрос-ответ, при котором пароль не передается в чистом виде. Эта схема не является стандартом HTTP, но поддерживает браузеров и веб-серверов.Преимущественно используется для аутентификации пользователей Windows Active Directory в веб-приложениях. Уязвима к pass-the-hash-атакам.
  4. Negotiate - еще одна схема из семейства аутентификации Windows, которая позволяет клиенту выбрать между NTLM и аутентификацией Kerberos. Kerberos - более безопасный протокол, основанный на принципе Single Sign-On. Однако он может работать, только если и клиент находится в зоне интрасети и является частью домена Windows.

Стоит отметить, что при использовании HTTP-аутентификации у пользователя нет стандартной возможности выйти из веб-приложения, кроме как закрыть все окна.

Формы аутентификации

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

Работает по следующему принципу: в веб-приложении включается HTML-форма, в которой пользователь должен ввести свои имя пользователя / пароль и отправить их на сервер через HTTP POST для аутентификации.В случае успеха веб-приложение создает токен сеанса, который обычно помещается в файлы cookie браузера. При веб-запросах токен сеанса автоматически передается на сервер и позволяет приложению получить информацию о текущем пользователе для авторизации запроса.

Пример аутентификации форм.

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

  1. Как идентификатор аутентифицированной сессии пользователя, которая хранится в памяти сервера или в базе данных.Сессия должна предоставить возможность предоставить информацию о пользователе.
  2. Как зашифрованный и / или подписанный объект, предоставленные данные о пользователе, а также период действия. Этот подход позволяет реализовать систему управления сервером без сохранения состояния, однако требует механизма обновления сессионного токена по истечении срока действия. Несколько стандартных форматов таких токенований в секции «Аутентификация по токенам».

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

Другие протоколы аутентификации по паролю

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

Существует всего несколько мест, где можно передать имя пользователя и пароль в HTTP-запросах:

  1. URL-запрос - считается небезопасным оказ, т. к. строки могут запоминаться браузерами, прокси и веб-серверами.
  2. Тело запроса - безопасный вариант, но он применим только для запросов, тела сообщения (такие как POST, PUT, PATCH).
  3. HTTP-заголовок —оптимальный вариант, при этом могут быть другие и стандартный заголовок Авторизация (например, с Basic-схемой), и произвольные заголовки.
Распространенные уязвимости и ошибки реализации

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

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

  • Веб-приложение позволяет создать простые пароли.
  • Веб-приложение не защищено от возможности перебора паролей (атаки методом перебора).
  • Веб-приложение само генерирует и распространяет пароли пользователям, однако не требует смены пароля после первого входа (т.е. текущий пароль где-то записан).
  • Веб-приложение разрешает передачу паролей по незащищенному HTTP-соединению, либо в строке URL.
  • Веб-приложение не использует безопасные хэш-функции для хранения паролей пользователей.
  • Веб-приложение не предоставляет возможность изменения пароля либо не нотифицирует пользователей об изменении их паролей.
  • Веб-приложение использует уязвимую функцию восстановления пароля, которую можно использовать для получения несанкционированного доступа к другим параметрам.
  • Веб-приложение не требует повторной аутентификации пользователя для важных действий: смена пароля, изменения адреса доставки товаров и т.п.
  • Веб-приложение создает токены сеанса таким образом, что они могут быть подобраны или предсказаны для других пользователей.
  • Веб-приложение разрешает передачу токенов сеанса по незащищенному HTTP-соединению, либо в строке URL.
  • Веб-приложение уязвимо для атаки-фиксации сеанса (т. Е. Не заменяет токен сеанса при переходе анонимной сессии пользователя в аутентифицированную).
  • Веб-приложение не устанавливает флаги HttpOnly и Secure для файлов cookie браузера, активирует токены сеанса.
  • Веб-приложение не уничтожает сеанс пользователя после короткого периода неактивности либо функцию функции выхода аутентифицированной сессии.
Аутентификация по сертификатам

Сертификат представляет собой набор атрибутов, идентифицирующих владельца, подписанный центр сертификации (CA). CA выполняет роль посредника, который гарантирует подлинность сертификатов (по аналогии с ФМС, выпускающей паспорта).Также сертификат криптографически связан с закрытым ключом, который хранится у владельца сертификата и позволяет однозначно подтвердить факт владения сертификатом.

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

В веб-приложениях традиционно используют сертификаты стандарта X.509. Аутентификация с помощью X.509-сертификат происходит в момент с сервером и является частью протокола SSL / TLS. Этот механизм также хорошо поддерживается браузерами, которые позволяют пользователю выбрать и применить сертификат, если веб-сайт допускает такой способ аутентификации.

Использование сертификата для аутентификации.

Во время аутентификации проверка сертификата на следующие правила:

  1. Сертификат должен быть подписан доверенным органом сертификации (проверка цепочки сертификатов).
  2. Сертификат должен быть действительным на текущую дату (проверка срока действия).
  3. Сертификат не должен быть отозван соответствующего CA (проверка списков исключения).

Пример сертификата X.509.

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

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

Аутентификация по одноразовым паролем

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

Другой вариант использования одноразовых паролей - дополнительная аутентификация пользователя во время выполнения важных действий: перевод денег, изменение настроек и т.п.

Существуют разные источники для создания одноразовых паролей. Наиболее популярные:

  1. Аппаратные или программные токены, которые могут генерировать одноразовые пароли на основании секретного ключа, введенного в них, и текущего времени. Секретные ключи пользователей, являющиеся факторами владения, также хранятся на сервере, что позволяет выполнить введенные одноразовые паролей. Пример аппаратной реализаций токенов - RSA SecurID; программной - приложение Google Authenticator.
  2. Случайно генерируемые коды, передаваемые пользователю через SMS или другой канал связи. В этой ситуации фактор владения - телефон пользователя (точнее - SIM-карта, привязанная к определенному номеру).
  3. Распечатка или скретч-карта со списком заранее сформированных одноразовых паролей. Для каждого нового входа в систему требуется новый одноразовый пароль с указанным номером.

Аппаратный токен RSA SecurID генерирует новый код каждые 30 секунд.

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

Аутентификация по ключам доступа

Этот способ чаще всего используется для аутентификации устройств, сервисов или других приложений при обращении к веб-сервисам.Здесь в качестве секрета применяются ключи доступа (ключ доступа , ключ API ) - длинные уникальные строки, содержащий произвольный набор символов, по сути заменяющие собой комбинацию имени пользователя / пароля.

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

Хороший пример применения аутентификации по ключу облако Amazon Web Services. Предположим, у пользователя есть веб-приложение, позволяющее загружать и просматривать файлы, и он хочет использовать сервис Amazon S3 для хранения. В таком случае пользователь через консоль AWS может создать ключ, имеющий ограниченный доступ к облаку: только чтение / запись его файлов в Amazon S3. Этот ключ в результате можно применить для аутентификации веб-приложения в облаке AWS.

Пример применения аутентификации по ключу.

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

С технической точки зрения, здесь не существует единого протокола: могут передаваться в разных частях HTTP-запрос: URL-запрос, тело запроса или HTTP-заголовок.Как и в случае аутентификации по паролю, наиболее другой вариант - использование HTTP-заголовка. В некоторых случаях используют HTTP-схему Bearer для передачи токена в заголовке (Authorization: Bearer [token]). Чтобы избежать перехвата ключей, соединение с сервером должно быть обязательно защищено протоколом SSL / TLS.

Пример аутентификации по ключу доступа, переданного в HTTP-заголовке.

Кроме того, существуют более сложные схемы аутентификации по ключам для незащищенных соединений.В этом случае ключ обычно состоит из двух частей: публичной и секретной. Публичная часть используется для идентификации клиента, а секретная часть позволяет сгенерировать подпись. Например, по аналогии с дайджестом аутентификации схемой, сервер может послать клиенту уникальное значение nonce или timestamp, клиент - возвратить хэш или HMAC этого значения, вычисленный с использованием секретной части ключа. Это позволяет избежать передачи всего ключа в оригинальном виде и защищает от атак повторного воспроизведения.

Аутентификация по токенам

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

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

  1. Клиент аутентифицируется в провайдере идентификации одним из способов, специфичным для него (пароль, ключ доступа, сертификат, Kerberos, итд.).
  2. Клиент запрашивает у провайдера идентификационных данных ему токен для конкретного SP-приложения. Поставщик удостоверений генерирует токен и отправляет его клиенту.
  3. Клиент аутентифицируется в SP-приложении при помощи этого токена.

Пример аутентификации «активного» клиента при помощи токена, переданного посредством предъявителя схемы.

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

Пример аутентификации «пассивного» клиента посредством перенаправления запроса.

Существует несколько стандартов, в показателях работы алгоритма тестирования между клиентами (активными и пассивными) и IP / SP-приложениями и формат поддерживаемых токенов. Среди наиболее популярных стандартов - OAuth, OpenID Connect, SAML и WS-Federation. Некоторая информация об этих протоколах - ниже в статье.

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

При аутентификации с помощью токена SP-приложение выполнить следующие проверки:

  1. Токен был выдан доверенным приложением удостоверения личности (проверка поля , эмитент ).
  2. Токен предназначается текущему SP-приложению (проверка поля аудитории ).
  3. Срок действия токена еще не истек (проверка поля , срок действия ).
  4. Токен подлинный и не был изменен (проверка подписи).

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

Форматы токенов

Существует несколько распространенных форматов токенов для веб-приложений:

  1. Simple Web Token (SWT) - наиболее простой формат, представляющий собой набор произвольных паролей / значений в формате кодирования HTML-формы.Стандарт определяет несколько зарезервированных имен: Issuer, Audience, ExpiresOn и HMACSHA256. Токен подписывается с помощью симметричного ключа, таким образом оба IP- и SP-приложения должны иметь этот ключ для возможности создания / проверки токена.

    Пример SWT токена (после декодирования).

    Эмитент = http: //auth.myservice.com&
    Audience = http: //myservice.com&
    ExpiresOn = 1435937883 и
    UserName = Джон Смит и
    UserRole = Admin &
    HMACSHA256 = KOUQRPSpy64rvT2KnYyQKtFFXUIggnesSpE7ADA4o9w

  2. JSON Web Token (JWT) - содержит три блока, разделенных точками: заголовок, набор полей (требований) и подпись.Первые два блока представлены в JSON-формате и примерно закодированы в формате base64. Набор полей содержит произвольные пары имя / значения, притом стандарт JWT определяет несколько зарезервированных имен (iss, aud, exp и другие). Подпись может генерироваться при помощи и симметричных алгоритмов шифрования, и асимметричных. Кроме того, существует отдельный стандарт, отписывающий формат зашифрованного JWT-токена.

    Пример подписанного токена JWT (после декодирования 1 и 2 блоков).

    {«alg»: «HS256», «typ»: «JWT»}.
    {«Iss»: «auth.myservice.com», «aud»: «myservice.com», «exp»: «1435937883», «userName»: «John Smith», «userRole»: «Admin»}.
    S9Zs / 8 / uEGGTVVtLggFTizCsMtwOJnRhjaQ2BMUQhcY

  3. Язык разметки утверждений безопасности (SAML) - указать токены (утверждения SAML) в формате XML, включающий информацию об эмитенте, о субъекте, необходимые условия для проверки токена, набор дополнительных утверждений (заявлений) о пользователе. Подпись SAML-токенов осуществляется при помощи ассиметричной криптографии.Кроме того, в отличие от предыдущих форматов, SAML-токены содержат механизм для подтверждения владения токеном, что позволяет предотвратить перехват токенов через «злоумышленник в середине» атаки при использовании незащищенных соединений.
Стандарт SAML

Стандарт Security Assertion Markup Language (SAML) предлагает способы взаимодействия и протоколы между поставщиком удостоверений и поставщиком услуг для обмена данными аутентификации и авторизации посредством токенов.Изначально версии 1.0 и 1.1 были выпущены в 2002 - 2003 гг., В то время как версия 2.0, значительно расширяющая стандартная и обратно несовместимая, опубликована в 2005 г.

Этот основополагающий стандарт - достаточно сложный и поддерживает множество различных сценариев интеграции систем. Основные «строительные блоки» стандарта:

  1. Assertions - собственный формат SAML токенов в XML формате.
  2. Протоколы - набор поддерживаемых сообщений между участниками, среди которых - запрос на создание нового токена, получение токенов, выход из системы (выход), управление связми пользователей и другими пользователями.
  3. Переплеты - механизмы передачи сообщений через различные протоколы. Поддерживаются такие способы, как HTTP Redirect, HTTP POST, HTTP Artifact (ссылка на сообщения), SAML SOAP, SAML URI (адрес получения сообщения) и другие.
  4. Профили - типичные сценарии использования стандарта определяющие набор утверждений, протоколов и привязок, необходимых для их реализации, что позволяет достичь лучшей совместимости. SSO в веб-браузере - один из примеров таких профилей.

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

Рассмотрим краткий пример использования SAML для сценария системы единого входа. Пользователь хочет получить доступ на защищенный ресурс сервис-провайдера (шаг № 1 на диаграмме аутентификации пассивных клиентов). Т. к. пользователь не был аутентифицирован, SP отправляет его на сайт провайдера идентификации’а для создания токена (шаг № 2).Ниже приведен пример ответа SP, где используется SAML HTTP Redirect binding для отправки сообщения с запросом токена:

В случае такого запроса провайдер идентификации аутентифицирует пользователя (шаги №3-4), после чего генерирует токен. Ниже приведен пример ответа IP-адрес с использованием привязки HTTP POST (шаг № 5):

После того, как браузер автоматически отправит эту форму на сайт, поставщик услуг’а (шаг № 6), последний декодирует токен и аутентифицирует пользователя.По результатам успешной авторизации запроса пользователь получает доступ к запрошенному ресурсу (шаг № 7).

Стандарты WS-Trust и WS-Federation

WS-Trust и WS-Federation входят в группу стандартов WS- *, описывающих SOAP / XML-веб сервисы. Эти стандарты созданы группой компаний, куда входят Microsoft, IBM, VeriSign и другие. Наряду с SAML, эти стандарты достаточно сложные, используются преимущественно в корпоративных сценариях.

Стандарт WS-Trust присутствует интерфейс сервиса авторизации, именуемого Secure Token Service (STS).Этот сервис работает по протоколу SOAP и поддерживает создание, обновление и аннулирование токенов. При этом стандарт допускает использование токенов различного формата, однако на практике в основном используются SAML-токены.

Стандарт WS-Federation касается механизмов взаимодействия сервисов между компаниями, в частности, протоколов обмена токенов. При этом WS-Federation расширяет функции и интерфейс сервиса STS, описанного в стандарте WS-Trust. Среди прочего, стандарт WS-Federation определяет:

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

Можно сказать, что WS-Federation позволяет решить те же задачи, что и SAML, однако их подходы и реализация в некоторой степени отличаются.

Стандарты OAuth и OpenID Connect

В отличие от SAML и WS-Federation, стандарт OAuth (открытая авторизация) не входит в протокол аутентификации пользователя. Вместо этого он предоставляет механизм доступа одного приложения к другому от имени пользователя. Однако схемы, позволяющие осуществить аутентификацию пользователя на базе этого стандарта (об этом - ниже).

Первая версия разработывалась в 2007 - 2010 гг., Текущая версия 2.0 опубликована в 2012 г. Версия 2.0 значительно расширяет и несовместима с версией 1.0. Сейчас OAuth 2.0 очень популярен и используется повсеместно для предоставления доступа и третьего сторонней аутентификации пользователей.

Чтобы лучше понять сам стандарт, рассмотрим пример веб-приложения, которое помогает пользователям планировать путешествия. Оно умеет анализировать почту пользователей на наличие писем с подтверждениями бронирований и автоматически их в планируемый маршрут.Возникает вопрос, как это веб-приложение может безопасно получить доступ к почте пользователей, например, в Gmail?

> Попросить пользователя указать данные своей учетной записи? - плохой вариант.
> Попросить пользователя создать ключ доступа? - возможно, но весьма сложно.

Как раз эту проблему и позволяет решить стандарт OAuth: он разрешения, как приложение путешествий (клиент) может получить доступ к почте пользователя (сервер ресурсов) с пользователем (владелец ресурса).В общем виде весь процесс из нескольких шагов:

  1. Пользователь (владелец ресурса) дает разрешение приложению (клиенту) на доступ к определенному ресурсу в виде гранта. Что такое грант, рассмотрим чуть ниже.
  2. Приложение обращается к серверу авторизации и получает токен доступа к ресурсу в обмен на свой грант. В нашем примере сервера авторизации - Google. При вызове приложения аутентифицируется при помощи ключа доступа, выданным ему при предварительной регистрации.
  3. Приложение

  4. использует этот токен для получения требуемых данных от сервера ресурсов (в нашем случае - сервис Gmail).

Взаимодействие компонентов в стандарте OAuth.

Стандарт вида четырех грантов, которые определяют возможные сценарии применения:

  1. Код авторизации - этот грант пользователь может получить от сервера авторизации после успешной аутентификации и подтверждения согласия на предоставление доступа.Такой способ наиболее часто используется в веб-приложениях. Процесс получения гранта очень похож на механизм аутентификации пассивных клиентов в SAML и WS-Federation.
  2. Implicit - безопасно, когда у приложения нет возможности получить токен от сервера авторизации (например, приложение JavaScript в браузере). В этом случае грант представляет собой токен, полученный от сервера авторизации, а шаг № 2 исключается из сценария выше.
  3. Resource Owner Password Credentials - грант представляет собой пару логин / пароль пользователя.Может быть, если приложение является «интерфейсом» для сервера ресурсов (например, приложение - мобильный клиент для Gmail).
  4. Учетные данные клиента - в этом случае нет никакого пользователя, приложение получает доступ к своим ресурсам при помощи своих ключей доступа (отключается шаг № 1).

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

  1. За счет API сервера ресурсов включает операцию, предоставляющую информацию о самом пользователе (например, / me в Facebook API). Приложение может выполнить эту операцию каждый раз после получения токена для идентификации клиента.Такой метод иногда называют псевдо-аутентификацией .
  2. Использовать стандарт OpenID Connect , используя как слой учетных данных OAuth (опубликован в 2014 г.). В соответствии с этим стандартом, сервер авторизации дополнительный токен идентификации на шаге № 2. Этот токен в формате JWT будет содержать набор определенных полей (заявок) с информацией о пользователе.

Стоит заметить, что OpenID Connect, заменивший предыдущие версии стандарта OpenID 1.0 и 2.0, также содержит набор необязательных дополнений для поиска серверов авторизации, динамической регистрации клиентов и управления сессией пользователя.

Заключение

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

Способ

Основное применение

Протоколы

По паролю

Аутентификация пользователей

HTTP, формы

По сертификатам

Аутентификация пользователей в безопасных приложениях; аутентификация сервисов

SSL / TLS

По одноразовым паролем

Дополнительная аутентификация пользователей (для достижения двухфакторной аутентификации)

Формы

По ключам доступа

Аутентификация сервисов и приложений

По токенам

Делегированная аутентификация пользователей; делегированная авторизация приложений

SAML, WS-Federation, OAuth, OpenID Connect

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

Автор : Дмитрий Выростков, архитектор решений в DataArt.

.

Справочник анонима. Как работают токены аутентификации и в чем их отличия от паролей

Содержание статьи

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

Справочник анонима

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

Другие статьи цикла:

Если для тебя эти материалы тривиальны - отлично! Ты сделаешь доброе дело, отправив ссылку на них своим друзьям, знакомым и родственникам, менее подкованным в вопросах.

Подписываемся под данными

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

Схема генерации HMAC (hash-based message authentication code), кода аутентификации сообщений с использованием хеш-функции Схема генерации HMAC (код аутентификации сообщений на основе хэша), кода аутентификации сообщений с использованием хеш-функций.

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

Придумываем коды доступа

Люди, которые придумали двухфакторную аутентификацию, по всей видимости, руководствовались принципом «одна голова хорошо, а две - лучше». И действительно одного - два точно безопаснее. Но пароли, которые отправляет сайт в SMS, нельзя назвать абсолютно защищенными: сообщение чаще всего можно перехватить. Другое дело - специальные приложения для аутентификации, они нацелены на полную защиту всего процесса входа пользователя в аккаунт.Именно их мы сейчас с тобой и разберем.

Создание безопасных одноразовых паролей состоит из двух этапов:

  1. Первичная настройка - включение двухфакторной аутентификации.
  2. Использование пароля - непосредственный ввод кода и отправка для проверки.

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

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

На самом деле весь секрет - последовательность из случайных символов, которые закодированы в формате Base32. Суммарно они занимают не меньше 128 бит, а чаще и все 190 бит. Эту последовательность и видит пользователя как текст или QR-код.

Так выглядит код QR для обмена секретом Так выглядит код QR для обмена секретом
Тот же самый секрет, только текстом Тот же самый секрет, только текст

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

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

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

Возьмем время празднования Нового года в формате UNIX ( 1577811600000 ) и посчитаем порядковый номер нашего пароля: поделим на 30 секунд - 52593720 . Воспользуемся нашим секретом и вычислим хеш - по стандарту RFC 6238 это функция SHA-1:

  $ echo -n '52593720' | openssl sha1 -hmac 'QWERTYUI12345678'
e818e7f3efcb625658c603b08b12522f1e4d160a
  

Не забудь про аргумент -n для команды echo , чтобы в ее выводе не было ненужного перевода строки, иначе хеш будет другим.

Теперь дело за малым: нужно получить шесть цифр, которые мы и будем отправлять на сервер при авторизации. Возьмем последние четыре бита хеша - сдвиг, - это будет число a , или 10. Именно по этому сдвигу расположен наш код, который пока в виде байтов, - 03b08b12 = 61901586 . Отбросим все цифры этого числа, кроме шести последних, и получим наш новенький, готовый к использованию одноразовый код - 901586 .

Входим в приложение

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

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

Если есть данные, следует подтвердить, что нам надо подписать их секретным ключом, используя HMAC.Для этого применяют такой же способ хеширования, что и для одноразовых паролей, только вместо шести цифр берется весь хеш целиком. Единственная разница - это сам алгоритм хеширования: в таких токенах SHA-1 считают слишком коротким и небезопасным, поэтому обычно используют SHA-256.

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

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

Любой токен состоит из трех частей: заголовок со служебной информацией, данными и подписи. Так как стандартом безопасности считается SHA-256, то мы запишем его в наш заголовок.

  {
  "alg": "HS256"
}
  

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

  {
  "user_id": 123456
}
  

Закодируем наши данные и заголовок в Base64 и соединим их через точку. Это делается для того, чтобы безопасно пересылать данные через HTTP: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjogMTIzNDU2fQ . Теперь, зная и данные, и заголовок, мы можем посчитать ее хеш, который содержит наш пароль - строку QWERTYUI12345678 .

  $ echo -n 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjogMTIzNDU2fQ' | openssl sha256 -hmac 'QWERTYUI12345678'
e0a6b48a961ee3fc7eb38afcdb1a8ef22efb0572e1d5333b85db2aa66919e98e
  

Этот хеш нам тоже надо перевести в кодировку Base64 и затем присоединить к уже соответствующей строке из заголовка и данных: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjogMTIzNDU2fQ.4Ka0ipYe4 / x-s4r82xqO8i77BXLh2TM7hdsqpmkZ6Y4 - это и есть наш токен. Можно пользоваться!

Так выглядит наш токен Так выглядит наш токен

Заключение

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

.