如何检测用户在我的应用程序中通过指纹认证后是否将新指纹添加到Android设置中?
也就是说,iOS 有一种称为(evaluatedPolicyDomainState)的东西来检测指纹目录中的更改,那么在Android中有什么替代方案呢?
出于安全原因,这需要提示密码。
如何检测用户在我的应用程序中通过指纹认证后是否将新指纹添加到Android设置中?
也就是说,iOS 有一种称为(evaluatedPolicyDomainState)的东西来检测指纹目录中的更改,那么在Android中有什么替代方案呢?
出于安全原因,这需要提示密码。
setUserAuthenticationRequired
的文档中可以得知:一旦安全锁屏被禁用(重新配置为“无”、“滑动”或其他不需要用户认证的模式)或者安全锁屏被强制重置(例如,由设备管理员),密钥将变得不可逆地失效。此外,如果密钥要求每次使用密钥都进行用户验证,则在有新指纹注册或不再注册指纹的情况下,它也将不可逆地失效,除非使用setInvalidatedByBiometricEnrollment(boolean)
允许在注册后有效。尝试使用这些密钥初始化加密操作将抛出KeyPermanentlyInvalidatedException异常。
init
调用。如果已注册新指纹,则init
调用应触发KeyPermanentlyInvalidatedException
。KeyPermanentlyInvalidatedException
。 - Michael我可以将所有指纹ID以整数形式获得。
private void getFingerprintInfo(Context context)
{
try {
FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
Method method = FingerprintManager.class.getDeclaredMethod("getEnrolledFingerprints");
Object obj = method.invoke(fingerprintManager);
if (obj != null) {
Class<?> clazz = Class.forName("android.hardware.fingerprint.Fingerprint");
Method getFingerId = clazz.getDeclaredMethod("getFingerId");
for (int i = 0; i < ((List) obj).size(); i++)
{
Object item = ((List) obj).get(i);
if(item != null)
{
System.out.println("fkie4. fingerId: " + getFingerId.invoke(item));
}
}
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException e) {
e.printStackTrace();
}
}
getEnrolledFingerprints
不幸已被列入灰名单(在此处检查https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces获取信息),这意味着如果您的应用程序针对API 29+,则无法使用此功能。 - gbaziliogetFingerId()
在三星设备上不会返回有效的指纹ID,它返回一个索引(1、2、3等),这对于检查是否添加了新指纹没有用处。<br/>此外,还有4个其他函数,我测试过但不是很有用,如:getName()
、getGroupId()
、getDeviceId()
和describeContents()
。<br/>如果将getName()
与索引连接起来,则可能有用,但问题在于当您删除最后保存的指纹并创建其他具有相同名称的指纹时。 - Mohamed Ali Benmansour private String getFingerprintInfo(Context context) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
Method method = FingerprintManager.class.getDeclaredMethod("getEnrolledFingerprints");
Object obj = method.invoke(fingerprintManager);
String allFingerPrintInfo = "";
if (obj != null) {
Class<?> clazz = Class.forName("android.hardware.fingerprint.Fingerprint");
for (int i = 0; i < ((List) obj).size(); i++) {
Object fingerPrint = ((List) obj).get(i);
if (fingerPrint != null) {
String fingerPrintInfo = "";
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
Parcel p = Parcel.obtain();
p.setDataPosition(0);
// Method writeToParcel = clazz.getDeclaredMethod("writeToParcel", Parcel.class, Integer.class);
clazz.getDeclaredMethods()[1].invoke(fingerPrint, p, 0);
p.setDataPosition(0);
fingerPrintInfo = p.readString() + "_" + p.readInt() + "_" + p.readLong();
} else {
Method getFingerId = clazz.getDeclaredMethod("getFingerId");
fingerPrintInfo = (String) getFingerId.invoke(fingerPrint);
}
allFingerPrintInfo += fingerPrintInfo + "*";
}
}
}
return allFingerPrintInfo;
}
/**
* Generate NIST P-256 EC Key pair for signing and verification
*
* @param keyName
* @param invalidatedByBiometricEnrollment
* @return
* @throws Exception
*/
@TargetApi(Build.VERSION_CODES.P)
private KeyPair generateKeyPair(String keyName, boolean invalidatedByBiometricEnrollment) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(keyName,
KeyProperties.PURPOSE_SIGN)
.setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
.setDigests(KeyProperties.DIGEST_SHA256,
KeyProperties.DIGEST_SHA384,
KeyProperties.DIGEST_SHA512)
// Require the user to authenticate with a biometric to authorize every use of the key
.setUserAuthenticationRequired(true)
.setInvalidatedByBiometricEnrollment(invalidatedByBiometricEnrollment);
keyPairGenerator.initialize(builder.build());
return keyPairGenerator.generateKeyPair();
}
你无法从应用程序中添加新的指纹。
在你的应用程序内部,你只能访问身份验证指纹方法,该方法通过密钥库检查已注册的指纹。