Где безопасно хранить токен доступа в приложении UWP?

Локальное хранилище — неподходящее место для хранения токенов. Но в этом сообщении в блоге говорится, что LocalCache, как правило, является правильным местом. Если я храню в LocalCache с использованием DPAPI, достаточно ли это безопасно?

Является ли PasswordVault подходящим местом для его хранения?

Как я могу безопасно хранить токен, чтобы токен этого приложения был недоступен?

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

Nico Zhu 24.12.2020 09:37
SQL Injection: Атаки в реальной жизни и как это вредит бизнесу
SQL Injection: Атаки в реальной жизни и как это вредит бизнесу
Один-единственный вредоносный запрос может нанести ущерб вашему бизнесу. Уязвимости вашего кода могут привести к:
1
1
936
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Где безопасно хранить токен доступа в приложении UWP?

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

var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

// Create a simple setting.
localSettings.Values["accesstoken"] = token;

// Read data from a simple setting.
Object value = localSettings.Values["accesstoken"];

if (value == null)
{
    // No data.
}
else
{
    // Access data in value.
}

И если вы хотите безопасно хранить токен доступа. Среда выполнения Windows предоставляет класс PasswordVault для безопасного хранения учетных данных. для получения дополнительной информации обратитесь к этому документу.

Ответ принят как подходящий

Я определенно рекомендую хранить конфиденциальную информацию, такую ​​​​как токен доступа, в PasswordVault, поскольку LocalSettings не зашифрованы и легко доступны из папки пакета приложения в AppData.

Хотя у PasswordVault немного странный API, вы все равно можете легко использовать его для хранения токена:

var passwordVault = new PasswordVault();
passwordVault.Add(new PasswordCredential("Resource", "UserName", accessToken));

В вашем случае вас, скорее всего, интересует только токен доступа, поэтому «ресурс» и «имя пользователя» могут быть просто произвольными константами. Получить токен также легко:

//find credentials in the store            
PasswordCredential? credential = null;

try
{
   // Try to get an existing credential from the vault.
   credential = _passwordVault.Retrieve("Resource", "UserName");
}
catch (Exception)
{
   // When there is no matching resource an error occurs, which we ignore.
}
credential?.RetrievePassword();
return credential?.Password;

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

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

Другие вопросы по теме