react-native-keychain, 用于响应本机的钥匙串访问

分享于 

14分钟阅读

GitHub

  繁體 雙語
Keychain Access for React Native
  • 源代码名称:react-native-keychain
  • 源代码网址:http://www.github.com/oblador/react-native-keychain
  • react-native-keychain源代码文档
  • react-native-keychain源代码下载
  • Git URL:
    git://www.github.com/oblador/react-native-keychain.git
    Git Clone代码到本地:
    git clone http://www.github.com/oblador/react-native-keychain
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/oblador/react-native-keychain
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    react-native-keychain

    Travisnpmnpm

    React/keystore访问本机响应。

    安装

    • $ yarn add react-native-keychain
    • $ react-native link react-native-keychain 并检查 MainApplication.java 以验证是否已经添加包。
    • 使用 react-native run-ios/android 重新生成项目

    如果你有 react-native link 问题,请参阅手动安装 below。

    用法

    import*asKeychainfrom'react-native-keychain';async () => {
     constusername='zuck';
     constpassword='poniesRgr8';
     // Store the credentialsawaitKeychain.setGenericPassword(username, password);
     try {
     // Retreive the credentialsconstcredentials=Keychain.getGenericPassword();
     if (credentials) {
     console.log('Credentials successfully loaded for user '+credentials.username);
     } else {
     console.log('No credentials stored')
     }
     } catch (error) {
     console.log('Keychain couldn't be accessed!', error);
     }
     awaitKeychain.resetGenericPassword()
    }

    有关完全工作的项目示例,请参见 KeychainExample

    无论 setGenericPasswordsetInternetCredentials 只限于字符串,所以如果你需要存储对象,请在存储/访问它时使用 JSON.stringify/JSON.parse

    setGenericPassword(username, password, [{ accessControl, accessible, accessGroup, service }])

    将用户名/密码组合存储在安全存储中。 解析为 { username, password } 如果项存在或者 false 不存在,则。

    getGenericPassword([{ authenticationPrompt, service }])

    将从安全存储检索用户名/密码组合。 仅当遇到意外错误或者权限不足时,才会拒绝。

    resetGenericPassword([{ service }])

    将从安全存储中删除用户名/密码组合。

    setInternetCredentials(server, username, password, [{ accessControl, accessible, accessGroup }])

    将 server/username/password 组合存储在安全存储中。

    getInternetCredentials(server, [{ authenticationPrompt }])

    将从安全存储中检索 server/username/password 组合。 解析为 { username, password } 如果项存在或者 false 不存在,则。 仅当遇到意外错误或者权限不足时,才会拒绝。

    resetInternetCredentials(server)

    将从安全存储中删除 server/username/password 组合。

    requestSharedWebCredentials() ( 仅限 iOS )

    请求用户提供共享的网站凭据。 在应用程序和服务器端需要额外的设置,见 Apple文档。 解析为 { server, username, password } 如果已经批准且 false 如果拒绝,并且在平台上不支持或者没有共享凭据时引发错误。

    setSharedWebCredentials(server, username, password) ( 仅限 iOS )

    设置共享网站凭据。 成功时解析为 true

    canImplyAuthentication([{ authenticationType }])

    询问这里设备上是否支持本设备的本地身份验证策略类型以及用户所选择的设备设置。 应与setter函数中的accessControl 选项结合使用。 如果支持,解析为 true

    getSupportedBiometryType()

    获取biometry支持设备的硬件类型。 在支持时解析为 Keychain.BIOMETRY_TYPE 值,否则为 null

    命令行选项

    关键平台描述默认值
    accessControl仅 iOS这决定了如何使用钥匙串项,查看 Keychain.ACCESS_CONTROL 中可能的值。无。
    accessible仅 iOS当可以访问钥匙串项时,请参见 Keychain.ACCESSIBLE 中的可能值。Keychain.ACCESSIBLE.WHEN_UNLOCKED
    accessGroup仅 iOS在哪个应用程序组中共享钥匙串。 需要额外的授权设置。无。
    authenticationPrompt仅 iOS使用biometry或者设备密码解锁钥匙串时提示用户的内容。Authenticate to retrieve secret
    authenticationType仅 iOS指定可以接受的身份验证形式的策略。Keychain.AUTHENTICATION_TYPE.DEVICE_PASSCODE_OR_BIOMETRICS
    service全部与密码关联的服务的反向域 NAME 限定符。应用包 ID
    Keychain.ACCESS_CONTROL enum 密钥描述
    USER_PRESENCE使用触摸标识或者密码访问项目的限制。
    BIOMETRY_ANY对任何已经注册的手指访问带有触摸标识的项目的限制。
    BIOMETRY_CURRENT_SET访问当前注册的手指的带有触摸标识的项目的限制。
    DEVICE_PASSCODE使用密码访问项目的限制。
    APPLICATION_PASSWORD使用应用程序为数据加密密钥生成提供密码的限制。
    BIOMETRY_ANY_OR_DEVICE_PASSCODE对任何已经注册的手指或者密码使用触摸ID访问项目的限制。
    BIOMETRY_CURRENT_SET_OR_DEVICE_PASSCODE对当前注册的手指或者密码使用触摸ID访问项目的限制。
    Keychain.ACCESSIBLE enum 密钥描述
    WHEN_UNLOCKED只有用户解锁设备时,才能访问钥匙串项目中的数据。
    AFTER_FIRST_UNLOCK在重新启动后,在用户一次解锁之前,钥匙串项中的数据无法访问。
    ALWAYS无论设备是否锁定,钥匙串项目中的数据都可以访问。
    WHEN_PASSCODE_SET_THIS_DEVICE_ONLY钥匙串中的数据只能在设备解锁时被访问。 只有在设备上设置了密码后才可用。 具有这里属性的项从不迁移到新设备。
    WHEN_UNLOCKED_THIS_DEVICE_ONLY只有用户解锁设备时,才能访问钥匙串项目中的数据。 具有这里属性的项不会迁移到新设备。
    AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY在重新启动后,在用户一次解锁之前,钥匙串项中的数据无法访问。 具有这里属性的项从不迁移到新设备。
    ALWAYS_THIS_DEVICE_ONLY无论设备是否锁定,钥匙串项目中的数据都可以访问。 具有这里属性的项从不迁移到新设备。
    Keychain.AUTHENTICATION_TYPE enum 密钥描述
    DEVICE_PASSCODE_OR_BIOMETRICS设备所有者将通过biometry或者设备密码进行身份验证。
    BIOMETRICS设备所有者将使用生物识别方法( 触摸ID或者人脸识别) 进行认证。
    Keychain.BIOMETRY_TYPE enum 密钥描述
    TOUCH_ID设备支持通过触摸标识进行身份验证。
    FACE_ID设备支持使用人脸识别进行身份验证。
    FINGERPRINT设备支持使用Android指纹进行认证。

    手动安装

    iOS

    命令行选项:手动
    • 右键单击库,选择向"。"添加文件并选择 node_modules/react-native-keychain/RNKeychain.xcodeproj
    • 在项目中选择项目 and 链接二进制链接二进制with按+,按+ 并选择 libRNKeychain.a
    选项:使用 CocoaPods

    将以下内容添加到你的Podfile 并运行 pod update:

    
    pod 'RNKeychain', :path => '../node_modules/react-native-keychain'
    
    
    
    
    为 iOS 10 + 启用 Keychain Sharing 授权

    对于 iOS 10,你需要在构建目标的Capabilities 部分中启用 Keychain Sharing 授权。 ( 请参见屏幕截图) 否则,你将遇到以下错误。

    screen shot 2016-09-16 at 20 56 33

    
    Error: {
    
    
     code ="-34018";
    
    
     domain = NSOSStatusErrorDomain;
    
    
     message ="The operation couldnU2019t be completed. (OSStatus error -34018.)";
    
    
    }
    
    
    
    

    Android

    命令行选项:手动
    • 编辑 android/settings.gradle 以类似这里( 没有+ ):
    rootProject.name = 'MyApp'
    include ':app'+ include ':react-native-keychain'+ project(':react-native-keychain').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keychain/android')
    • 编辑 android/app/build.gradle (。注:应用程序文件夹) 以如下所示:
    apply plugin: 'com.android.application'
    android {
    . . .
    }
    dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     compile 'com.android.support:appcompat-v7:23.0.1'
     compile 'com.facebook.react:react-native:0.19.+'+ compile project(':react-native-keychain')}
    • 编辑你的MainApplication.java ( 在 android/app/src/main/java/... 中深度),使它的类似于这里( 注释要编辑的):
    package com.myapp;+ import com.oblador.keychain.KeychainPackage;....
    public class MainActivity extends extends ReactActivity {
     @Override
     protected List<ReactPackage> getPackages() {
     return Arrays.<ReactPackage>asList(
     new MainReactPackage(),+ new KeychainPackage() );
     }
    . . .
    }
    混淆器规则

    在使用 proguard ( 像释放)的Android构建上,你可能会看到以下错误:

    
    RNKeychainManager: no keychain entry found for service:
    
    
    JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.NoSuchFieldError: no"J" field"mCtxPtr" in class"Lcom/facebook/crypto/cipher/NativeGCMCipher;" or its superclasses
    
    
    
    

    如果是这样,在 proguard-rules.pro 中添加一个混淆规则:

    
    -keep class com.facebook.crypto.** {
    
    
     *;
    
    
    }
    
    
    
    

    注释

    Android

    MODULE 将根据API级别自动使用适当的CipherStorage实现:

    • API级别 16 -22将使用Facebook隐藏加密/加密
    • API级别 23 + 将使用Android密钥库实现/de加密

    加密数据存储在SharedPreferences中。

    iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 setInternetCredentials(server, username, password) 调用将被解析为调用 setGenericPassword(username, password, server) 使用 server 参数区分多个条目。

    安全性

    在不支持Android密钥库的API级别上,Facebook隐藏用于对存储的数据进行加密。 然后将加密数据存储在SharedPreferences中。 由于隐藏密钥在SharedPreferences中存储它的加密密钥,如果设备是根( 或者如果攻击者可以某种方式访问 文件系统 ),则可以获取密钥并解密。 因此,在这样的设备上,隐藏加密只是一个隐藏的问题。 API级别 23 + 密钥存储在Android密钥库中,这使得密钥不可以导出,从而使得整个进程更加安全。 遵循最佳做法,不要将用户凭据存储在设备上。 使用令牌或者其他形式的身份验证,在执行敏感操作之前询问用户凭据。

    维护者


    Joel Arvidsson
    作者

    Vojtech。
    维护者

    Pelle Stenild Coltau
    维护者

    许可证

    麻省理工学院 © Arvidsson 2016 -2018


    acc  react  KEY  NAT  Native  React Native  
    相关文章