powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / JWT и публичный ключ
25 сообщений из 26, страница 1 из 2
JWT и публичный ключ
    #40000389
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!
Стоит задача:
1. Необходимо реализовать декодирования JWT Access / Refresh токенов с проверкой цифровой подписи и срока жизни посредством публичного ключа .



На беке пара токенов (Access / Refresh) генерятся с сеттингами

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class JWTSettings
    {
        public string Private_Key { get; set; } // это мой приватный ключ для подписи токенов
        public double AccessToken_LifeTime { get; set; }
        public double RefreshToken_LifeTime { get; set; }
        public string Issuer { get; set; }
    }



Теперь фронт требует от меня этот публичный ключ .
Откуда мне им его дать??? )))))
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000393
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Публичный ключ тебе даст сервер авторизации, который выписал токен

https://сервер/.well-known/openid-configuration/
https://сервер/.well-known/openid-configuration/jwks
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000394
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, зачем тебе это реализовывать самому, если есть готовые реализации?
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000395
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Публичный ключ тебе даст сервер авторизации, который выписал токен

https://сервер/.well-known/openid-configuration/
https://сервер/.well-known/openid-configuration/jwks


не совсем понял?
токены генерятся у меня на беке. нет больше никаких серверов авторизации.
раньше все было хорошо без всяких ключей.
токен валидировался на беке и фронт ничего не делал, но пришли новые требования.
теперь фронт у себя тоже будет проверять токены, а мне им дать нечего )))
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000400
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
токены генерятся у меня на беке
ну ты их руками что ли генеришь? Ну и предоставляй тогда сам эндпоинт для получения публичного ключа
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000404
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
RegisteredUser
токены генерятся у меня на беке
ну ты их руками что ли генеришь? Ну и предоставляй тогда сам эндпоинт для получения публичного ключа

не совсем руками )))
вот через это: System.IdentityModel.Tokens.Jwt
ендпоинт сделать не проблем, где взять публичный ключ, чтобы его отдать?
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000408
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
вот через это: System.IdentityModel.Tokens.Jwt
Ну "вот это" подписывает токен тем ключом, которым ты ему дал (приватной частью), а публичную часть тебе нужно будет выдать всем желающим проверить эту подпись.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000412
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
RegisteredUser
вот через это: System.IdentityModel.Tokens.Jwt
Ну "вот это" подписывает токен тем ключом, которым ты ему дал (приватной частью), а публичную часть тебе нужно будет выдать всем желающим проверить эту подпись.


вот в ЭТОМ и вопрос: откуда мне взять эту публичную часть , чтобы выдать?
потому как приватная часть у меня просто прописана в сеттингсах и я ее могу менять как хочу.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000414
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUser
Shocker.Pro
пропущено...
Ну "вот это" подписывает токен тем ключом, которым ты ему дал (приватной частью), а публичную часть тебе нужно будет выдать всем желающим проверить эту подпись.


вот в ЭТОМ и вопрос: откуда мне взять эту публичную часть , чтобы выдать?
потому как приватная часть у меня просто прописана в сеттингсах и я ее могу менять как хочу.



вот так сгенерить пару?
Код: powershell
1.
2.
$ openssl genrsa -out jwtRS256.key 4096
$ openssl rsa -in jwtRS256.key -pubout -out jwtRS256.key.pub


приватный подложить себе на бек, а публичный отдать фронту?


взято отсюда: https://medium.com/@kevinle/securing-c-net-webapi-with-public-private-key-signed-jwts-signed-by-nodejs-4fd60d97b7f4
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000416
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я ж не знаю, где у тебя там что прописано
RegisteredUser
токен валидировался на беке
если валидировался, значит использовал публичную часть пары, значит где-то ты её прописал. Приватная часть ключа отдельно сама по себе смысла не имеет )
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40000417
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
приватный подложить себе на бек, а публичный отдать фронту?
ну отдавать-то фронту все равно бэк будет.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002418
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUser
RegisteredUser
пропущено...


вот в ЭТОМ и вопрос: откуда мне взять эту публичную часть , чтобы выдать?
потому как приватная часть у меня просто прописана в сеттингсах и я ее могу менять как хочу.



вот так сгенерить пару?
Код: powershell
1.
2.
$ openssl genrsa -out jwtRS256.key 4096
$ openssl rsa -in jwtRS256.key -pubout -out jwtRS256.key.pub


приватный подложить себе на бек, а публичный отдать фронту?


взято отсюда: https://medium.com/@kevinle/securing-c-net-webapi-with-public-private-key-signed-jwts-signed-by-nodejs-4fd60d97b7f4


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

п.с. я просто думал, что эти ключи как-то генерятся через JWT, но все окозалось проще
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002446
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупость какая-то фронтенду проверять подписи токенов
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002555
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
Теперь фронт требует от меня этот публичный ключ .
Откуда мне им его дать??? )))))


Какой ещё фронт? Можно подробнее?
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002622
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stenford
глупость какая-то фронтенду проверять подписи токенов

ну, такое требование появилось ))) я не виноватая

hVostt
RegisteredUser
Теперь фронт требует от меня этот публичный ключ .
Откуда мне им его дать??? )))))


Какой ещё фронт? Можно подробнее?


мобильное приложение
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002630
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
stenford
глупость какая-то фронтенду проверять подписи токенов

ну, такое требование появилось ))) я не виноватая


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

Сходите и ещё раз уточните, они там протрезвели, постановщики или по-позже нужно придти.
Проверка подписи проверяется на сервере.
При выдаче токена по запросу проверяется клиентом-сервера на основании приватного ключа.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002633
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
RegisteredUser
пропущено...

ну, такое требование появилось ))) я не виноватая


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

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


может и неправильно я что-то понял, поэтому привожу текст задачи для мобильного приложения:

1. Необходимо реализовать декодирования JWT Access / Refresh токенов с проверкой цифровой подписи и срока жизни посредством публичного ключа.
1.2 Время действия каждого токена из пары считывать непосредственно с поля `exp` соответствующего токена в декодированном виде
1.3 В постоянной / энергонезависимой памяти устройства хранить только JWT Refresh Token
1.4 JWT Access Token хранить только в пределах оперативной памяти устройства


2. Сценарий запуска приложения:
2.1 Считать с энергонезависимой памяти устройства JWT Refresh Token, провести процедуру его верификации
1. Если токен невалидный, сохранить в пределах оперативной памяти устройства значения текущей роли пользователя в `null`, завершить процедуру инициализации
2.2 Выполнить метод `RefreshToken` и обновить пару токенов
2.3 Токены проверить на предмет цифровой подписи и срока жизни
1. При сбое верификации хотя бы одного токена, сохранить в пределах оперативной памяти устройства значения текущей роли пользователя в `null`, завершить процедуру инициализации
2.4 Сохранить JWT Refresh Token в энергонезависимой памяти устройства, JWT Access Token и роль пользователя - в пределах оперативной памяти устройства
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002716
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
hVostt
пропущено...


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

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


может и неправильно я что-то понял, поэтому привожу текст задачи для мобильного приложения:

1. Необходимо реализовать декодирования JWT Access / Refresh токенов с проверкой цифровой подписи и срока жизни посредством публичного ключа.
1.2 Время действия каждого токена из пары считывать непосредственно с поля `exp` соответствующего токена в декодированном виде
1.3 В постоянной / энергонезависимой памяти устройства хранить только JWT Refresh Token
1.4 JWT Access Token хранить только в пределах оперативной памяти устройства


2. Сценарий запуска приложения:
2.1 Считать с энергонезависимой памяти устройства JWT Refresh Token, провести процедуру его верификации
1. Если токен невалидный, сохранить в пределах оперативной памяти устройства значения текущей роли пользователя в `null`, завершить процедуру инициализации
2.2 Выполнить метод `RefreshToken` и обновить пару токенов
2.3 Токены проверить на предмет цифровой подписи и срока жизни
1. При сбое верификации хотя бы одного токена, сохранить в пределах оперативной памяти устройства значения текущей роли пользователя в `null`, завершить процедуру инициализации
2.4 Сохранить JWT Refresh Token в энергонезависимой памяти устройства, JWT Access Token и роль пользователя - в пределах оперативной памяти устройства


Стандартно, вцелом. Зачем Вам этот баян, что в этом топике обсуждаете?
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40002733
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
может и неправильно я что-то понял, поэтому привожу текст задачи для мобильного приложения:

1. Необходимо реализовать декодирования JWT Access / Refresh токенов с проверкой цифровой подписи и срока жизни посредством публичного ключа.
1.2 Время действия каждого токена из пары считывать непосредственно с поля `exp` соответствующего токена в декодированном виде
1.3 В постоянной / энергонезависимой памяти устройства хранить только JWT Refresh Token
1.4 JWT Access Token хранить только в пределах оперативной памяти устройства


2. Сценарий запуска приложения:
2.1 Считать с энергонезависимой памяти устройства JWT Refresh Token, провести процедуру его верификации
1. Если токен невалидный, сохранить в пределах оперативной памяти устройства значения текущей роли пользователя в `null`, завершить процедуру инициализации
2.2 Выполнить метод `RefreshToken` и обновить пару токенов
2.3 Токены проверить на предмет цифровой подписи и срока жизни
1. При сбое верификации хотя бы одного токена, сохранить в пределах оперативной памяти устройства значения текущей роли пользователя в `null`, завершить процедуру инициализации
2.4 Сохранить JWT Refresh Token в энергонезависимой памяти устройства, JWT Access Token и роль пользователя - в пределах оперативной памяти устройства


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

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

Собственно пару ключей можно сгенерировать так:

Код: powershell
1.
2.
3.
4.
ssh-keygen -t rsa -b 4096 -m PEM -f jwtRS256.key

# без пароля!
openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub



в файле jwtRS256.key будет приватный ключ
в файле jwtRS256.key.pub будет публичный ключик.

Или воспользуйтесь публичным сервисом, но это не безопасно: https://mkjwk.org/
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40003335
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!

Есть еще вопрос.

Ранее у меня использовался SymmetricSecurityKey и ключ был один.
При создании токена использую ключ:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        public void CreateTokensV2()
        {  
...
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settings.Key)); 

            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
...
         }



При валидации публичный ключ
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
        public static void ValidateTokenAsync(string token, string key)
        {
            try
            {
                new JwtSecurityTokenHandler().ValidateToken(token, 
                    GetTokenValidationParameters(key),  out var securityToken);
            }
            catch (SecurityTokenExpiredException)
            {
                throw new MyException(new ErrorCodes().TOKEN_EXPIRED);
            }
.....
         }

        private static TokenValidationParameters GetTokenValidationParameters(string key)
        {

            return new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,                
                IssuerSigningKey = new  SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)), 

                ValidateIssuer = true,
                ValidIssuer = settings.Issuer,

                ValidateAudience = false,

                ValidateLifetime = true,

                ClockSkew = TimeSpan.Zero
            };
        }



теперь у меня 2 ключа. что теперь использовать для SecurityKey?

П.С. У меня бек на .Net Core 2.2.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40003378
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди, причем тут валидация на бэке, ты же ее на фронте хотел сделать. Валидация на бэке есть из коробки, ее писать самому не требуется.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40003395
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Погоди, причем тут валидация на бэке, ты же ее на фронте хотел сделать. Валидация на бэке есть из коробки, ее писать самому не требуется.


На беке валидация как была, так и должна остаться.

Я на беке подписываю токены ПРИВАТНЫМ ключем?
key у меня раньше шифровался моим ключем: var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settings.Key));
вот тут: var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

Я на беке так и буду валидировать приватным ключем?

Может все же там RSA пара нужна, а не симметричная?
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40003402
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты бы разобрался как работает несимметричное шифрование, чем отличается шифрование от подписывания, а то щас наколбасишь.

Подписывается приватным ключом отправителя, подпись проверяется публичным ключом отправителя
Шифруется публичным ключом получателя, получатель расшифровывает своим приватным ключом.

Подписанный документ не зашифрован. JWT-токен не зашифрован, вся информация там в открытом виде
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40003702
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь.
Разобрался с ключами и подписями.
Чуть позже выложу код, может кому-то тоже будет надо такую фигню сделать.
...
Рейтинг: 0 / 0
JWT и публичный ключ
    #40004139
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень помог еще вот этот ресурс
Introduction to OAuth2: Json Web Tokens
Тут пример, как использовать RS256 для подписи токена с последующей валидацией подписи открытым ключем.
Единственное, на всякий случай дам свой код, который точно валидируется на https://jwt.io/

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
      
            RSACryptoServiceProvider publicAndPrivate = new RSACryptoServiceProvider();
            publicAndPrivate.ImportParameters(rsaParams_Private);

            var expiresAccessToken = DateTime.UtcNow.AddMinutes(_settings.AccessTokenLifeTime);

            JwtSecurityToken jwtToken_Access = new JwtSecurityToken(
                audience: null,
                issuer: _settings.Issuer,
                claims: new List<Claim>() {
                        new Claim(JwtRegisteredClaimNames.Jti, GuidAccessToken.ToString()),
                        new Claim(JwtRegisteredClaimNames.Typ, TokenTypes.Access.ToString()),
                        new Claim(JwtRegisteredClaimNames.Exp, expiresAccessToken.ToString()),
                        new Claim(JwtRegisteredClaimNames.UniqueName, "12345")
                },
                lifetime: new Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddHours(1)),
                signingCredentials: new SigningCredentials(new RsaSecurityKey(publicAndPrivate)
                                                             , SecurityAlgorithms.RsaSha256));

            JwtSecurityTokenHandler tokenHandler_Access = new JwtSecurityTokenHandler();

            string tokenString = tokenHandler_Access.WriteToken(jwtToken_Access);

            Console.WriteLine("Token string: {0}", tokenString);
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / JWT и публичный ключ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]