Xamarin.Essentials:セキュリティで保護されたストレージ
[アーティクル]
2019/04/02
11 人の共同作成者
この記事の内容
作業開始
セキュリティで保護されたストレージの使用
プラットフォームの実装の詳細
制限事項
API
関連ビデオ
さらに 2 個を表示
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 >
iOS シミュレーター 上で開発している場合は、キーチェーン エンタイトルメントを有効にし、アプリケーションのバンドル ID に対してキーチェーンのアクセス グループを追加します。
iOS プロジェクト内の Entitlements.plist を開き、キーチェーン エンタイトルメントを見つけて有効にします。 これで、アプリケーションの ID がグループとして自動的に追加されます。
プロジェクトのプロパティの [iOS バンドル署名] で、 [カスタムの権利] を Entitlements.plist に設定します。
ヒント
iOS デバイスに展開する場合は、このエンタイトルメントは不要であり、削除する必要があります。
クラスの Xamarin.Essentials への参照を追加します。
using Xamarin.Essentials;
指定されたキー に対する値をセキュリティで保護されたストレージに保存するには:
try
{
await SecureStorage.SetAsync("oauth_token" , "secret-oauth-token-value" );
}
catch (Exception ex)
{
}
セキュリティで保護されたストレージから値を取得するには:
try
{
var oauthToken = await SecureStorage.GetAsync("oauth_token" );
}
catch (Exception ex)
{
}
注意
要求されたキーに関連付けられている値が存在しない場合、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 を呼び出さない限り、この種類の暗号化が使用され続けます。
iOS デバイスに値を安全に格納するために、キーチェーン が使用されます。 値を格納するために使用される SecRecord
は、 [アプリのバンドル ID].xamarinessentials に設定された Service
値を持ちます。
場合によっては、キーチェーン データが iCloud と同期され、アプリケーションをアンインストールしても iCloud やユーザーのその他のデバイスからセキュリティで保護された値が削除されない場合があります。
暗号化する値に対して、UWP デバイス上で DataProtectionProvider が安全に使用されます。
暗号化された値は、ApplicationData.Current.LocalSettings
の、 [アプリの ID].xamarinessentials という名前のコンテナーの内部に格納されます。
SecureStorage は Preferences API を使用し、Preferences ドキュメントで説明されているのと同じデータ永続化に従います。 さらに、LocalSettings
も使用します。これには、各設定の名前は最大で 255 文字という制限があります。 各設定のサイズは最大 8K バイトで、各コンポジット設定のサイズは最大 64K バイトです。
この API は、少量のテキストを格納することを想定しています。 大量のテキストを格納するためにこれを使用しようとすると、パフォーマンスが低下する可能性があります。
他の Xamarin ビデオは、Channel 9 および YouTube でご覧いただけます。