0.2.4 • Published 7 months ago

react-native-crypto-storage v0.2.4

Weekly downloads
-
License
MIT
Repository
github
Last release
7 months ago

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

0.2.4

7 months ago

0.2.3

7 months ago

0.2.2

7 months ago

0.2.1

7 months ago

0.2.0

7 months ago