2016-08-18 122 views
28

我正在構建一個React Native應用程序,我需要保存一些敏感數據,如令牌和刷新令牌。明顯的解決方案是使用AsyncStorage保存該信息。問題是AsyncStorage的安全級別。將敏感數據保存在React Native中

AsyncStorage提供了一種本地存儲令牌和數據的方法。它可以在某些方面與LocalStorage選項相比較,可以是 。在完整的 生產應用程序中,建議不要直接訪問AsyncStorage ,而是使用抽象層,因爲AsyncStorage的 與使用相同瀏覽器的其他應用程序共享,因此不會從所有項目中刪除所有項目存儲可能會損害相鄰應用程序的功能。

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

在本機應用程序,我會在AndroidKeychainiOSShared Preferences私人模式

對於我提供的文件中讀取陣營原住民:

在iOS上,AsyncStorage被存儲小值序列化字典 和更大的價值在不同的文件本機代碼的支持。在Android的 上,AsyncStorage將使用基於 可用的RocksDB或SQLite。

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

他們從來不談這些數據的安全性。

這是最好的解決方案創造Android(在私人模式使用Shared Preferences),另一個是iOS(使用鑰匙扣)保存敏感數據的模塊?或者使用提供的AsyncStorage方法是安全的?

+0

你在找什麼,在這篇文章中回答:http://stackoverflow.com/questions/37563224/why-the-react-native-docs-recommends-that-you-use-an-abstraction-on -top-of-async –

+0

該答案沒有對「AsyncStorage」的安全性做任何假設。 –

+0

你可以看看這篇文章:https://stackoverflow.com/questions/45547657/what-is-the-best-way-to-store-private-data-in-react-native –

回答

43

只要深入瞭解React Native代碼,我就找到了答案。

的Android

React NativeAsyncStorage模塊的實現是基於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的存儲您在是關聯 應用專用的磁盤空間數據庫。您的數據是安全的,因爲默認情況下,該區域不是 可供其他應用程序訪問。

Source

的iOS

在iOS系統中的AsyncStorage值保存在系列化字典文件。這些文件保存在應用程序NSDocumentDirectory中。在iOS中,所有應用程序都位於自己的沙盒中,因此一個應用程序的所有文件都是安全的,其他應用程序無法訪問它們。

處理該AsyncStorage模塊中的iOS的代碼可以在這裏找到:https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

而且我們可以看到here用於存儲由AsyncStorage保存的保存價值的文件下NSDocumentDirectory(應用程序沙箱中環境)。

每個應用程序都是一個島iOS應用程序與文件系統 的交互主要限於應用程序沙箱內的目錄。在安裝新應用程序的 期間,安裝程序會爲該應用程序創建多個 容器。每個容器都有特定的角色。包 容器包含應用程序的包,而數據容器包含應用程序和用戶的 數據。數據容器是 進一步分爲許多目錄,應用程序可以使用 排序和組織其數據。該應用程序還可能在運行時請求訪問 附加容器(例如,iCloud容器)。

Source

結論

它是安全的使用AsyncStorage保存用戶令牌,因爲他們是一個安全的環境下保存。

請注意,這僅適用於Android設備沒有真正的根爲iOS設備沒有越獄。還請注意,如果攻擊者有物理訪問到設備並且設備未受保護。他可以將設備連接到mac筆記本電腦和extract the documents目錄,並查看保存在文檔目錄下的所有內容。

+1

很好的答案支持參考和事實。謝謝! –

+1

回覆:Android:「安全」:沒有什麼是安全的,可以實現接近'安全'的理想。在這種情況下,如果設備是根植的(無論是否有意),則可以訪問數據。 – straya

+4

就像我在結論中說的那樣。 –

1

我真的建議您使用庫像react-native-keychain存儲私人數據react-native

對於Android的API級別:

  • 16-22人使用Facebook隱瞞
  • 23+採用Android密鑰庫

你可以這樣使用它:

// Generic Password, service argument optional 
Keychain 
    .setGenericPassword(username, password) 
    .then(function() { 
    console.log('Credentials saved successfully!'); 
    }); 

// service argument optional 
Keychain 
    .getGenericPassword() 
    .then(function(credentials) { 
    console.log('Credentials successfully loaded for user ' + credentials.username); 
    }).catch(function(error) { 
    console.log('Keychain couldn\'t be accessed! Maybe no value set?', error); 
    });