我想使用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本身的实现并且完全没问题,我只需要在身份验证后找到一种从指纹传感器获取唯一键的方法。
答案 0 :(得分:10)
从指纹生成类似密码的种子不可能。正如James K Polk评论的那样,扫描时指纹会有所不同,而且它们永远不会直接存储在设备上。
当注册指纹时,它的图像会临时存储在安全设备内存中,在此处理它以生成验证数据和指纹模板(这些都是Android操作系统无法访问的)。然后丢弃原始图像。扫描手指时,会将图像与之前生成的验证数据进行比较,如果匹配到某种程度的确定性,则认为用户已通过身份验证。
所有与指纹相关的操作都在Android的可信执行环境(TEE)中进行。这是一个完全隔离的操作系统,可以在具有预留内存的CPU的受保护区域中运行,也可以在现代设备上的完全独立的协处理器上运行。对于所有与Android相关的身份验证和安全对象而言,这是一个几乎无法触及的环境,并设置了硬件屏障以防止任何篡改芯片的企图。
回到原来的问题,不,您无法获得任何类型的指纹识别标识。但是,你可以做的是利用Android的Keystore的功能。您可以生成安全密钥对,将它们存储在密钥库中,并需要重新认证才能访问私钥。密码必须通过指纹API才能用作私钥。对设备安全设置的任何修改(包括添加任何新指纹)都将永久过期以这种方式受到保护的任何以Keystore支持的密钥对。任何种子"种子"你指的是永远不会离开TEE。如果可以的话,你怎么能保证任何形式的安全?
这是实现您想要做的事情的一种方式(参见this guide)。我不完全确定您的数据有多敏感,但可以使用设备模式/密码绕过指纹身份验证(...)方法(特别是指纹API现已弃用,将被包含特定于供应商的模式的新生物识别API所取代。我不确定是否可以确定是否使用了手指或密码,可以使用较旧的指纹API或隐藏提示。
指纹认证功能纯粹是为了方便起见。根据设计,它与Android的设备级安全性密切相关(任何看到设备解锁模式的人都可以绕过指纹传感器!!!)。如果你想使用它,那么你只能从TEE得到是/否答案。 您可以在密钥库中安全地存储密钥对,需要最近的设备级身份验证才能获得TEE提供的解密密钥。
这些功能是特定于设备/供应商的!并可能妥协/不安全!在启用指纹认证之前警告用户。 唯一真正安全的加密方法会在每个时间提示用户解密密钥。将它存储在任何地方,即使在现场记忆中,也总是存在计算风险。在Android上,这通常在TEE环境中完成,该环境被视为安全"。怎么安全?取决于电话。
没有。您甚至无法访问指纹。你只能竖起大拇指"或者"大拇指向下"来自API。这都是故意的,请阅读我的帖子。