{"id":4617,"url":"https://github.com/talut/rn-secure-storage","last_synced_at":"2026-01-16T23:29:31.963Z","repository":{"id":49422091,"uuid":"148802579","full_name":"talut/rn-secure-storage","owner":"talut","description":"Secure Storage for React Native (Android \u0026 iOS)","archived":false,"fork":false,"pushed_at":"2024-03-14T18:53:48.000Z","size":701,"stargazers_count":210,"open_issues_count":13,"forks_count":67,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-08-24T08:28:35.662Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/talut.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null},"funding":{"github":null,"patreon":"talut","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://www.buymeacoffee.com/talut"]}},"created_at":"2018-09-14T14:48:56.000Z","updated_at":"2025-08-03T17:21:52.000Z","dependencies_parsed_at":"2023-12-22T15:28:33.073Z","dependency_job_id":"c048a925-121a-43d4-a6df-f5e79c02e215","html_url":"https://github.com/talut/rn-secure-storage","commit_stats":{"total_commits":104,"total_committers":23,"mean_commits":4.521739130434782,"dds":0.6538461538461539,"last_synced_commit":"dcee9d8f92a83d9176e1e02a88362583b07d29e1"},"previous_names":["talut/react-native-secure-storage"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/talut/rn-secure-storage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talut%2Frn-secure-storage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talut%2Frn-secure-storage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talut%2Frn-secure-storage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talut%2Frn-secure-storage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/talut","download_url":"https://codeload.github.com/talut/rn-secure-storage/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talut%2Frn-secure-storage/sbom","scorecard":{"id":867063,"data":{"date":"2025-08-11","repo":{"name":"github.com/talut/rn-secure-storage","commit":"ff406a9e29550bf5a0d89ab61a660ae1798bf1db"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":3,"reason":"Found 4/13 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: sample/android/gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-2rxp-v6pw-ch6m","Warn: Project is vulnerable to: GHSA-4xqq-m2hx-25v8","Warn: Project is vulnerable to: GHSA-5866-49gr-22v4","Warn: Project is vulnerable to: GHSA-r55c-59qm-vjw6","Warn: Project is vulnerable to: GHSA-vg3r-rm7w-2xgh","Warn: Project is vulnerable to: GHSA-vmwr-mc7x-5vc3","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T02:56:07.555Z","repository_id":49422091,"created_at":"2025-08-24T02:56:07.555Z","updated_at":"2025-08-24T02:56:07.555Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28487586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T22:54:02.790Z","status":"ssl_error","status_checked_at":"2026-01-16T22:50:10.344Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-01-05T20:17:18.058Z","updated_at":"2026-01-16T23:29:31.935Z","avatar_url":"https://github.com/talut.png","language":"Java","funding_links":["https://patreon.com/talut","https://www.buymeacoffee.com/talut"],"categories":["Components"],"sub_categories":["System"],"readme":"# RNSecureStorage\n\n[![npm version](https://badge.fury.io/js/rn-secure-storage.svg)](https://badge.fury.io/js/rn-secure-storage)\n[![npm downloads](https://img.shields.io/npm/dm/rn-secure-storage.svg?maxAge=2592000)](https://img.shields.io/npm/dm/rn-secure-storage.svg?maxAge=2592000)\n![GitHub license](https://img.shields.io/github/license/mashape/apistatus.svg)\n\nSecure Storage for React Native (Android \u0026 iOS) - Keychain \u0026 Keystore\n\n#### If you like this library, please consider supporting my work by buying me a coffee\n\n[![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoff.ee/talut)\n\n### Thanks for using this library\n\nPlease read my disclaimer about maintaining this library [here](#disclaimer)\n\nFor Android [I need your reviews](#i-need-your-reviews)\n\n## Getting Started\n\n**With NPM**\n\n```\nnpm install --save rn-secure-storage\n```\n\n**With YARN**\n\n```\nyarn add rn-secure-storage\n```\n\n### What's changed in v3.0.1\n- Return type for multiGet changed. https://github.com/talut/rn-secure-storage/pull/79\n\n### What's changed in v3.0.0\n\n- Rewritten Android module with enhanced security features.\n- Android minSdkVersion is now 23 (Android 6.0 Marshmallow)\n- iOS module redeveloped using Swift and updated APIs.\n- Comprehensive renaming and expansion of APIs.\n- Modifications to the return types of some APIs.\n- Added `clear` for comprehensive data clearance.\n- Introduced `getAllKeys` for retrieving all stored keys.\n- Implemented `multiSet` for setting multiple values simultaneously.\n- New `multiGet` feature for fetching multiple values at once.\n- `multiRemove` added for bulk deletion of items.\n- `getSupportedBiometryType` introduced for iOS (supports biometric authentication types).\n\n### API\n\n- [setItem](#setitem)\n- [getItem](#getitem)\n- [removeItem](#removeitem)\n- [exists](#exists)\n- [getAllKeys](#getallkeys)\n- [clear](#clear)\n- [multiSet](#multiset)\n- [multiGet](#multiget)\n- [multiRemove](#multiremove)\n\n### setItem\n\nTo set the item, you need to pass the key and value as parameters. You can also pass the options as a third parameter. If the key exists,\nthe value will be updated, otherwise, it will be created. You can use the `exists` method to check if the key exists. You can also pass\nthe `accessible` option to set the accessibility of the keychain item (only for IOS).\n\n```js\nimport RNSecureStorage, {ACCESSIBLE} from 'rn-secure-storage';\n\nRNSecureStorage.setItem(\"key\", \"value\", {accessible: ACCESSIBLE.WHEN_UNLOCKED}).then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### getItem\n\nTo get the item, you need to pass the key as a parameter. If the key exists, the value will be returned, otherwise, it will return an error.\n\n```js\nRNSecureStorage.getItem(\"key\").then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### removeItem\n\nTo remove the item, you need to pass the key as a parameter. If the key exists, the value will be removed, otherwise, it will return an\nerror.\n\n```js\nRNSecureStorage.removeItem(\"key\").then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### exists\n\nTo check if the item exists, you need to pass the key as a parameter. If the key exists it will return `true`, otherwise, it will\nreturn `false`. Mostly you don't need to use this method because `getItem` will return an error if the key doesn't exist. But for\nperformance you can just check if the key exists before calling `getItem`.\n\n```js\nRNSecureStorage.exist(\"key\").then((res) =\u003e {\n\tconsole.log(res ? \"exists\" : \"does not exist\");\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### getAllKeys\n\nTo get all keys, you need to call `getAllKeys` method. It will return an array of keys.\n\n```js\nRNSecureStorage.getAllKeys().then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### clear\n\nTo clear all data, you need to call `clear` method. It will return `true` if the operation is successful. Otherwise, it will return\nremaining keys.\n\n```js\nRNSecureStorage.clear().then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### multiSet\n\nMulti set is a new feature that allows you to set multiple values simultaneously. You need to pass an object as the first parameter\n\n```js\nimport RNSecureStorage, {ACCESSIBLE} from 'rn-secure-storage';\n\nconst items = {\"key_1\": \"multi key 1\", \"key_2\": \"multi key 2\"};\nRNSecureStorage.multiSet(items, {accessible: ACCESSIBLE.WHEN_UNLOCKED}).then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### multiGet\n\nWith multi get you can fetch multiple values at once. You need to pass an array of keys as the first parameter.\n\n```js\nRNSecureStorage.multiGet([\"key_1\", \"key_2\"]).then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n### multiRemove\n\nWith multi remove you can delete multiple values at once. You need to pass an array of keys as the first parameter. If your keys are\nremoved/not found, it will return an array of keys that are not removed/found.\n\n```js\nRNSecureStorage.multiRemove([\"key_1\", \"key_2\"]).then((res) =\u003e {\n\tconsole.log(res);\n}).catch((err) =\u003e {\n\tconsole.log(err);\n});\n```\n\n## Options\n\n| Key              | Platform | Description                                                                                      | Default                               |\n|------------------|----------|--------------------------------------------------------------------------------------------------|---------------------------------------|\n| **`accessible`** | iOS only | This indicates when a keychain item is accessible, see possible values in `Keychain.ACCESSIBLE`. | *`Keychain.ACCESSIBLE.WHEN_UNLOCKED`* |\n\n### `Keychain.ACCESSIBLE` enum\n\n| Key                                       | Description                                                                                                                                                                            |\n|-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **`WHEN_UNLOCKED`**                       | The data in the keychain item can be accessed only while the device is unlocked by the user.                                                                                           |\n| **`AFTER_FIRST_UNLOCK`**                  | The data in the keychain item cannot be accessed after a restart until the device has been unlocked once by the user.                                                                  |\n| **`ALWAYS`**                              | The data in the keychain item can always be accessed regardless of whether the device is locked.                                                                                       |\n| **`WHEN_PASSCODE_SET_THIS_DEVICE_ONLY`**  | The data in the keychain can only be accessed when the device is unlocked. Only available if a passcode is set on the device. Items with this attribute never migrate to a new device. |\n| **`WHEN_UNLOCKED_THIS_DEVICE_ONLY`**      | The data in the keychain item can be accessed only while the device is unlocked by the user. Items with this attribute do not migrate to a new device.                                 |\n| **`AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY`** | The data in the keychain item cannot be accessed after a restart until the device has been unlocked once by the user. Items with this attribute never migrate to a new device.         |\n| **`ALWAYS_THIS_DEVICE_ONLY`**             | The data in the keychain item can always be accessed regardless of whether the device is locked. Items with this attribute never migrate to a new device.                              |\n\n#### You can also check out sample project for more details\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details\n\n### I need your reviews\n\nI have rewritten the Android module with enhanced security features. I need your reviews. Please test the new version and let me know your\nthoughts. I will be happy to hear your suggestions and comments. I'm planning to release the new version to handle biometric authentication\non Android.\n\n### Connect with me\n\n\u003cp align=\"left\"\u003e\n\u003ca href=\"https://linkedin.com/in/taluttasgiran\" target=\"blank\"\u003e\u003cimg align=\"center\" src=\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/linked-in-alt.svg\" alt=\"taluttasgiran\" height=\"30\" width=\"40\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://twitter.com/taluttasgiran\" target=\"blank\"\u003e\u003cimg align=\"center\" src=\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/twitter.svg\" alt=\"taluttasgiran\" height=\"30\" width=\"40\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://dev.to/talut\" target=\"blank\"\u003e\u003cimg align=\"center\" src=\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/devto.svg\" alt=\"talut\" height=\"30\" width=\"40\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://stackoverflow.com/users/3366361\" target=\"blank\"\u003e\u003cimg align=\"center\" src=\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/stack-overflow.svg\" alt=\"3366361\" height=\"30\" width=\"40\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://www.youtube.com/c/@taluttasgiran\" target=\"blank\"\u003e\u003cimg align=\"center\" src=\"https://raw.githubusercontent.com/rahuldkjain/github-profile-readme-generator/master/src/images/icons/Social/youtube.svg\" alt=\"@taluttasgiran\" height=\"30\" width=\"40\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n### Disclaimer\n\nAs an open-source enthusiast and developer, I originally created this library for professional use. However, with recent changes in my\ncareer, my focus has shifted away from React Native, limiting my involvement to personal projects. Consequently, my time to address issues\nand review pull requests for this library has become restricted. I remain committed to maintaining and improving this library, but my\nresponse times might be longer. I greatly appreciate your patience and understanding.\n\nThe beauty of open-source is in collaboration. If you find this library useful and would like to contribute, whether through code,\naddressing issues, or even buying a coffee to show support, it would be immensely appreciated. Together, we can ensure the continued\ndevelopment and enhancement of this library.\n\n[![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/talut)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftalut%2Frn-secure-storage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftalut%2Frn-secure-storage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftalut%2Frn-secure-storage/lists"}