Xamarin.Essentials:セキュリティで保護されたストレージ
SecureStorage クラスは、単純なキーと値のペアを安全に格納するのに役立ちます。
作業開始
この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。
SecureStorage の機能にアクセスするには、次のプラットフォーム固有の設定が必要です。
ヒント
アプリの自動バックアップは Android 6.0 (API レベル 23) 以降の機能です。ユーザーのアプリ データ (共有の設定、アプリの内部ストレージ内のファイル、その他の特定のファイル) がバックアップされます。 アプリが新しいデバイスに再インストールまたはインストールされると、データが復元されます。 これは、バックアップされ、復元するときに暗号化解除できない共有の設定を利用する SecureStorage
に影響を与えます。 Xamarin.Essentials では、リセットできるようにキーを削除することで自動的にこのケースを処理しますが、自動バックアップを無効にすることで追加の手順を行うことができます。
バックアップを有効または無効にする
AndroidManifest.xml
ファイルの android:allowBackup
設定を false に設定することで、アプリケーション全体の自動バックアップを無効にすることができます。 この方法が推奨されるのは、データを復元する別の方法を計画する場合のみです。
<manifest ... >
...
<application android:allowBackup="false" ... >
...
</application>
</manifest>
選択的バックアップ
自動バックアップを構成して、特定のコンテンツのバックアップを無効にすることができます。 カスタム規則セットを作成して、バックアップ対象から SecureStore
項目を除外することができます。
AndroidManifest.xml で
android:fullBackupContent
属性を設定します。<application ... android:fullBackupContent="@xml/auto_backup_rules"> </application>
auto_backup_rules.xml という名前の新しい XML ファイルを、AndroidResource のビルド アクションで Resources/xml ディレクトリに作成します。 次に、
SecureStorage
を除くすべての共有の設定を含める次の内容を設定します。<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="${applicationId}.xamarinessentials.xml"/> </full-backup-content>
セキュリティで保護されたストレージの使用
クラスの Xamarin.Essentials への参照を追加します。
using Xamarin.Essentials;
指定されたキーに対する値をセキュリティで保護されたストレージに保存するには:
try
{
await SecureStorage.SetAsync("oauth_token", "secret-oauth-token-value");
}
catch (Exception ex)
{
// Possible that device doesn't support secure storage on device.
}
セキュリティで保護されたストレージから値を取得するには:
try
{
var oauthToken = await SecureStorage.GetAsync("oauth_token");
}
catch (Exception ex)
{
// Possible that device doesn't support secure storage on device.
}
Note
要求されたキーに関連付けられている値が存在しない場合、GetAsync
は null
を返します。
特定のキーを削除するには、次を呼び出します。
SecureStorage.Remove("oauth_token");
すべてのキーを削除するには、次を呼び出します。
SecureStorage.RemoveAll();
ヒント
GetAsync
または SetAsync
の呼び出し時に例外がスローされることがあります。 セキュリティで保護されたストレージに対応していないデバイス、暗号化キーの変更、データの破損が原因として考えられます。 可能であれば、設定を削除し、追加し直すことでこれに対処することをお勧めします。
プラットフォームの実装の詳細
Android キーストアは、共有の設定に [アプリのパッケージ ID].xamarinessentials というファイル名で保存する前に、値を暗号化するための暗号キーを格納するために使用されます。 共有の設定ファイルで使用されるキー (暗号化キーではなく値のキー) は、SecureStorage
API に渡されるキーの MD5 ハッシュです。
API レベル 23 以上
新しい API レベルでは、Android キーストアから AES キーを取得し、AES/GCM/NoPadding 暗号と共に使用して、共有の設定ファイルに格納する前に値を暗号化します。
API レベル 22 以下
古い API レベルでは、Android キーストアは RSA キーの格納のみをサポートしています。これは RSA/ECB/PKCS1Padding 暗号と共に使用され、AES キー (実行時にランダムで生成されます) を暗号化し、キー SecureStorageKey の下で共有の設定ファイルに格納されます (まだ作成されていない場合)。
SecureStorage は Preferences API を使用し、Preferences ドキュメントで説明されているのと同じデータ永続化に従います。 デバイスが API レベル 22 以下から API レベル 23 以上にアップグレードされる場合、アプリをアンインストールするか RemoveAll を呼び出さない限り、この種類の暗号化が使用され続けます。
制限事項
この API は、少量のテキストを格納することを想定しています。 大量のテキストを格納するためにこれを使用しようとすると、パフォーマンスが低下する可能性があります。