检查Android文件系统是否加密。

6
我们正在开发安卓上的安全应用程序。用户需要加密他们设备的文件系统,但我们需要检查这个事实并禁止使用应用程序。有没有可能检查文件系统是否已经加密?另外,一些Android版本低于3.0的设备也支持加密,例如Motorola RAZR。了解这些设备的加密情况也很有意义。
3个回答

15

只是为了澄清CommonsWare的回答,你可以 阅读 设备加密状态而不需要任何Android权限。

/**
 * Returns the encryption status of the device. Prior to Honeycomb, whole device encryption was
 * not supported by Android, and this method returns ENCRYPTION_STATUS_UNSUPPORTED.
 *
 * @return One of the following constants from DevicePolicyManager:
 * ENCRYPTION_STATUS_UNSUPPORTED, ENCRYPTION_STATUS_INACTIVE,
 * ENCRYPTION_STATUS_ACTIVATING, ENCRYPTION_STATUS_ACTIVE,
 * ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY, ENCRYPTION_STATUS_ACTIVE_PER_USER.
 */
@TargetApi(11)
private static int getDeviceEncryptionStatus(Context context)
{
    int status = DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;

    if (Build.VERSION.SDK_INT >= 11) {
        final DevicePolicyManager dpm =
                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
        if (dpm != null) {
            status = dpm.getStorageEncryptionStatus();
        }
    }

    return status;
}

请查看DevicePolicyManager文档加密状态标志

值得一提的是,为了支持直接引导等功能,Android已经从全盘加密转向了基于文件的加密。请参阅基于文件的加密


1
这段代码似乎在我的2013年款Nexus 7上无法运行。在这种情况下,即使我已经采取了加密设备的步骤,dpm.getStorageEncryptionStatus()仍然返回ENCRYPTION_STATUS_INACTIVE。 - Patrick Brennan

9
如果您的应用程序已注册为设备管理员,则可以在API Level 11及更高版本上调用DevicePolicyManager上的getStorageEncryptionStatus()来查找设备的加密状态。
对于低级别API上的任何整个设备加密,请联系设备制造商。

有没有办法确定加密是软件还是硬件基础的?至少在Android 5.1中。 - Artem Russakovskii
@ArtemRussakovskii:我不知道,抱歉。 - CommonsWare
@ArtemRussakovskii 请查看此链接:http://developer.android.com/reference/android/security/KeyChain.html#isBoundKeyAlgorithm(java.lang.String) - alfongj

5
为了澄清之前的回答,对于API < 23,当设备已经加密但未启用密码时,getStorageEncryptionStatus()返回ENCRYPTION_STATUS_INACTIVE
而在API >= 23的情况下,这种情况下它将返回ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY

1
如果未定义启动设备的PIN,则在三星设备(例如Android 6上的S7)上不会返回ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY。 - David

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