关于 Android WrappedKeyEntry 要求的asn.1格式简析

介绍如何使用ASN.1 DER格式安全地将加密密钥导入Android Keymaster,包括所需密钥格式、授权列表等细节。

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 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值