Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / JWT и публичный ключ / 25 сообщений из 26, страница 1 из 2
18.09.2020, 20:25
    #40000389
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Коллеги!
Стоит задача:
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
18.09.2020, 20:41
    #40000393
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Публичный ключ тебе даст сервер авторизации, который выписал токен

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

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


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

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


вот в ЭТОМ и вопрос: откуда мне взять эту публичную часть , чтобы выдать?
потому как приватная часть у меня просто прописана в сеттингсах и я ее могу менять как хочу.
...
Рейтинг: 0 / 0
18.09.2020, 23:18
    #40000414
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
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
18.09.2020, 23:50
    #40000416
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Ну я ж не знаю, где у тебя там что прописано
RegisteredUser
токен валидировался на беке
если валидировался, значит использовал публичную часть пары, значит где-то ты её прописал. Приватная часть ключа отдельно сама по себе смысла не имеет )
...
Рейтинг: 0 / 0
18.09.2020, 23:50
    #40000417
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
RegisteredUser
приватный подложить себе на бек, а публичный отдать фронту?
ну отдавать-то фронту все равно бэк будет.
...
Рейтинг: 0 / 0
25.09.2020, 09:31
    #40002418
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
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
25.09.2020, 10:49
    #40002446
stenford
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
глупость какая-то фронтенду проверять подписи токенов
...
Рейтинг: 0 / 0
25.09.2020, 14:39
    #40002555
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
RegisteredUser
Теперь фронт требует от меня этот публичный ключ .
Откуда мне им его дать??? )))))


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

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

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


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


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

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


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

Сходите и ещё раз уточните, они там протрезвели, постановщики или по-позже нужно придти.
Проверка подписи проверяется на сервере.
При выдаче токена по запросу проверяется клиентом-сервера на основании приватного ключа.
...
Рейтинг: 0 / 0
25.09.2020, 18:04
    #40002633
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
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
25.09.2020, 22:58
    #40002716
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
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
25.09.2020, 23:46
    #40002733
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
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
28.09.2020, 12:57
    #40003335
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Коллеги!

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

Ранее у меня использовался 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
28.09.2020, 13:30
    #40003378
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Погоди, причем тут валидация на бэке, ты же ее на фронте хотел сделать. Валидация на бэке есть из коробки, ее писать самому не требуется.
...
Рейтинг: 0 / 0
28.09.2020, 13:49
    #40003395
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Shocker.Pro
Погоди, причем тут валидация на бэке, ты же ее на фронте хотел сделать. Валидация на бэке есть из коробки, ее писать самому не требуется.


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

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

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

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

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

Подписанный документ не зашифрован. JWT-токен не зашифрован, вся информация там в открытом виде
...
Рейтинг: 0 / 0
28.09.2020, 23:15
    #40003702
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Спасибо за помощь.
Разобрался с ключами и подписями.
Чуть позже выложу код, может кому-то тоже будет надо такую фигню сделать.
...
Рейтинг: 0 / 0
29.09.2020, 21:35
    #40004139
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JWT и публичный ключ
Очень помог еще вот этот ресурс
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
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / JWT и публичный ключ / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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