【问题标题】:Android - how to get Unique key from Finger-Print Authentication?Android - 如何从指纹认证中获取唯一密钥?
【发布时间】:2017-11-15 03:55:57
【问题描述】:

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

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();
}

我想跳过这一步(用户输入密码),只要求用户通过指纹传感器进行身份验证,然后开始加密过程!

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

我在github 上阅读了一些关于 SO 和相关示例的问题,但我仍然找不到解决方法。

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

【问题讨论】:

  • 指纹不能像密码一样直接用作密钥,因为指纹在读取时略有不同。更糟糕的是,指纹并不是秘密——你把它们留在各处。
  • @JamesKPolk:我对指纹传感器如何检测设备所有者的假设是指纹传感器根据触摸指纹传感器的每个手指生成一个哈希键。然后指纹传感器将生成的哈希密钥与从所有者的指纹生成的哈希密钥进行比较,该指纹在某处保密(当所有者即将在设备上激活此身份验证时)。如果存在这样的东西,我需要找到它并将其用作密码(因为我们不知道指纹传感器如何生成哈希键,这可能是一个可靠的密码)
  • @JalalAghazadeh 与您的问题无关,但您不应在任何代码中使用 SHA1PRNG。已弃用
  • @JalalAghazadeh 你成功了吗?我正在寻找完全相同的东西,但找不到答案...
  • @ben 不是真的 :( 因为正如“James K Polk”所提到的指纹并不是秘密,你把它留在了任何地方,并且没有全局 API 可以从指纹芯片和每个公司有他自己的故事。有些允许您通过一些自定义 api 访问此类密钥,有些则不允许!

标签: android encryption fingerprint secret-key android-fingerprint-api


【解决方案1】:

2019 年 10 月 14 日更新

TL;DR

不,您无法访问指纹。您只能从 Biometric API 获得“赞许”或“赞许”。这是有意设计的。

不过,您可以利用 Android 密钥库进行硬件支持的加密操作,并要求用户重新进行身份验证才能释放密钥。这几乎可以满足您的需求。

长答案

不可能从指纹生成类似密码的种子。正如 James K Polk 评论的那样,指纹在扫描时会有所不同,并且它们永远不会直接清晰地存储在设备上

在登记指纹时,会临时存储其图像 在安全设备内存上进行处理以生成验证 数据和指纹模板(这些都是无法访问的 安卓操作系统)。然后丢弃原始图像。当一个手指 扫描后,将图像与生成的验证数据进行比较 之前,如果它匹配到一定程度的确定性,用户是 视为已认证。

生物识别操作在 Android 的可信执行环境 (TEE) 内进行。这是一个完全隔离的操作系统,在现代设备 (SE) 上的单独协处理器上的 CPU 的受保护部分上运行。

这是一个几乎无法触及的环境,具有受限的接口和硬件屏障,以防止篡改芯片和强制提取生物特征验证数据和加密密钥。

解决方案

回到您最初的问题,不,您无法获得任何唯一的手指识别。这本质上是不安全的,因为任何应用程序都可以读取秘密!

可以做的是利用 Android 的硬件支持 Keystore 并要求设备级身份验证来发布硬件支持的加密密钥 (setUserAuthenticationRequired(true))。这意味着生成一个随机密钥,该密钥安全地保存到密钥库中,需要手指滑动才能将密钥释放到用户空间。 硬件支持这个词我怎么强调都不过分。

您无法控制可以使用哪个手指,以及特定供应商的实现是否允许使用设备解锁模式绕过生物识别。

Android 密钥库

密钥库的目的是保护加密密钥。只有满足足够的要求(例如最近或即时的生物特征身份验证)后,拥有它们的应用才能检索密钥。

密钥可以防止恶意提取,在现代设备上@9​​87654321@,这意味着它们永远不会离开安全硬件 (TEE/SE),因此永远不会暴露给您的 Android 应用程序。任何加密操作,例如 AES 加密/解密,都在用户空间之外(在安全硬件上)安全地执行,注册新指纹/更改锁定模式将使密钥永久失效。在这种操作模式下,Keystore 条目仅用作在安全硬件内部进行加密操作的“接口”,真正的秘密永远不会暴露给您的应用程序。

总结

有一个指纹/生物识别 API,纯粹是为了方便,让您可以通过要求用户进行身份验证来快速确认操作。它归结为来自 TEE/SE 的“是”/“否”回答,并且因手机制造商而异!

密钥库是一个硬件支持的加密密钥库。如果设备硬件支持,运行 API 级别 28+ 的设备也可以访问 Strongbox Keymaster,这会将加密操作限制在具有更安全存储的专用安全 CPU 上。

这些功能是特定于设备/供应商的!并且可能受到损害/不安全​​!如果您不确定设备,请在启用指纹身份验证之前警告用户。 唯一真正安全的加密方法每次提示用户输入解密密钥(在这种情况下,大脑是硬件支持的存储)。将其存储在任何地方,即使是在实时内存中,也总是存在计算风险。

做密码学是极其困难的。我高度 建议您研究并尝试了解基础知识,以及 在尝试使用它之前,Android 必须提供的额外安全性 生产。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2014-10-26
    相关资源
    最近更新 更多