Android 秘钥库系统

利用 Android 密钥库系统,您可以在容器中存储加密密钥,从而提高从设备中提取密钥的难度。在密钥进入密钥库后,可以将它们用于加密操作,而密钥材料仍不可导出。此外,它提供了密钥使用的时间和方式限制措施,例如要求进行用户身份验证才能使用密钥,或者限制为只能在某些加密模式中使用。

安全功能

Android 密钥库系统可以保护密钥材料免遭未经授权的使用。首先,Android 密钥库可以防止从应用进程和 Android 设备中整体提取密钥材料,从而避免了在 Android 设备之外以未经授权的方式使用密钥材料。其次,Android 密钥库可以让应用指定密钥的授权使用方式,并在应用进程之外强制实施这些限制,从而避免了在 Android 设备上以未经授权的方式使用密钥材料。

提取防范

Android 密钥库密钥使用两项安全措施来避免密钥材料被提取:

        ·密钥材料永不进入应用进程。通过 Android 密钥库密钥执行加密操作时,应用会将待签署或验证的明文、密文和消息馈送到执行加密操作的系统进程。如果应用进程受攻击,攻击者也许能使用应用密钥,但无法提取密钥材料(例如,在 Android 设备以外使用)。

         ·您可以将密钥材料绑定至 Android 设备的安全硬件,例如可信执行环境 (TEE) 和安全元素 (SE)。为密钥启用此功能时,其密钥材料永远不会暴露于安全硬件之外。如果 Android 操作系统受到攻击或者攻击者可以读取设备内部存储空间,攻击者也许能在 Android 设备上使用应用的 Android 密钥库,但无法从设备上提取这些数据。只有设备的安全硬件支持密钥算法、区块模式、填充方案和密钥有权使用的摘要的特定组合时,才可启用此功能。要检查是否为密钥启用了此功能,请获取密钥的 KeyInfo 并检查 KeyInfo.isInsideSecurityHardware() 的返回值。

秘钥使用授权

为了避免在 Android 设备上以未经授权的方式使用密钥材料,在生成或导入密钥时 Android 密钥库会让应用指定密钥的授权使用方式。一旦生成或导入密钥,其授权将无法更改。然后,每次使用密钥时,都会由 Android 密钥库强制执行授权。这是一项高级安全功能,通常仅用于有以下要求的情形:在生成/导入密钥后(而不是之前或当中),应用进程受到攻击不会导致密钥以未经授权的方式使用。

支持的密钥使用授权可归为以下几个类别:

             ·加密:授权密钥算法、运算或目的(加密、解密、签署、验证)、填充方案、区块模式以及可与密钥搭配使用的摘要;

             ·时间有效性间隔:密钥获得使用授权的时间间隔;

             ·用户身份验证:密钥只能在用户最近进行身份验证时使用。

作为一项额外的安全措施,对于密钥材料位于安全硬件内部的密钥。某些密钥使用授权可能由安全硬件实施,具体取决于 Android 设备。加密和用户身份验证授权可能由安全硬件实施。由于安全硬件一般不具备独立的安全实时时钟,时间有效性间隔授权不可能由其实施。

硬件安全区检测

private boolean isInsideSecurityHardware(Stringalias){        try {KeyStoreks =KeyStore.getInstance("AndroidKeyStore");            ks.load(null);PrivateKeykey = (PrivateKey) ks.getKey(alias,null);KeyFactoryfactory =KeyFactory.getInstance(key.getAlgorithm(),"AndroidKeyStore");KeyInfokeyInfo = factory.getKeySpec(key,KeyInfo.class);if(keyInfo.isInsideSecureHardware()) {returntrue;            }        }catch (Exceptione){returnfalse;        }returnfalse;    }

检查秘钥材料是否存在

private boolean checkKeyStore(Stringalias) {        try {KeyStoreks =KeyStore.getInstance("AndroidKeyStore");            ks.load(null);KeyStore.Entryentry = ks.getEntry(alias, null);if(!(entry instanceofKeyStore.PrivateKeyEntry)) {Log.w(TAG,"Not an instance of a PrivateKeyEntry");returnfalse;            }        }catch (Exceptione) {returnfalse;        }return tr}

Google 提供的API在23以上是比较丰富的,android安全层级上了一个大台阶。小伙伴们可以研究下,物联网下安全是一个绕不过去的门槛。

原文地址 

更多相关文章

  1. 如何检索Android设备的唯一ID
  2. Android(安卓)6.0权限处理问题
  3. Android中使用static变量
  4. Android几种常见 自定义Button样式
  5. Android(安卓)React Native使用原生模块
  6. Android中广播的使用
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. MySQL工作常用命令
  2. 自动化测试用例失败继续执行
  3. 干货--MySQL工作常用Select命令
  4. Playbook分发Nginx配置文件
  5. 软件测试和开发比例
  6. 自学软件测试 - 自动化测试篇
  7. Mysql二进制日志binlog命令
  8. ansible条件判断和循环
  9. 2021-03-12:go中,如何确定有没有内存泄露,系
  10. 自学软件测试 - 功能测试篇