Защита токенов JWT от злоумышленниковC#

Место общения программистов C#
Anonymous
Защита токенов JWT от злоумышленников

Сообщение Anonymous »

Я использую JWT в приложении веб-API ASP.NET Core. Для JWT мне нужен токен, который я сейчас храню в appsettings.json. Выглядит это так:

Код: Выделить всё

"Jwt": {
"Token": "cB7lN2sz3H9wI5pAJ8fgkLzV0Q4yxXMiRSO6rTKP1tE7mdjFZCpvWGuoDbhYaeqJnMVwiX5UFz4t8NYsQBoL3rlc20PGfMkj1HvT9pqRbDdOEJZmKaU6gSyWbVx8CnI7T0xywZ2mLI4pk3A9vgHeD5PoFN8jQK1X6sruYRhO0eWtxM3BVzZ9nLD4yfpA7qlUki2Sc6mHJ5XboGrQCVwIwxa9tgPB2sKjRyuM1ZvF7Ylnzhe4H8qo3k"
},
Потенциальный злоумышленник, получивший доступ к моему серверу, теперь может прочитать этот токен из моего файла appsettings.json. Если злоумышленник теперь владеет этим токеном, он может создать любые токены JWT для моего приложения.
Чтобы решить эту проблему, я бы сейчас использовал шаблон Singleton. Для этого я бы сначала сгенерировал статический класс с методом генерации случайных строк.
Это будет выглядеть так:

Код: Выделить всё

using System.Text;

namespace MyApp.Utils
{
public class RandomStringGenerator
{
private static readonly char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
private static readonly Random random = new Random();

public static string Generate(int length)
{
var stringBuilder = new StringBuilder(length);

for (int i = 0; i < length; i++)
{
var randomIndex = random.Next(chars.Length);
stringBuilder.Append(chars[randomIndex]);
}

return stringBuilder.ToString();
}
}
}
Тогда мне нужен JWTTokenProvider (одиночный). Это будет выглядеть так:

Код: Выделить всё

namespace MyApp.Utils
{
sealed class JWTTokenProvider
{
private static string _token = null!;
private static JWTTokenProvider _instance;
private static readonly object _lock = new object();

private JWTTokenProvider()
{
_token = RandomStringGenerator.Generate(200);
}

public static JWTTokenProvider Instance()
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new JWTTokenProvider();
}
}
}
return _instance;
}

public string GetToken()
{
return _token;
}
}
}
Если мне теперь понадобится доступ к токену JWT, например. при запуске сервера или когда клиент запрашивает токен JWT после аутентификации, я могу получить к нему доступ следующим образом:

Код: Выделить всё

JWTTokenProvider.Instance().GetToken()
Что вы думаете об этом подходе?

Подробнее здесь: https://stackoverflow.com/questions/786 ... -attackers

Вернуться в «C#»