指纹识别是什么?
提到指纹识别我们就要先弄清楚什么事指纹,指纹为何能够做到区别性。
指纹,由于其具有终身不变性、唯一性和方便性,已几乎成为生物特征识别的代名词。指纹是指人的手指末端正面皮肤上凸凹不平产生的纹线。纹线有规律的排列形成不同的纹型。纹线的起点、终点、结合点和分叉点,称为指纹的细节特征点(minutiae)。
指纹识别即指通过比较不同指纹的细节特征点来进行鉴别。指纹识别技术涉及图像处理、模式识别、计算机视觉、数学形态学、小波分析等众多学科。由于每个人的指纹不同,就是同一人的十指之间,指纹也有明显区别,因此指纹可用于身份鉴定。由于每次捺印的方位不完全一样,着力点不同会带来不同程度的变形,又存在大量模糊指纹,如何正确提取特征和实现正确匹配,是指纹识别技术的关键。
指纹识别的易用性
指纹识别功能提高了系统的易用性,不仅是解锁屏幕,它还可以用来设置一些快捷操作如:拍照、快捷打开程序等等,同时鉴于指纹识别的高区别性质,指纹识别不仅仅是对于功能的简化,更深层次的是安全级别的一个提高。
指纹识别的安全性
随着时代的发展网络支付等安全问题面临越来越多的问题,这传统的基于密码、加密算法和验证码的安全机制在安全性和方便性方面已经无法满足现有需求,甚至已经受到挑战。为了能够更好地确保系统的安全性和方便性,迫切需要寻找其他的技术。于是人们将目光转移到了生物特征识别技术上,因为人体某些生物特征各不相同并且不会发生变化以及很难遗失和仿制。目前被使用的生物识别技术主要有指纹、虹膜、视网膜、语音、面部、DNA以及签名,它们各自的性能以及优缺点如表所示:
每个人的指纹独一无二并且很难发生变化,此外,它不需要像密码那样需要记忆,真正做到了随时随地使用。目前已经有很多品种的低成本的指纹采集传感器供选择。指纹在采集的过程中对硬件系统的要求不高,指纹采集设备实现比较容易。目前已经有标准的指纹库供开发者使用,识别系统开发相对比较容易,实用性强。随着现代电子集成制造技术的提高,可以制造体积较小并且精度更高的指纹图像传感器。另外,快速可靠的指纹图像处理、识别算法也得到迅速发展,同时现代计算机运算速度越来越快,已经完全具备在微机上进行两个指纹的快速比对运算。可以说,目前指纹技术已经是非常成熟的生物识别技术,具有很大可靠性和实用性。
综上所述,当前指纹识别技术因其低成本识别率高而具有最为广阔的应用前景,已经达到实用化、产业化的程度。也正是因为指纹识别有如此多的好处,Google在2015年Android6.0发布会上指出Android6.0会在系统级别支持指纹识别功能,虽然相对Apple晚了一些但是对于广大的Android用户来说这是一个福音。
指纹识别功能实现简介
指纹识别通过指纹传感器采集信息,进行指纹图像的预处理,然后进行特征点提取,最后进行特征匹配如下图所示:
通过指纹图像传感器采集到指纹图像经常会受到传感器本身误差、手指压力不同以及手指存在尘埃等众多因素影响,使得采集到的指纹图像的质量不够高。因此首先需要对指纹图像进行预处理,以便获得较为清晰的指纹图像并为后期的匹配做好准备工作。经过预处理后的指纹纹线被处理成单一象素点,接下来就可以对指纹图像进行特征提取以及特征装配。最后将获得的特征信息与指纹特征数据库中的指纹特征模板做一一对比,如果有匹配的指纹模板则提取出与之一一映射的身份信息,这样就可以进行身份论证。
指纹识别用途
大概列举几个指纹识别的用途
系统解锁
应用锁
支付认证
普通的登录认证
指纹识别Google官方文档
分析(原理探索)
- Android程序硬件访问机制简介
在 Android 系统中,最上层的面向界面的应用程序使用 Java 语言编写,Java 编写的应用程序都运行在 Android 特有的虚拟机中。Android 系统是基于 Linux 内核构建,Linux 设备驱动程序程序使用 C 语言编写,且运行在 Linux 内核空间。用户空间访问硬件的方法是通过基于C库的系统调用来调用工作于内核空间的设备驱动程序,从而访问到硬件。显然使用 Java 语言开发的应用程序显然无法直接访问硬件。为了解决这个问题,在Android 系统中提供了硬件抽象层(HAL)来解决这个问题,硬件抽象层运行在用户空间并且使用 C/C++语言编写,它向下屏蔽了硬件驱动模块的实现细节,向上提供了硬件访问服务。
- 指纹识别两种场景
指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别。另外,实际开发场景中,使用指纹的主要场景有两种:
纯本地使用。即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台。
与后台交互。用户在本地完成指纹识别后,需要将指纹相关的信息传给后台。
由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得。
上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说:
纯本地的使用指纹识别功能,只需要对称加密即可;
后台交互则需要使用非对称加密:将私钥用于本地指纹识别,识别成功后将加密信息传给后台,后台开发人员用公钥解密,以获得用户信息。
- 对称加密、非对称加密和签名
在正式使用指纹识别功能之前,有必要先了解一下对称加密和非对称加密的相关内容。
对称加密:
所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。因此加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。
非对称加密:
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
签名:
在信息的后面再加上一段内容,可以证明信息没有被修改过。一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。
对称加密和非对称加密的特点:
对称加密的优点
速度快,适合于本地数据和本地数据库的加密,安全性不如非对称加密。常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
非对称加密的特点
安全性比较高,适合对需要网络传输的数据进行加密,速度不如对称加密。非对称加密应用于SSH, HTTPS, TLS,电子证书,电子签名,电子身份证等等
- 指纹识别的对称加密实现
Generator [ˈdʒenəreɪtə(r)] 发电机
Authentication [ɔ:ˌθentɪ’keɪʃn] 认证
使用指纹识别的对称加密功能的主要流程如下:
1、使用 KeyGenerator 创建一个对称密钥,存放在 KeyStore 里。
2、设置 KeyGenParameterSpec.Builder.setUserAuthenticationRequired() 为true,
3、使用创建好的对称密钥初始化一个Cipher对象,并用该对象调用 FingerprintManager.authenticate() 方法启动指纹传感器并开始监听。
4、重写FingerprintManager.AuthenticationCallback 的几个回调方法,以处理指纹识别成功(onAuthenticationSucceeded())、失败(onAuthenticationFailed() 和 onAuthenticationError())等情况。
- 创建密钥
创建密钥要涉及到两个类:KeyStore(俗称密钥商店) 和 KeyGenerator(密钥发电机)
(关于KeyGenerator和KeyStore,可以研究下这篇文章)
(关于加密算法,请看 这篇文章)
三个类:
KeyGenerator产生密钥
KeyStore存放获取密钥
Cipher,是一个按照一定的加密规则,将数据进行加密后的一个对象
产生密钥
public void createKey() {
try {
// 创建KeyGenerator对象
mKeyGenerator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
mKeyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME,
KeyProperties.PURPOSE_ENCRYPT |
KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
// 设置需要用户验证
.setUserAuthenticationRequired(true) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build());
// 生成key
mKeyGenerator.generateKey();
} catch (NoSuchProviderException | NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
}
}
}
KeyStore存放获取密钥
if (mKeyStore == null) {
mKeyStore = KeyStore.getInstance("AndroidKeyStore");
}
mKeyStore.load(null);
创建并初始化 Cipher 对象
SecretKey key = (SecretKey) mKeyStore.getKey(KEY_NAME, null);
mCipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
mCipher.init(Cipher.ENCRYPT_MODE, key);
上面几个参数对象就已经创建完成,使用指纹识别时只需要FingerprintManager.authenticate(),系统就会启动指纹传感器,将结果反馈给回调方法.
在完成指纹验证之后,关闭指纹验证:
if (mCancellationSignal != null) {
mCancellationSignal.cancel();
mCancellationSignal = null;
}
非对称加密的实现
非对称加密的步骤和对称加密算法基本上是一样的:
1.KeyPairGenerator产生非对称密钥
2.Cipher是通过创建好的私钥进行签名来产生的
创建 KeyPairGenerator 对象