Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to confirm device credential before Android 5.0 (API 21)?

Tags:

java

android

I have a use case that requires the user to confirm device credential, and the createConfirmDeviceCredentialIntent method in KeyguardManager perfectly meets my need. However, this method was added since API 21.(reference link) So how can I achieve the same functionality before Android 5.0? I also want to support versions like Android 4.X.

Thanks!

like image 628
Danny Zhang Avatar asked Jan 28 '16 21:01

Danny Zhang


2 Answers

Before 21 level this is certainly not possible on non-rooted device and there is no alternative with regular permissions.

If it is ok to require extra admin permissions, it is probably possible to emulate credential confirmation very loosely, with much more effort, by implementing DeviceAdminReceiver.onPasswordSucceeded. Lock the screen, when password succeeded perform the required action. This may turn out to be relatively complex because the action is not always received (only if status has changed), need to keep last success, communicate with receiver, etc.

As a side note, double check the use case and your design, in most cases when createConfirmDeviceCredentialIntent is used it is actually not required and other design choices may eliminate the need for it.

It was better to provide details of what exactly you are trying to protect. If it is a scenario for accidental access to the device by an unauthorized person and a permanent token is generated, say, from some oauth service, it may be reasonable either to reauthorize through the same service login flow or to store some hmac of original credentials along with token then prompt and re-validate credentials instead of prompting for device credentials. Alternatively, if that is enough for use case, you can use google login to authorize access to your app/token and verify google user is the same for the stored token.

like image 155
Fedor Losev Avatar answered Nov 18 '22 08:11

Fedor Losev


The best answer I have seen for this situation is described in a blog post:

Android Secrets

However, it recreates system classes that are private and calls AOSP code that is not public. My bounty is for a better answer that would not require explicit Class naming inside the project. Perhaps Smart Lock or another awesome security library can be used for the backward compatibility I require.

like image 31
Beth Mezias Avatar answered Nov 18 '22 09:11

Beth Mezias