【问题标题】:Cordova fingerprint authentication on server服务器上的 Cordova 指纹认证
【发布时间】:2017-02-04 23:50:18
【问题描述】:

我正在尝试在我的 (cordova) 安卓应用程序中创建一种身份验证机制,允许我的用户使用密码和用户名登录,或者允许他们扫描手指以登录。

如何验证在客户端、服务器端注册的指纹?这甚至可能使用 Cordova 吗?我尝试将手指扫描的结果传输到我的服务器:这看起来像:

FingerprintAuth.isAvailable(function(result) {
  if (result.isAvailable) {
    if(result.hasEnrolledFingerprints){
      FingerprintAuth.show({
        clientId: client_id,
        clientSecret: client_secret
      }, function (result) {
        alert(JSON.stringify(result));

        $http.post('http://192.168.149.33:3000/authorize', result).then(
          function(response) {}
        );

        if (result.withFingerprint) {
          $scope.$parent.loggedIn = true;
          alert("Successfully authenticated using a fingerprint");
          $location.path( "/home" );
        } else if (result.withPassword) {
          alert("Authenticated with backup password");
        }
      }, function(error) {
        console.log(error); // "Fingerprint authentication not available"
      });
    } else {
      alert("Fingerprint auth available, but no fingerprint registered on the device");
    }
  }
}, function(message) {
  alert("Cannot detect fingerprint device : "+ message);
});

服务器端我收到以下数据(3 次单独扫描):

{ withFingerprint: 't8haYq36fmBPUEPbVjiWOaBLjMPBeUNP/BTOkoVtZ2ZiX20eBVzZAs3dn6PW/R4E\n' }
{ withFingerprint: 'rA9H+MIoQR3au9pqgLAi/EOCRA9b0Wx1AvzC/taGIUc8cCeDfzfiDZkxNy5U4joB\n' }
{ withFingerprint: 'MMyJm46O8MTxsa9aofKUS9fZW3OZVG7ojD+XspO71LWVy4TZh2FtvPtfjJFnj7Sy\n' }

图案似乎每次都不同,有没有一种方法可以将指纹链接到例如数据库中用户名下保存的图案?

【问题讨论】:

  • 我相信插件应该是这种实现的方式。请查看这个插件 - github.com/mjwheatley/cordova-plugin-android-fingerprint-auth
  • 嗨,马克我有疑问?如何获取clientid和client_secret?
  • @HariKrishnan.P 我认为您将不得不为此深入研究本机代码。或者,您可以搜索具有该本机功能接口的 cordova 插件。
  • @Gandhi- 我已经使用了上面的插件,但是我们必须以哪种格式将指纹存储在 db like.string 或任何图像中?

标签: javascript android cordova fingerprint


【解决方案1】:

简答

此 API 返回的字符串不是“指纹模式”。所以你将无法验证你的想法......

长答案

让我们首先查看您正在使用的 API 的 source code

查看this file,我们看到了这些方法:

public static void onAuthenticated(boolean withFingerprint) {
    JSONObject resultJson = new JSONObject();
    String errorMessage = "";
    boolean createdResultJson = false;
    try {

        if (withFingerprint) {
            // If the user has authenticated with fingerprint, verify that using cryptography and
            // then return the encrypted token
            byte[] encrypted = tryEncrypt();
            resultJson.put("withFingerprint", Base64.encodeToString(encrypted, 0 /* flags */));
        } else {
            // Authentication happened with backup password.
            resultJson.put("withPassword", true);

            // if failed to init cipher because of InvalidKeyException, create new key
            if (!initCipher()) {
                createKey();
            }
        }
        createdResultJson = true;

// ...

/**
 * Tries to encrypt some data with the generated key in {@link #createKey} which is
 * only works if the user has just authenticated via fingerprint.
 */
private static byte[] tryEncrypt() throws BadPaddingException, IllegalBlockSizeException {
    return mCipher.doFinal(mClientSecret.getBytes());
}

看看"withFingerprint" 的内容。它是加密客户端密码的 Base64 编码。从技术上讲,这您的身份验证。您将使用此令牌来验证请求,并且您的服务器将解密和验证客户端密码。

总结

指纹增加了安全级别,但它不是唯一的安全手段。需要事先与设备和服务器建立关系。

我发现这张图有助于理解 android 指纹认证的意图(参考:http://android-developers.blogspot.com/2015/10/new-in-android-samples-authenticating.html

【讨论】:

【解决方案2】:

您无法在服务器上验证指纹,指纹是使用Live Scan/Biometric template 存储或验证的。通过将当前扫描模板与之前存储的模板进行比较来完成身份验证

首先,您无权访问这些存储的模板(操作系统提供商/手机制造商未提供),如果我们假设您可以访问这些模板,则可以使用有效的算法(基于图像/基于模式)需要将当前模板与以前存储的模板进行比较。您不能简单地通过字符串比较对其进行身份验证。

【讨论】:

    【解决方案3】:

    使用 cordova-plugin-fingerprint-aio 进行指纹认证。

    更多信息您可以咨询https://www.npmjs.com/package/cordova-plugin-fingerprint-aio

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2021-12-14
      • 2019-06-03
      • 1970-01-01
      • 2011-09-14
      • 2017-03-11
      相关资源
      最近更新 更多