【问题标题】:Allow only selected apps for sideloading in Android仅允许在 Android 中侧载选定的应用程序
【发布时间】:2019-08-13 01:29:13
【问题描述】:

我正在尝试为媒体设备定制 Android。我们从制造商那里获得了固件,它基于 Android 7,稍作修改。

我们想做的一件事是将设备上的应用程序安装限制为仅限某些应用程序。我们不会在设备上安装任何应用商店,例如 Google Play。我们将构建固件并将所有应用程序安装到我们车间的设备上并交付给客户。未来,我们可能希望通过 OTA 或某些机制在设备上安装更多应用。

我们希望禁止客户通过 USB 端口旁加载其他应用程序。我们创建了一个文件(例如 whitelisted_apps.txt),其中包含所有已批准应用名称的列表,例如 -

com.mycompany.android.app1
com.mycompany.android.app2
com.ourpartner.android.appx

我们调整了 AOSP 的 PackageInstaller 应用程序,以便当通过文件浏览器打开 *.APK 文件以及调用 PackageInstallerActivity.java 中的方法时,它会将要安装的应用程序的名称与 whitelisted_apps 中的名称进行比较.txt,如果找不到名称,则不允许安装新应用程序。它正在工作。

现在,我们想进一步改进它,因为 whitelisted_apps.txt 可以被操纵。有些人建议使用 sqlite 来保留列表。我们不确定这是否是最好的解决方案。

有些人建议使用证书和签名,我们认为这是比其他人更好的解决方案。我们将使用我们的密钥对要安装在设备上的所有应用程序进行签名。当一个 *.APK 文件被侧载时,PackageInstaller 将获取 APK 的签名并与我们的进行比较。如果它们匹配,则可以旁加载应用程序。

我们关注了这个优秀的资源:@​​987654321@。它与硬编码的 APP_SIGNATURE 一起工作。我们目前有这个:

public boolean validateAppSignature() throws NameNotFoundException {
    boolean sigMatch = false;
    String APP_SIGNATURE = "123456784658923C4192E61B16999";
    PackageInfo packageInfo3 = mPm.getPackageInfo(
            getPackageName(), PackageManager.GET_SIGNATURES);

    try {
        for (Signature signature : packageInfo3.signatures) {
            // SHA1 the signature
            String sha1 = getSHA1(signature.toByteArray());
            Log.i(TAG, "got this SHA1 of the signature ... "+sha1);
            // check if it matches hardcoded value
            sigMatch = APP_SIGNATURE.equals(sha1);
            if (sigMatch){
                return sigMatch;  
            }
        }
    } catch (Exception e) {
            e.printStackTrace();
        }

    return false;
}

只是我们不知道如何在现实世界中做到这一点。当我们使用 OTA 构建、安装应用程序或发布时,我们使用我们的私钥对这些应用程序进行签名,然后在设备(PackageInstaller 应用程序)上,我们将证书的 SHA1 签名硬编码为 APP_SIGNATURE 以便我们可以比较?还有其他想法吗?

非常感谢。

【问题讨论】:

  • “因为 whitelisted_apps.txt 可以被操纵”。它不会除非设备被黑客入侵。如果它被黑客入侵,则不再保证任何限制。无论如何,签名检查比静态应用程序列表要好得多。假设您的签名在 20 年或更长时间内保持不变,硬编码是可以的。将公共签名列为可更新文件可能会更好。
  • 谢谢。 whitelisted_apps.txt 当前位于 assets 文件夹中。它可能必须移动到另一个位置,因为其他应用程序/服务也需要访问(读取和写入)它,以便我们可以更新列表。所以我认为我们不能确保它太多。无论如何,我们将探索签名方法以及 Gabe Sechan 在下面的答案中建议的方法,看看哪种方法最适合我们。

标签: android digital-signature android-source


【解决方案1】:

似乎您正在努力部分关闭侧载。使用设备所有者完全关闭安装,只需预加载您想要的应用程序。或者让唯一可以安装的应用是您自己的下载器,它只查看您的服务器。

【讨论】:

  • 嗨,Gabe,感谢您的建议。我们担心如果我们关闭安装,可能会影响我们的 OTA 更新。此外,在我们将设备交付给客户后,列入白名单的应用程序会随着时间的推移而变化(我们可能会删除当前的应用程序并安装新的应用程序)。无论如何,我会查看您建议的解决方案(我不是 Android 开发人员)并会询问我是否还有其他问题。再次感谢。
  • 更有理由这样做。您基本上需要编写自己的更新服务和流利的,并且您想选择我们所有的安装,而不是通过那个应用程序
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多