I am building a React Native application and I need to save some sensitive data like a token and a refresh token. The obvious solution is to save that information using AsyncStorage. The problem is the security level of the AsyncStorage.
AsyncStorage provides a way to locally store tokens and data. It can be, in some ways, compared to a LocalStorage option. In full production applications, it is recommended to not access AsyncStorage directly, but instead, to use an abstraction layer, as AsyncStorage is shared with other apps using the same browser, and thus an ill-conceieved removal of all items from storage could impair the functioning of neighboring apps.
https://auth0.com/blog/adding-authentication-to-react-native-using-jwt/
In a native app, I would go for Keychain
in iOS
and Shared Preferences
in private mode in Android
.
For what I read in the documentation provided by React Native:
On iOS, AsyncStorage is backed by native code that stores small values in a serialized dictionary and larger values in separate files. On Android, AsyncStorage will use either RocksDB or SQLite based on what is available.
https://facebook.github.io/react-native/docs/asyncstorage.html
They never talk about the security of that data.
It is the best solution create a module for Android
(that uses Shared Preferences
in private mode) and another for iOS
(that uses Keychain) to save the sensible data? Or it is safe to use the AsyncStorage
methods provided?