在Android应用中使用系统PIN对话框

24

背景

我想要开发一个应用,其功能如下:

  • 用户启动应用时,应用会检查用户是否已在设备上注册了PIN码。
  • 如果用户已经注册了PIN码,则应用必须显示“使用PIN码继续”的按钮。
  • 当用户点击“使用PIN码继续”按钮时,系统标准的PIN码对话框会出现。 enter image description here
  • 用户输入其PIN码并按下“继续”按钮。
  • 系统必须检查输入的PIN码是否正确,并继续工作。

搜索结果

我在stackoverflow和其他互联网来源上做了一些搜索,发现一些文章说:“在未root的手机上无法开发新的自定义解锁机制。”,或者:“如果您能用这种方式,那么你可能会窃取PIN码,我认为没有人会想要这样。”。

我还观看了一些视频教程,例如教程:Android内部 - 构建自定义ROM,第一部分教程:Android内部 - 构建自定义ROM,第二部分

已编辑

我今天进行了一些搜索,发现了一件非常有趣的事情,我认为我正在走向解决方案的正确路径,并希望与您分享我的想法。所以在查看Android源代码时,我发现了一些有趣的文件:ChooseLockPassword.javapackages \ apps \ Settings \ src \ com \ android \ settings )和 LockPatternUtils.java( *frameworks \ base \ core \ java \ com \ android \ internal \ widget *),现在我感兴趣的是:

问题

如何从我的代码中调用 LockPatternUtils 类函数?或者为什么我在Eclipse中看不到该函数?


决策

因此,我认为获取Android系统PIN对话框的唯一方法是对手机进行root,并对系统文件进行一些更改,然后使用系统PIN对话框


问题

  1. 有人可以提供有关如何在已root的手机上访问系统PIN对话框的有用链接吗?
  2. 我是否正确,并且我能否用这种方式解决我的问题?
  3. 如果有人遇到过这样的问题,请帮助我解决。

有什么解决方法吗?


2
这看起来像是付出了一些不错的努力,但为什么你不编辑你之前提到的与这个类似的问题呢?http://stackoverflow.com/questions/10086659/use-system-pin-in-android,而且那个问题你在不到一天之前就已经问过了。 - Nanne
3
然后神奇地,我几个得分很高的被接受答案突然遭到了点踩。完全是随机的。 - Nanne
@Nanne 我已经为您删除了之前的帖子! - Viktor Apoyan
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/10006/discussion-between-nanne-and-vito-brothers-apoyan - Nanne
你为什么不为你的应用程序实现自己的 PIN 系统,让用户选择呢?Android 将把您的应用程序放在一个单独的目录中,并使用自己的用户,因此您可以安全地将应用程序的 PIN 作为纯文本存储。只有当手机被 root 后,才会有可能有外部应用程序获取它。这似乎比挖掘和调用系统 PIN 对话框更容易,特别是如果不支持这样做。 - Russ
显示剩余3条评论
3个回答

7
好的,我已经解决了这个问题,现在我想与您分享我的解决方案。
首先,如我所说,我有android源代码,所以我对android源代码进行了一些更改,以获取对PIN和Pattern对话框的访问权限。在这里它们是:
〜\AndroidSources\pakages\apps\Settings\AndroidManifest.xml中,我更改了以下代码行。
<activity android:name="ConfirmLockPattern"
          android:exported="true"> // This line was added by me.
</activity>

<activity android:name="ConfirmLockPassword"
          android:exported="true" // This line was added by me.
          android:them="@android:style/Them.NoTitleBar">
</activity>

<activity android:name="ChooseLockPattern"
          android:exported="true" // This line was added by me.
          android:label="@string/lockpattern_change_lock_pattern_label">
</activity>

这些修改允许我从自己的应用程序中调用“确认图案锁定”,“确认密码锁定”和“选择图案锁定”活动。在编译Android源代码并启动系统映像文件(system.img)后,可以实现该功能。
在我的应用程序中,我编写了以下函数以调用“确认图案锁定”或“选择图案锁定”活动:
/**
 * Show PIN/Password confirmation dialog.
 */
void ShowConfirmLockPINActivity() {
    CustomLog.i(TAG, "Show Confirm Lock PIN Activity");
    Intent intent = new Intent(Intent.ACTION_RUN);
    intent.setComponent(new ComponentName("com.android.settings",
        "com.android.settings.ConfirmLockPassword"));
    startActivityForResult(intent, mRequestCode);
} /* ShowConfirmLockPINActivity() */

/**
 * Show set PIN/Password dialog.
 */
void ShowSetLockPINActivity() {
    CustomLog.i(TAG, "Show Set Lock PIN Activity");
    Intent intent = new Intent(Intent.ACTION_RUN);
    intent.setComponent(new ComponentName("com.android.settings",
        "com.android.settings.ChooseLockPassword"));
    startActivityForResult(intent, mRequestCode);
} /* ShowSetLockPINActivity() */

/**
 * Show Pattern Confirmation dialog.
 */
void ShowSetLockPatternActivity() {
    CustomLog.i(TAG, "Show Set Lock Pattern Activity");
    Intent intent = new Intent(Intent.ACTION_RUN);
    intent.setComponent(new ComponentName("com.android.settings",
        "com.android.settings.ConfirmLockPattern"));
    startActivityForResult(intent, mRequestCode);
} /* ShowSetLockPatternActivity() */

7
这都很好,但你实际上需要制作一个定制的ROM?这是给其他用户使用的应用程序还是只能由您自己使用?因为我不认为有人会改变ROM仅仅为了使用您的应用程序。 - Matsemann
1
@Matsemann 这是演示应用程序。我只是用它来展示一些功能。 - Viktor Apoyan
我无法在我的系统中找到“~\AndroidSources\pakages\apps\Settings\AndroidManifest.xml”文件? - PEHLAJ
1
@Pehlaj 抱歉,我是在6年前完成的,我猜很多东西之后都发生了变化 :) 这个文件不在系统中,而是在Android源代码中,你需要拥有Android源代码才能在那里进行更改,然后重新构建Android源代码。 - Viktor Apoyan

3
以下是关于您问题的一些考虑事项。
  1. 在这种特定情况下,深入研究Android的代码并不是一个好主意,因为验证PIN码是一个重要的安全点,其机制必须被隐藏和保护得很好,以避免任何恶意意图。

  2. 因此,您想执行的操作(请求PIN码,然后检查它是否与真实的PIN码匹配)是被禁止的,并且看起来像是一种入侵行为。因此,您不应该尝试访问用户密码存储。

  3. 更正确的做法是通过某个Intent启动标准的PIN屏幕,并要求它为您完成所有工作。然而,简要调查没有给我带来任何结果;也许,您会找到一些有用的信息。

  4. 修改ROM显然是死路一条 - 没有人会刷手机来安装一个应用程序。要求rooted手机会稍微好一些,有些应用程序不能在非rooted手机上运行,但仍然会回到第2点(入侵)。

  5. 用户可能会禁用PIN检查,而且有些设备没有SIM卡

因此,根据所有提到的内容,我建议您考虑不同的验证方法来使用您的应用程序。

它回答了你的第二个问题和“有什么想法”的问题,不是吗? - a.ch.
1
@a.ch。我不得不反对你的第一个观点。安全最佳实践是假定你的对手拥有完全访问你的算法(源代码)的权限,而唯一的秘密是你的密钥材料(密码)。 - Sparky
嗯,你可能是对的。但是,我想暗示这个方向是死路一条。 - a.ch.
@a.ch。我找到了解决方案,你可以看看 :) - Viktor Apoyan
2
好的。你将如何在分发应用程序时应用它? - a.ch.

2
自API级别21开始,可以使用KeyguardManager.createConfirmDeviceCredentialIntent对当前用户进行设备锁定PIN的身份验证。
请参见使用示例

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