锁定屏幕,因此用户必须在科尔多瓦中输入图案或 PIN



我的愿望是,当用户打开应用程序时,他必须提供他的指纹,图案或PIN码,以便应用程序可以知道它真的是他(额外的安全性(。

我目前正在使用"cordova-plugin-fingerprint-aio"插件,它在启用了指纹或 FaceID 的 iOS 和 Android 设备上完美运行。不幸的是,此插件不适用于未启用指纹(或没有硬件(的设备,但它们仅使用图案或PIN或根本不使用。

我也尝试过"cordova-plugin-screen-locker"插件,但它似乎根本不起作用("锁定"或"解锁"没有任何反应(。

我的期望是,如果用户启用了指纹或FaceID,则应用程序需要这样做,但如果他启用了图案或PIN,则需要这样做。我正在寻找一个只显示图案或 PIN 的插件,但我没有设法找到它。

有谁知道这样的插件是否已经存在,或者我需要自己编写?

没有这样的插件公开可用。但是,我建议根据您的需要调整"cordova-plugin-fingerprint-aio"。

出于我的目的,我想在用户使用指纹或设备凭据进行身份验证后加密/解密一些文本。我调整了FingerprintAIO插件,使其提供两种方法:

encrypt(alias, plainText)encryptedText + initializationVector

decrpyt(alias, encryptedText, initializationVector)plainText

对于Android,您无法将CryptoObject传递给BiometricPrompt,因为pin/pattern/password身份验证被认为不够安全。 相反,您可以向用户显示身份验证对话框,并在根据此 Android 开发人员指南成功进行身份验证后立即在给定的"有效期"(例如 3 秒(内进行身份验证/加密:

https://developer.android.com/training/sign-in/biometric-auth#biometric-or-lock-screen

以下是一些相关的代码片段:

生物识别计划创建如下

BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
.setTitle("My Title")
.setDescription("Some description")
.setDeviceCredentialAllowed(true)
.build();
biometricPrompt.authenticate(promptInfo);

biometricPrompt调用加密的onAuthenticationSucceeded方法中:

KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(VALIDITY_DURATION_IN_SECONDS)
.build();
generateSecretKey(spec);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] initVector = cipher.getIV(); // part of the return value
byte[] encrypted = cipher.doFinal(plainInputText.getBytes(StandardCharsets.UTF_8));  

对于解密:

SecretKey secretKey = getSecretKey(alias);
Cipher output = Cipher.getInstance("AES/GCM/NoPadding");
final GCMParameterSpec spec = new GCMParameterSpec(128, initVector); // initVector is a parameter of 'decrypt'
output.init(Cipher.DECRYPT_MODE, secretKey, spec);
String decodedText = new String(output.doFinal(encrypted), StandardCharsets.UTF_8);

对于iOS,我还没有实现该插件

我不确定Cordova实现是做什么的,但Android API是BiometricPrompt和setDeviceCredentialAllowed。这已添加到 Q 中的框架中。

该行为也可通过 androidx.biometric 库版本 beta01 及更高版本获得。

https://developer.android.com/jetpack/androidx/releases/biometric

在使用setDeviceCredentialAllowed调用身份验证之前,您至少需要检查KeyguardManager#isDeviceSecure以检查是否已设置引脚/图案/密码。

最新更新