1. ホーム
  2. android

React Nativeで機密データを保存する

2023-08-09 05:36:25

質問

私はReact Nativeアプリケーションを構築しており、トークンやリフレッシュトークンのようないくつかの機密データを保存する必要があります。明白な解決策は、その情報を使用して保存することです AsyncStorage . 問題は、AsyncStorageのセキュリティレベルです。

AsyncStorageはトークンやデータをローカルに保存する方法を提供します。これは これは、ある意味では LocalStorage オプションと比較されます。完全な アプリケーションでは、AsyncStorage に直接アクセスせず、抽象化レイヤーを使用することをお勧めします。 に直接アクセスせず、抽象化レイヤーを使用することをお勧めします。 同じブラウザを使用する他のアプリケーションと共有されるためです。 ストレージからすべてのアイテムを誤って削除すると、近隣のアプリの機能が損なわれる可能性があるためです。 そのため、ストレージからすべてのアイテムを誤って削除すると、近隣のアプリの機能が損なわれる可能性があります。

https://auth0.com/blog/adding-authentication-to-react-native-using-jwt/

ネイティブアプリの場合、私なら KeychainiOSShared Preferences プライベートモード Android .

React Nativeが提供するドキュメントで読んだ分。

iOS では、AsyncStorage はネイティブ コードによってバックアップされ、小さな値はシリアライズされた辞書に、大きな値は個別のファイルに保存されます。 をシリアライズされた辞書に、より大きな値を個別のファイルに保存するネイティブ コードによって支えられています。Android では Android では、AsyncStorage は RocksDB または SQLite のいずれかを使用し、使用可能なものに基づいています。 を使用します。

https://facebook.github.io/react-native/docs/asyncstorage.html

そのデータの安全性については一切語られない。

のモジュールを作成するのが最良の解決策です。 Android (これは Shared Preferences プライベートモード ) と、もうひとつは iOS (これは キーチェーン を使用したもの)を使用して、センシブルデータを保存することができますか?それとも、安全なのは AsyncStorage メソッドを使用するのが安全ですか?

どのように解決するのですか?

React Nativeのコードを掘り下げるだけで、答えが見つかりました。

アンドロイド

React Native AsyncStorage モジュールの実装は SQLiteOpenHelper . すべてのデータクラスが扱われるパッケージです。 https://github.com/facebook/react-native/tree/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage

データベースを作成するための手順が書かれたクラスです。 https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage/ReactDatabaseSupplier.java

Androidのドキュメントによると、アプリケーションで作成されたデータベースは、アプリケーションに関連するプライベートなディスクスペースに保存されるので、安全です。

デバイスの内部ストレージに保存するファイルと同じです。 Android は、アプリケーションに関連付けられたプライベート ディスク領域にデータベースを保存します。 アプリケーションに関連付けられたプライベートなディスク領域にデータベースを保存します。デフォルトでは、この領域は他のアプリケーションからアクセスできないため、データは安全です。 他のアプリケーションからはアクセスできません。

ソース

iOS

iOS では AsyncStorage の値は、シリアライズされた辞書ファイルに保存されます。これらのファイルは、アプリケーションの NSDocumentDirectory . iOS では、すべてのアプリケーションは 独自のサンドボックス そのため、あるアプリケーションのファイルはすべて保護され、他のアプリケーションからアクセスすることはできません。

を処理する iOS のコードは AsyncStorage モジュールを処理するコードは、ここにあります。 https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

そして、見ての通り によって保存された値を保存するために使用されるファイルです。 AsyncStorage の下に保存されます。 NSDocumentDirectory (の下に保存されます(アプリケーションのサンドボックス環境内)。

すべてのアプリは島である iOS アプリのファイル システムとのやり取りは、アプリのサンドボックス内のディレクトリにほぼ限定されます。 は、ほとんどアプリのサンドボックス内のディレクトリに制限されます。新しいアプリのインストール時に 新しいアプリのインストール時に、インストーラはアプリのためにいくつかの コンテナを作成します。それぞれのコンテナには、特定の役割があります。バンドル コンテナにはアプリのバンドルが格納され、データコンテナにはアプリとユーザーの両方のデータが格納されます。 データコンテナは、アプリケーションとユーザーの両方のデータを保持します。データコンテナは、さらに データコンテナは、さらにいくつかのディレクトリに分割され、アプリがデータの並べ替えや整理に使用することができます。 データコンテナはさらにいくつかのディレクトリに分割され、アプリがデータの並べ替えや整理に使用できます。また、アプリは追加のコンテナへのアクセスも要求できます。 また、アプリは実行時に追加のコンテナ(たとえば iCloud コンテナ)へのアクセスを要求することもできます。

ソース

結論

安全に使用できる AsyncStorage を使ってユーザトークンを保存することは安全です。なぜなら、ユーザトークンは安全なコンテキストで保存されるからです。

がない Android デバイスにのみ当てはまることに注意してください。 ルート を持たないiOSデバイスの場合のみです。 脱獄 . また、攻撃者が 物理的アクセス があり、デバイスが保護されていない場合。攻撃者はデバイスをMacのラップトップに接続し ドキュメントを抽出することができます。 ディレクトリを展開し、ドキュメント ディレクトリの下に保存されたすべてのコンテンツを見ることができます。