如何在Android 5.0(API 21)之前确认设备凭据?

10

我有一个使用案例需要用户确认设备凭据,而KeyguardManager中的createConfirmDeviceCredentialIntent方法完全满足我的需求。但是,这个方法是在API 21之后添加的。(参考链接)那么,在Android 5.0之前如何实现相同的功能?我还想支持Android 4.X等版本。

谢谢!


1
你可能需要自己实现它。 - tynn
@danny-zheng,这个有什么进展吗? - Beth Mezias
2个回答

5

在21级之前,非root设备肯定无法实现这一点,而且没有常规权限的替代品。

如果需要额外的管理员权限来确认凭据,则可能可以通过实现{{link1:DeviceAdminReceiver.onPasswordSucceeded}} 松散地模拟凭据确认,但需要更多的努力。当密码成功时锁定屏幕并执行所需操作。这可能会相对复杂,因为不总是接收到操作(仅在状态发生变化时),需要保持上次成功,与接收方进行通信等。

另外,请仔细检查使用情况和设计,在大多数情况下,使用createConfirmDeviceCredentialIntent实际上并不需要,并且可能有其他设计选择可以消除对其的需求。

最好提供确切的保护内容细节。如果是防止未经授权的人意外访问设备的场景,并且已从某些oauth服务生成永久令牌,则可能合理地重新通过相同的服务登录流程进行授权,或者将原始凭据的某些hmac与令牌一起存储,然后提示并重新验证凭据,而不是提示设备凭据。或者,如果这足够用例,您可以使用google登录来授权访问您的应用程序/令牌,并验证Google用户是否与存储的令牌相同。


1
我看到的最好的解决方案在博客文章中描述:

Android Secrets

但是,它会重新创建私有系统类并调用不公开的AOSP代码。我的悬赏是为了更好的答案,它不需要在项目内显式命名类。也许可以使用Smart Lock或其他优秀的安全库来实现我所需的向后兼容功能。

这个问题似乎没有办法通过这些私有API强制进行PIN确认。一旦手机解锁,它就被解除了阻止,因此您只能在打开的手机上获得安全存储而无需保护挑战。如果您的目的仅是如此,那么您正在尝试回答一个不同的问题,这与创建createConfirmDeviceCredentialIntent确认不同,不能替代。 - Fedor Losev
但是...博客文章中的PIN确认UI使用了Android系统上的危险路径:try { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { startActivity(new Intent("android.credentials.UNLOCK")); } else { startActivity(new Intent("com.android.credentials.UNLOCK")); } } catch (ActivityNotFoundException e) { Log.e(TAG, "No UNLOCK activity: " + e.getMessage(), e); }悬赏金用于获取一个更合法的向后兼容库以进行本地身份验证?除了将用户发送回我的服务器进行输入之外,还有其他方法吗? - Beth Mezias
不仅是一条危险的道路(好吧,不是那么危险),它的工作方式也与人们想象的不同。一旦商店解锁(包括在手机解锁时),它将不再提示输入 PIN,发送 UNLOCK 意图将弹出空白,据我所知,没有办法强制进行身份验证。因此,对于最初的问题,答案是没有替代方案(因此您的问题是不同的)。 - Fedor Losev
任何在使用令牌之前保护其而不需要设备确认的方法都需要用户提供一些自定义信息,因为你不能使用设备确认(除了我所概述的锁定解决方案)。如果您不想采用我的答案中的锁定路径,最好让用户输入原始登录信息而不是使用其他自定义信息。但您无需返回服务器进行验证。 - Fedor Losev
由于您提到了Google登录->该应用程序支持多种权限和帐户类型。这些服务器在实质上是只读资源。为了简化登录过程,必须加密和保护令牌类型字符串。某些权限可能需要在每个新会话中进行某种形式的身份验证,并且如果我们的应用程序设置本地模式/ PIN /密码/打印检查,它将与我们的服务器合作。那就是问题所在。如何进行本地检查。 - Beth Mezias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接