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