标签: android-fingerprint-api

如何在成功的指纹身份验证中从密钥库获取密钥

我正在创建一个应用程序,其中用户有两个选项来解锁他们的应用程序,一个是使用别针,另一个是使用指纹.为了使用指纹,他们必须首先设置一个引脚,因为这个引脚是解密密钥,以获取其加密的详细信息SharedPreferences.

所以我在这里遵循了这个教程:http://www.techotopia.com/index.php/An_Android_Fingerprint_Authentication_Tutorial#Accessing_the_Android_Keystore_and_KeyGenerator

我设法让应用程序读取指纹,并说明它是否有效.但是当指纹被授权时,我不知道如何从Android密钥库中获取该指针.

以下是一些演示代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
    fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

    if (!keyguardManager.isKeyguardSecure()) {

        Toast.makeText(this, "Lock screen security not enabled in Settings", Toast.LENGTH_LONG).show();
        return;
    }

    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.USE_FINGERPRINT) !=
            PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "Fingerprint authentication permission not enabled", Toast.LENGTH_LONG).show();

        return;
    }

    if (!fingerprintManager.hasEnrolledFingerprints()) {

        // This happens when no fingerprints are registered.
        Toast.makeText(this, "Register at least one fingerprint in Settings", Toast.LENGTH_LONG).show();
        return;
    }

    generateKey();

    if (cipherInit()) { …
Run Code Online (Sandbox Code Playgroud)

android android-fingerprint-api

6
推荐指数
1
解决办法
4788
查看次数

自定义视图android中出现"FINGERPRINT_ERROR_CANCELED"错误

我正在尝试通过指纹识别来实现指纹解锁或删除锁定视图,使用传感器现有的登记指纹进一步显示内容,但指纹认证在正常活动中正常工作但在自定义视图中无效,我也试图实现它在我的自定义屏幕锁定应用程序但其冲突或可能是由于资源不可用面临此错误"FINGERPRINT_ERROR_CANCELED"错误代码5

我不确定它是否由于资源不可用,因为同时内置安全密码/模式锁也使用相同的指纹传感器以及我自己的屏幕锁或自定义视图

此代码在活动中运行良好的代码

 fingerprintHandler = new FingerprintHandler();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            keyguardManager =
                    (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
            mFingerprintManager =
                    (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

//
//            generateKey();
//            if (cipherInit()) {
//                cryptoObject =
//                        new FingerprintManager.CryptoObject(cipher);
            fingerprintHandler.setOnAuthenticationListener(new FingerprintManager.AuthenticationCallback() {
                @RequiresApi(api = Build.VERSION_CODES.M)
                @Override
                public void onAuthenticationError(int errorCode, CharSequence errString) {
                    Toast.makeText(FingerprintNormalActivity.this,
                            "Authentication error\n" + "Error code" + errorCode + "\nError String" + errString,
                            Toast.LENGTH_LONG).show();
                    imageViewSmokeImages.setImageResource(R.drawable.fingerprinterror);
                    tvstatus.setText("Authentication error\n" + "Error code" + errorCode + "\nError String" + errString);
                }

                @RequiresApi(api = Build.VERSION_CODES.M)
                @Override
                public …
Run Code Online (Sandbox Code Playgroud)

android android-custom-view screen-lock android-fingerprint-api

6
推荐指数
1
解决办法
2805
查看次数

Android - 如何从指纹认证中获取唯一键?

我想使用AES加密和解密来自SD卡的文件.为了做到这一点,我们总是需要一个种子(通常是一个由用户作为密码插入的字符串):

public static byte[] generateKey(String password) throws Exception{
   byte[] keyStart = password.getBytes("UTF-8");
   KeyGenerator kgen = KeyGenerator.getInstance("AES");
   SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
   sr.setSeed(keyStart);
   kgen.init(128, sr);
   SecretKey skey = kgen.generateKey();
   return skey.getEncoded();
}
Run Code Online (Sandbox Code Playgroud)

我想跳过这一步(用户插入密码),并且要求用户通过指纹传感器进行身份验证,然后启动加密过程!

我想知道是否有一种方法可以为触摸指纹传感器的每个不同手指获取一个唯一键,可以用作SEED来创建SecretKey!

我在github上阅读了关于SO和相关样本的一些问题,但我仍然找不到办法.

清除问题:我已经完成了AES本身的实现并且完全没问题,我只需要在身份验证后找到一种从指纹传感器获取唯一键的方法.

encryption android fingerprint secret-key android-fingerprint-api

6
推荐指数
1
解决办法
2948
查看次数

Android nougat USE_FINGERPRINT权限

我正在尝试实现指纹并且不确定它是否是一个问题但是在Android Nougat上永远不会询问USE_FINGERPRINT的权限.所以我从来没有得到对话框弹出窗口.我有ACCESS_FINE_LOCATION的实现,它可以工作(应用程序要求允许或拒绝).

在我的清单中:

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

<uses-feature
    android:name="android.hardware.fingerprint"
    android:required="false" />
Run Code Online (Sandbox Code Playgroud)

在片段中

if (ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG, "NO permissions USE_FINGERPRINT");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Log.v(TAG, "No requestPermissions");
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.USE_FINGERPRINT}, FingerprintHandler.FINGERPRINT_PERMISSION);
        }
        return;
    }
Run Code Online (Sandbox Code Playgroud)

android android-fingerprint-api

6
推荐指数
2
解决办法
5402
查看次数

Android 指纹 - 加密原语不受 AndroidKeyStore 提供程序支持

我正在尝试将 android 指纹实现到示例应用程序中。使用的密码不被认为是有效的 - 但我不知道为什么,因为基于 android 文档,它应该被支持。

密码建立在:

return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_RSA + "/" +KeyProperties.BLOCK_MODE_ECB + "/" + KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1);
Run Code Online (Sandbox Code Playgroud)

官方文档中列出了此密码。

稍后使用的 keyGenerator 和 keyFactory 生成如下。

            keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null); // Ensure the key store can be loaded before continuing.

            keyGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
            keyFactory = KeyFactory.getInstance("RSA");

            createCipher(); // If this doesn't throw, the cipher we need is available.
Run Code Online (Sandbox Code Playgroud)

我还使用该密码初始化密钥生成器:

 keyGenerator.initialize(new KeyGenParameterSpec.Builder(keyAlias,
                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) //
                    .setBlockModes(KeyProperties.BLOCK_MODE_ECB) //
                    .setUserAuthenticationRequired(true) //
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) //
                    .build());

            keyGenerator.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

我还将公钥添加到加密过程中,而公钥是这样生成的:

private PublicKey getPublicKey() throws GeneralSecurityException { …
Run Code Online (Sandbox Code Playgroud)

android android-keystore android-security android-fingerprint-api

5
推荐指数
2
解决办法
1670
查看次数

在具有指纹扫描仪的华为Android设备上,createConfirmDeviceCredentialIntent()不允许指纹解锁

在具有指纹扫描仪(例如P9)的华为设备上使用KeyguardManager.createConfirmDeviceCredentialIntent()时,该屏幕仅适用于PIN /密码,但不允许使用指纹扫描仪进行解锁。在大多数其他有效的品牌上。这是一个已知的问题?我找不到任何堆栈溢出条目。华为知道这个问题吗?

我知道我可以使用Fingerprint API,但是此方法已从Android 5.0开始运行,并且不仅限于指纹。

https://developer.android.com/reference/android/app/KeyguardManager.html#createConfirmDeviceCredentialIntent(java.lang.CharSequence,java.lang.CharSequence

android keyguardlock android-fingerprint-api huawei

5
推荐指数
0
解决办法
401
查看次数

在 oauth 2.0 中使用指纹登录

我有一个使用 OAuth 2.0 身份验证模型保护的 REST api。现在我有一个客户想要开发一个使用这个 API 的移动应用程序 (Android)。此应用程序将使用 Android 内置指纹扫描仪进行登录。有没有人对这个应用程序应该如何对我的 OAuth 2.0 服务进行身份验证有任何建议?之前我们在创建移动应用时,使用的是标准Oauth登录,应用打开默认浏览器,使用标准Oauth登录流程登录,但是如果用户应该可以使用指纹登录怎么办?

rest android oauth-2.0 android-fingerprint-api

5
推荐指数
2
解决办法
2914
查看次数

KeyPermanentlyInvalidatedException 不起作用

我使用 KeyPermanentlyInvalidatedException 来检测是否添加了新指纹。但它不会抛出 KeyPermanentlyInvalidatedException。

我试过这些步骤:

  1. 项目清单
  2. 创建密钥对
  3. 从私钥初始化签名
  4. 从手机的设置添加新指纹
  5. 再次尝试从私钥初始化签名但它不会抛出 KeyPermanentlyInvalidatedException

我也从 stackoverflow找到了这个链接,但它没有帮助我。

从文件:

一旦安全锁屏被禁用(重新配置为无、滑动或其他不对用户进行身份验证的模式)或当安全锁屏被强制重置(例如,由设备管理员)时,密钥将不可逆转地失效。此外,如果密钥要求每次使用密钥都进行用户身份验证,则一旦注册新指纹或不再注册指纹,它也将不可逆转地失效,除非使用 setInvalidatedByBiometricEnrollment(boolean) 来允许注册后的有效性。尝试使用此类密钥初始化加密操作将引发 KeyPermanentlyInvalidatedException。

这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_authenticate);

    mButtonTest = findViewById(R.id.button_test);
    mButtonTest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            buttonTestOnClick();
        }
    });

    boolean isFirstTime = PreferenceManager.getInstances().getFirstTime();
    PreferenceManager.getInstances().setFirstTime(false);

    if (isFirstTime) {
        createKeyPair();
    }
}

private void buttonTestOnClick() {
    boolean result = initSignature();
    Log.e("iii", "Create signature result: " + result);

    boolean isFirstTime = PreferenceManager.getInstances().getFirstTime();

    if (result) {
        if (isFirstTime) { …
Run Code Online (Sandbox Code Playgroud)

android private-key android-fingerprint-api

5
推荐指数
0
解决办法
1236
查看次数

Android 6 上未显示生物识别提示

我正在尝试使用 BiometricPrompt 来使用指纹传感器进行身份验证。我支持的最低 sdk 是 23 (Android M)。

它适用于我测试过的所有 android 版本,除了棉花糖。

在棉花糖中,当我尝试在按钮上使用身份验证方法时,单击它调用onAuthenticationError方法BiometricPrompt.AuthenticationCallback并给出错误代码ERROR_HW_NOT_PRESENT和错误消息:

此设备没有指纹传感器

即使设备有指纹传感器并且它也添加了一个或多个指纹。

我在AndroidManifest.xml.

我在上面使用 jetpack 库。

实现 'androidx.biometric:biometric:1.0.0-alpha04'

在此处输入图片说明

android android-fingerprint-api android-jetpack android-biometric-prompt

5
推荐指数
1
解决办法
986
查看次数

将自定义布局添加到生物识别提示

有什么方法可以将我们自己的自定义布局添加到生物识别提示中,因为我已经看到了各种类似的线程,但似乎还没有为其提供解决方案,并且不推荐使用指纹管理器,所以我不想使用它。

android android-fingerprint-api android-biometric-prompt android-biometric

5
推荐指数
1
解决办法
2159
查看次数