0.2.4 • Published 7 months ago
react-native-crypto-storage v0.2.4
react-native-crypto-storage
React Native Turbo Module built for encrypted storage using Android's EncryptedSharedPreferences and iOS' Keychain
Feature
- Android: EncryptedSharedPreferences
- iOS: KeyChain
- Turbo Native Module
- Encrypted secure storage
Installation
npm install react-native-crypto-storage
Linking
For iOS, run:
$ npx pod-install
Usage
import CryptoStorage from 'react-native-crypto-storage';
Storing a value
async function storeData() {
try {
await CryptoStorage.setItem(
"user_data",
JSON.stringify({
name : "Mohit",
age : 26,
username : "mohitkumar7925",
})
);
} catch (error) {
// if there is an error
}
}
Retrieving a value
async function retrieveData() {
try {
const user = await CryptoStorage.getItem("user_data");
if (user) {
}
} catch (error) {
// if there is an error
}
}
Removing a value
async function removeData() {
try {
await CryptoStorage.removeItem("user_data");
} catch (error) {
// if there is an error
}
}
Clearing all previously saved values
async function clearStorage() {
try {
await CryptoStorage.clear();
} catch (error) {
// if there is an error
}
}
Important Note: Keychain
persistence
iOS Keychain
is not cleared when your app is uninstalled, this is the expected behaviour of Keychain
. However, if you do want to achieve a different behaviour, you can use the below snippet to clear the Keychain
on the first launch of your app.
// AppDelegate.m
/**
Deletes all Keychain items accessible by this app if this is the first time the user launches the app
*/
static void ClearKeychainIfNecessary() {
// Checks wether or not this is the first time the app is run
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HAS_RUN_BEFORE"] == NO) {
// Set the appropriate value so we don't clear next time the app is launched
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HAS_RUN_BEFORE"];
NSArray *secItemClasses = @[
(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecClassInternetPassword,
(__bridge id)kSecClassCertificate,
(__bridge id)kSecClassKey,
(__bridge id)kSecClassIdentity
];
// Maps through all Keychain classes and deletes all items that match
for (id secItemClass in secItemClasses) {
NSDictionary *spec = @{(__bridge id)kSecClass: secItemClass};
SecItemDelete((__bridge CFDictionaryRef)spec);
}
}
}
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Add this line to call the above function
ClearKeychainIfNecessary();
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"APP_NAME" initialProperties:nil];
rootView.backgroundColor = [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
}
// ...
@end
Contributing
See the contributing guide to learn how to contribute to the repository and the development workflow.
Connect with me
License
MIT
Made with create-react-native-library