WrappedKeyEntry 要求的ASN.1 der格式
借助 Android 9(API 级别 28)及更高版本,您能够利用 ASN.1 编码密钥格式将已加密密钥安全导入密钥库。Keymaster 随后会在密钥库中将密钥解密,因此密钥的内容永远不会以明文形式出现在设备的主机内存中。此过程提高了密钥解密的安全性。
注意:只有搭载 Keymaster 4 或更高版本的设备才支持该功能。
如需支持以安全方式将已加密密钥导入密钥库,请完成以下步骤:
生成目的为 PURPOSE_WRAP_KEY 的密钥对。建议也为该密钥对添加认证。
在您信任的服务器或机器上,生成 SecureKeyWrapper 应包含的 ASN.1 消息。
该封装容器包含以下架构:
KeyDescription ::= SEQUENCE {
keyFormat INTEGER,
authorizationList AuthorizationList
}
SecureKeyWrapper ::= SEQUENCE {
wrapperFormatVersion INTEGER,
encryptedTransportKey OCTET_STRING,
initializationVector OCTET_STRING,
keyDescription KeyDescription,
secureKey OCTET_STRING,
tag OCTET_STRING
}
创建 WrappedKeyEntry 对象,传入字节数组形式的 ASN.1 消息。
将该 WrappedKeyEntry 对象传入接受 Keystore.Entry 对象的 setEntry() 的重载。
以上是密钥导入的步骤。
本文主要分析其中KeyDescription对于格式的要求,以供大家参考。
asn.1
这个格式参见百度。就是一种编码规范。简单理解就是type-length-value的模式。
KeyDescription
SEQUENCE 这个是asn.1的标示,是一个数据结构类型,有标准定义的,先不管他。
keyFormat INTEGER
这个keyFormat是一个枚举类型,不在上层Java,是在keymaster里面定义的。我目前找到的是keymaster 3.0里面的定义:
enum KeyFormat : uint32_t {
X509 = 0, /** for public key export */
PKCS8 = 1, /** for asymmetric key pair import */
RAW = 3, /* for symmetric key import and export*/
};
这里可以看到,对称密钥是3,非对称密钥是2,0是x509的公钥证书格式。这里应该是标注后面使用的密钥的格式。
authorizationList AuthorizationList
这个类型有点复杂,官方文档有描述的:这里需要注意下,根据keymaster不同的版本,格式有点不一样,有三个版本。
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL,
allApplications [600] EXPLICIT NULL OPTIONAL,
applicationId [601] EXPLICIT OCTET_STRING OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
}
具体参见文档:authorizationlist
里面的有一些枚举也是是在keymaster里面定义的,不是所有人都下载了源码,所以这里我直接贴出来。
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package

介绍如何使用ASN.1 DER格式安全地将加密密钥导入Android Keymaster,包括所需密钥格式、授权列表等细节。
最低0.47元/天 解锁文章
1014

被折叠的 条评论
为什么被折叠?



