Android Keystore System介绍

  • Post author:
  • Post category:其他


翻译 sdk/docs/training/articles/keystore.html?q=keystore#q=keystore

KeyStore

KeyStore负责维护加密密钥及其所有者。

可以通过修改JAVA_HOME/lib/security/java.security文件的’keystore.type’属性更改系统密钥库的类型。

Android Keystore系统允许您将密钥存储在容器中,这将使从设备中提取密钥变得更加困难。 一旦密钥存储在密钥库中,它们就可以用于加密操作,这将使用不可导出的密钥材料。

此外,它还提供了一些设施来限制何时和如何使用密钥,例如要求用户对密钥使用进行身份验证,或限制密钥仅在某些加密模式下使用。




密钥系统有KeyChain API,以及Android 4.3(API级别18)中引入的Android Keystore provider使用。 本文将介绍何时以及如何使用Android Keystore provider。

Security Features

安全功能

Android Keystore系统阻止密钥材料被未经授权去使用。 首先,Android Keystore通过阻止从应用程序进程和整个Android设备中提取密钥材料,从而减少未经授权、在Android设备以外使用密钥材料。

其次,Android KeyStore通过让应用程序指定其密钥的授权使用,然后在应用程序的进程之外实施这些限制,从而减少在Android设备上未经授权的使用密钥材料。

Extraction Prevention

预防提取

使用两种安全措施来防止Android Keystore的密钥的密钥材料被提取:

密钥材料不会进入应用程序进程。当应用程序使用Android Keystore密钥执行加密操作时,幕后明文,密文以及要签名或验证的消息都将被传送到执行加密操作的系统进程。

如果应用程序的进程受到攻击,攻击者可能能够使用应用程序的密钥,但无法提取其密钥材料(例如,要在Android设备之外使用)。

密钥材料可以绑定到Android设备的安全硬件(例如,可信执行环境(TEE),安全元件(SE))。当为密钥启用此功能时,其密钥材料绝不会暴露在安全硬件之外。

如果Android操作系统遭到入侵或攻击者可以读取设备的内部存储设备,攻击者可能能够使用Android设备上的任何应用的Android密钥存储库密钥,但不能从设备中提取它们。

只有当设备的安全硬件支持密钥算法,块模式,padding方案和密钥授权使用的摘要的特定组合时,才能启用此功能。要检查是否为某个密钥Key启用了该功能,请获取该密钥

key的KeyInfo并检查KeyInfo.isInsideSecurityHardware()的返回值。

Key Use Authorizations

密钥使用授权

为了减少未经授权使用Android设备上的密钥,Android Keystore允许应用程序在生成或导入密钥时指定其密钥的授权使用。一旦生成或导入密钥,其授权无法更改。

无论何时使用密钥,授权都由Android密钥库强制执行。这是一种高级安全功能,只有您妥协应用程序过程时的要求 在密钥生成/导入后(但不在此之前或期间),这不会导致

未经授权使用密钥的情况下,它才是有用的。

受支持的密钥使用授权分为以下几类:

密码学:授权密钥算法,操作或目的(加密,解密,签名,验证),填充方案,块模式,使用密钥的摘要;

时间有效性间隔:密钥被授权使用的时间间隔;

用户身份验证:只有当用户最近已通过身份验证时才能使用该密钥。请参阅Requiring User Authentication For Key Use。

作为附加的安全措施,对于其密钥材料位于安全硬件内的密钥(请参阅KeyInfo.isInsideSecurityHardware()),某些密钥使用授权可能会由安全硬件实施,具体取决于Android设备。

加密和用户身份验证授权可能会由安全硬件执行。时间有效性间隔授权不太可能由安全硬件执行,因为它通常没有独立的安全实时时钟。

可以使用KeyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware()来查询密钥的用户认证授权是否由安全硬件执行。

Choosing Between a Keychain or the Android Keystore Provider

选择钥匙串还是Android Keystore Provider

当您需要系统范围的证书时可以使用KeyChain API。 当应用程序通过KeyChain API请求使用任何证书时,用户可以通过系统UI来选择应用程序可以访问那些已安装的证书。

这允许多个应用程序在用户同意的情况下使用相同的证书集。

使用Android Keystore Provider让单个应用程序存储自己的证书,只有应用程序本身才能访问它。 这为应用程序提供了一种管理仅可由其自身使用的证书的方式,

于此同时提供了KeyChain API为系统级证书提供的相同安全优势。 该方法不需要用户交互来选择凭证。

Using Android Keystore Provider

使用Android密钥库提供者

要使用此功能,您需要使用标准的KeyStore和KeyPairGenerator 或 KeyGenerator类以及Android 4.3(API级别18)中引入的AndroidKeyStore Provider。

AndroidKeyStore被注册为一种KeyStore类型,用于KeyStore.getInstance(type)方法以及与KeyPairGenerator.getInstance(algorithm,provider)和KeyGenerator.getInstance(algorithm,provider)。

生成一个新的私钥

生成一个新的PrivateKey要求您指定自签名证书将具有的初始X.509属性。 您可以稍后用证书颁发机构签署的证书替换该证书。

要生成此密钥,请使用带KeyPairGeneratorSpec的KeyPairGenerator:

/*
 * Generate a new EC key pair entry in the Android Keystore by
 * using the KeyPairGenerator API. The private key can only be
 * used for signing or verification and only with SHA-256 or
 * SHA-512 as the message digest.(摘要)
 */
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
       KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
        .setDigests(KeyProperties.DIGEST_SHA256,
            KeyProperties.DIGEST_SHA512)
        .build());

KeyPair kp = kpg.generateKeyPair();

Generating a New Secret Key

生成一个新的密钥

To generate the key, use a KeyGenerator with KeyGenParameterSpec.

要生成此密钥,请使用带KeyGenParameterSpec的KeyGenerator;

Working with Keystore Entries

使用Keystore Entries

Using the AndroidKeyStore provider takes place through all the standard KeyStore APIs.

通过所有标准KeyStore API来使用AndroidKeyStore Provider。

Listing Entries

枚举所有条目

List entries in the keystore by calling the aliases() method:

/*
 * Load the Android KeyStore instance using the the
 * "AndroidKeyStore" provider to list out what entries are
 * currently stored.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
Enumeration<String> aliases = ks.aliases();

Signing and Verifying Data

签名和验签数据

Sign data by fetching the KeyStore.Entry from the keystore and using the Signature APIs, such as sign():

通过获取该keystore中的该KeyStore.Entry,并通过使用签名API,比如sign()来签名。

/*
 * Use a PrivateKey in the KeyStore to create a signature over
 * some data.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (!(entry instanceof PrivateKeyEntry)) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry");
    return null;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(((PrivateKeyEntry) entry).getPrivateKey());
s.update(data);
byte[] signature = s.sign();

Similarly, verify data with the verify(byte[]) method:

相似的,使用verify(byte[])验签数据:

/*
 * Verify a signature previously made by a PrivateKey in our
 * KeyStore. This uses the X.509 certificate attached to our
 * private key in the KeyStore to validate a previously
 * generated signature.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (!(entry instanceof PrivateKeyEntry)) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry");
    return false;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initVerify(((PrivateKeyEntry) entry).getCertificate());
s.update(data);
boolean valid = s.verify(signature);

要求用户对密钥使用进行身份验证

当生成密钥或将密钥导入到AndroidKeyStore中时,您可以指定密钥只有在用户已通过身份验证时才有权使用。

用户使用其安全锁定屏幕凭证(图形/PIN/密码,指纹)的一种进行身份验证。

这是一种高级安全功能,通常只有您的需求不能绕过用户通过身份验证使用密钥的要求时才有用。

这是在密钥生成/导入后(但不是在此之前或期间)您的应用程序进程的一种妥协。

只有在用户已通过身份验证时才有权使用密钥,以下两种模式之一将会被配置运行:

用户身份验证授权在有效期内使用密钥。在此模式下, 一旦解锁了安全锁定屏幕或使用

KeyguardManager.createConfirmDeviceCredentialIntent流程确认其安全锁定屏幕凭证后,所有的密钥被授权使用。

对于每个密钥,它的授权有效期是特定的,正如在密钥生成或导入过程中使用

setUserAuthenticationValidityDurationSeconds所指定的那样。

只有安全锁定屏幕可用时才能生成或导入此类密钥(请参阅KeyguardManager.isDeviceSecure())。一旦安全锁定屏

幕被禁用(重新配置为无,刷机或其他不支持认证用户的模式)或强制重置(例如由设备管理员)时,这些密钥永久失效。

用户身份验证授权一个特定的与密钥关联的加密操作。在这种模式下,涉及该密钥的每项操作都必须由用户单独授权。

目前,这种授权的唯一手段是指纹认证:FingerprintManager.authenticate。只有当至少一个指纹被注册时,才能生成

或导入此类密钥(请参阅FingerprintManager.hasEnrolledFingerprints)。一旦有新的指纹注册或所有指纹注销,

这些密钥将永久失效。

Supported Algorithms

Cipher

KeyGenerator

KeyFactory

KeyPairGenerator

Mac

Signature

SecretKeyFactory

版权声明:本文为博主原创文章,未经博主允许不得转载;来自https://blog.csdn.net/milanac007/article/details/79759186



版权声明:本文为milanac007原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。