科幻电影一直是人们津津乐道的话题,其中不乏一些经典场面,让观众为之震惊赞叹,例如《钢铁侠》中的悬浮虚拟触摸屏、《碟中谍》中的指纹虹膜识别等。如今,这些看似高大上的科技也走进了我们的日常生活,像指纹与面容识别,其应用已经极为普遍与广泛。

当今社会对个人隐私的保护越来越重视,对App的安全性也提出了更高的要求,具备私密性与独特性的指纹与面容识别,就成为了强有力的保障。当用户在解锁设备、支付、文件访问时,利用指纹或者面容认证,这在很大程度上减少了帐号盗取、信息泄露的风险。

华为线上快速身份验证服务(FIDO)提供了相关功能:开放基于WebAuthn标准的FIDO2客户端能力,提供本地指纹、面容认证开放能力,为应用提供安全可信的本地生物特征认证和安全便捷的线上快速身份验证能力。其优势在于通过系统完整性检测和密钥校验机制保证结果安全可信,通用的无密码用户身份验证方案,易与现有帐号基础设施集成。接下来,为大家说明如何集成指纹和面容认证能力。

主要的接入步骤如下:

1.   配置AppGallery Connect
2.   集成HMS Core SDK
3.   集成本地生物认证能力

步骤1、2可以参考超链接中的指导进行完成,这里不做赘述。
需要注意的是步骤2中提供了两种本地生物认证的SDK:

Bioauthn-AndroidX

implementation 'com.huawei.hms:fido-bioauthn-androidx:5.2.0.301'

Bioauthn

implementation 'com.huawei.hms:fido-bioauthn:5.2.0.301'

这两个SDK对外表现的能力略有不同。主要表现在BioAuthn-AndroidX SDK的指纹认证能力提供统一界面,不需要应用自己绘制指纹认证提示界面;BioAuthn SDK的指纹认证能力不提供统一界面,需要应用自己绘制指纹认证提示界面。

可以参考官网FAQ中的说明:

解密指纹和面容认证的实现方法-LMLPHP

这次我们主要介绍Bioauthn-AndroidX的集成,Demo可以在这里下载

集成本地生物认证能力

注意:1.    请保证手机没有root过,不然无法使用指纹和面容能力2.    测试前请先保证手机中已经有相应的指纹和面容信息,否则会报相关的错误码。可以在设置-生物识别和密码-指纹/人脸识别中添加相关指纹和面容

指纹认证

使用指纹认证分为两步:

1.    初始化BioAuthnPrompt对象,代码如下:

BioAuthnPrompt bioAuthnPrompt = new BioAuthnPrompt(this, ContextCompat.getMainExecutor(this), new BioAuthnCallback() {
    @Override
    public void onAuthError(int errMsgId, CharSequence errString) {
        showResult("指纹认证报错. errorCode=" + errMsgId + ",errorMessage=" + errString);
    }
    @Override
    public void onAuthSucceeded(BioAuthnResult result) {
        showResult("指纹认证成功. CryptoObject=" + result.getCryptoObject());
    }
    @Override
    public void onAuthFailed() {
        showResult("指纹认证失败.");
    }
});

2.    创建提示信息,并进行认证。

// 自定义设置信息
BioAuthnPrompt.PromptInfo.Builder builder =
        new BioAuthnPrompt.PromptInfo.Builder().setTitle("主标题")
                .setSubtitle("副标题")
                .setDescription("内容描述");

//允许使用其他认证方式
builder.setDeviceCredentialAllowed(true);

BioAuthnPrompt.PromptInfo info = builder.build();

//进行认证
bioAuthnPrompt.auth(info);

配置完成后就可以进行指纹认证了,认证页面如下:

解密指纹和面容认证的实现方法-LMLPHP

面容认证

面容认证的限制条件比较多,具体请参考FAQ:

解密指纹和面容认证的实现方法-LMLPHP

1.    检查是否有相机权限(EMUI10.1及以后版本不需要相机权限)

int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
    showResult("请先申请相机权限");

    ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CAMERA}, 1);
    return;
}

 2. 检查当前设备是否支持人脸识别

FaceManager faceManager = new FaceManager(this);

int errorCode = faceManager.canAuth();
if (errorCode != 0) {
    resultTextView.setText("");
    showResult("不支持人脸识别. errorCode=" + errorCode);
    return;
}

 3. 进行人脸认证

int flags = 0;
Handler handler = null;
CryptoObject crypto = null;

faceManager.auth(crypto, cancellationSignal, flags, new BioAuthnCallback() {
    @Override
    public void onAuthError(int errMsgId, CharSequence errString) {
        showResult("认证报错. errorCode=" + errMsgId + ",errorMessage=" + errString
                + (errMsgId == 1012 ? " 没有相机权限." : ""));
    }

    @Override
    public void onAuthHelp(int helpMsgId, CharSequence helpString) {
        showResult("返回识别过程中提示信息. helpMsgId=" + helpMsgId + ",helpString=" + helpString + "\n");
    }

    @Override
    public void onAuthSucceeded(BioAuthnResult result) {
        showResult("认证成功. CryptoObject=" + result.getCryptoObject());
    }

    @Override
    public void onAuthFailed() {
        showResult("认证失败.");
    }
}, handler);

这样人脸识别的代码就完成了,调用后就会进行人脸认证。需要注意的是人脸认证没有默认的UI页面,需要我们自己去设计配置。

使用场景

指纹认证

一般来说指纹认证是用在支付场景的,用户付款前可以使用指纹认证来进行安全检测。指纹认证也可以用在文件保护App里,只有指纹认证通过才可以查看相关文件。

面容识别

面容识别也可以在支付场景和文件保护APP中使用,这个不再赘述在文件保护APP方面,面容识别的效果会比指纹表现的更出色。因为文件保护App有一个通病,那就是“此地无银三百两”,摆明了告诉别人你这个文件很重要或很敏感。所以其他人只要搞定了你的指纹(虽然也比较困难),那就畅通无阻了。
那么文件保护App除了可以在明面上展示指纹识别外,还可以“悄悄地”再做一层面容识别(面容识别不需要设计UI界面),只有指纹识别和面容识别都过了,才展示正确的文件,否则可以展示假文件。这样做的话就可以更好的保护用户的隐私。

具体的人脸识别的代码实现可以是下面这样的:

faceManager.auth(crypto, cancellationSignal, flags, new BioAuthnCallback() {
    @Override
    public void onAuthError(int errMsgId, CharSequence errString) {
        if(isFingerprintSuccess){//指纹认证成功但面容识别失败
            //展示假文件
            showFakeFile();
        }
    }

    @Override
    public void onAuthHelp(int helpMsgId, CharSequence helpString) {
    }

    @Override
    public void onAuthSucceeded(BioAuthnResult result) {
        if(isFingerprintSuccess){//指纹认证成功
            //展示真文件
            showRealFile();
        }else {//指纹认证失败
            //展示假文件
            showFakeFile();
        }

    }

    @Override
    public void onAuthFailed() {
        if(isFingerprintSuccess){//指纹认证成功但面容识别失败
            //展示假文件
            showFakeFile();
        }

    }
}, handler);

>>访问华为线上快速身份验证服务官网,了解更多相关内容
>>获取华为线上快速身份验证服务开发指导文档
>>华为HMS Core官方论坛
>>华为线上快速身份验证服务开源仓库地址:GitHubGitee

点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~

05-18 18:05