Android Basis - 密钥和ID认证

news2024/9/19 10:19:26

书读百遍其义自现,知识点多复习,看到的越多,理解的也越是深刻。也许此时我看到的点是点,十天半个月之后回头看时可能就是新的点或者线了,写博客也是,越写越深刻。

遇到KeyAttestation在gms中的错误

在cts中有一个针对keystore模块的测试项目,错误项开始,截图如下:

为什么会有这部分的错误呢? 如果设备没有从Google申请过Attestation keybox并且安装到设备中的话,cts中这部分的keystore的测试项都会失败。cts测试不过,说明设备目前运行的os状态不满足Android的CDD要求。 

那什么是Google Attestation keybox 

出身

Attestation Keybox

作用

它为应用程序开发者提供了一种使用加密密钥进行加密和验证的方法;Keystore将密钥保留在应用程序的进程空间之外,保证密钥不会因为程序被破坏或者其它渠道被泄密。另外,需要加密设备还为设备中的密钥库密钥提供了基于硬件的安全性保障,将密钥材料完全保留在Android系统之外,即使Liux内核泄漏也不会泄漏密钥材料。

部署

Attestation Key在Android7开始被添加,Android8及后面的版本开始强要求,需要平台(例如,高通、联发科)拥有硬件支持的keystore。GMS认证中的cts/keystore 模块会进行测试。

包含Attestation key的文件又称作为Attestation Keybox,需要从Google进行申请(申请前需要提供设备的具体信息:fingerprint:branch/device/product:xxx)。 Google会将Attestation keybox文件加密之后回传给设备制造商。设备制造商拿到加密后的文件解密后得到attestation_key_xxxx.xml 文件,attestation_key_xxxx.xml具体格式请参考和部署步骤和命令请参考:Android Basis - Google Keybox-CSDN博客

三种算法

DSA,ECDSA,RSA;

Digital Signature Algorithm -> 是一种数字签名算法,是NIST(美国的一个机构)于1991年制定的数字签名规范,只能被用于数字签名。

Elliptic Curve DSA -> 是一种利用椭圆曲线密码来实现的数字签名算法。

RSA-> 是一种公钥密码算法,由三位开发者的名字的首字母组成。RSA可以被用于公钥密码和数字签名。

RSA使用步骤

生产密钥对、加密、解密;

问题

1. 什么是数字签名?

数字签名相当于现实世界中的盖章、签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。

数字签名通常有两种方法,直接对密文进行签名,或者是对密文的散列值进行签名。显然,通常搜我们使用后者。

2. 什么是.pem 格式?

pem格式的RSA、DSA或ECDSA私钥文件通常不包含公钥。PEM(Privacy-Enhanced Mail)是一种常见的文件格式,用于存储加密的私钥和证书(从Attestation Keybox文件可以看出)。在PEM格式中,私钥和公钥可以分别存储在不同的文件中,也可以将它们合并到同一个文件中。

私钥文件通常以"-----BEGIN PRIVATE KEY-----"开头,以"-----END PRIVATE KEY-----"结尾。它包含了用于加密和解密数据的关键信息。

公钥文件通常以"-----BEGIN PUBLIC KEY-----"开头,以"-----END PUBLIC KEY-----"结尾。它包含了用于验证签名和加密数据的关键信息。

3. 什么是证书?

举个例子,要开车就得先考驾照,驾照上有本人的照片、姓名、联系方式、有效期等等,并由公安机关盖章。我们只要看到驾照,就可以知道公安局认定此人具有驾驶车辆的资格。

公钥证书:public-key certificate certificate. 里面有姓名、组织、邮箱以及此人公钥,并由认证机构施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也称之为证书

4.Attestation Keybox中私钥和证书的作用

现在回想一下keybox中的私钥和证书的作用。密钥用来解密被公钥加过密的数据,而证书以及证书中的公钥可以用于鉴权和加密数据。

CTS中keystore的错误分析

android.cts.keystore.KeyAttestationTest#testDeviceIdAttestation

在没有看源码之前,可以大胆猜测一下,这里的CTS测试项中testDeviceIdAttestation就是去读取系统中的证书,并发送给google来确认设备是否是google授权的设备。

另外,可以猜测cts能够提取出证书中包含的公钥,并判断公钥和私钥的具体关系。以上是大胆猜测,下面便是小心验证猜测

secp256r1

secp256r1是一种用于加密的椭圆曲线(‌Elliptic Curve Digital Signature Algorithm, ECDSA)‌密钥对生成算法,‌也被称为NIST P-256曲线。‌它是一种公钥密码学算法,‌用于生成数字签名和公钥加密。‌ECDSA是一种基于椭圆曲线密码学的数字签名算法,‌而secp256r1是ECDSA算法中常用的一种曲线参数。‌这种算法和曲线参数被广泛用于各种加密和安全通信协议中,‌包括但不限于比特币等加密货币的交易验证

disgest

在密码学中,‌digest(‌摘要)‌是一个将数据(‌如文件、‌消息等)‌经过哈希运算后得到的结果。Digest在密码学中的应用非常广泛,‌特别是在区块链技术中,‌它用于确保区块数据的完整性和不可篡改性。此外,‌digest与加密的区别在于加密是将数据转换为只有拥有密钥的人才能解密的形式,‌而digest是通过哈希函数将数据转换为固定长度的摘要,‌用于验证数据的完整性和真实性。

ID_TYPE_IMEI

ID_TYPE_IMEI通常是指设备标识类型,它代表的是国际移动设备身份码(IMEI)。在某些上下文中,如物联网、身份验证或安全系统中,IMEI可能是用于证明设备真实性和唯一性的关键信息。当涉及到Attestation(证书绑定或证明服务)时,ID_TYPE_IMEI可能会被用于生成基于硬件特征(如IMEI)的可信度证明,即证明该设备确实拥有特定的IMEI,并且其状态未被篡改。这种类型的attribution常常出现在需要硬件绑定的场景,比如手机设备管理或防伪应用。

代码理解

/**
     * Performs attestation of the device's identifiers. This method returns a certificate chain
     * whose first element contains the requested device identifiers in an extension. The device's
     * manufacturer, model, brand, device and product are always also included in the attestation.
     * If the device supports attestation in secure hardware, the chain will be rooted at a
     * trustworthy CA key. Otherwise, the chain will be rooted at an untrusted certificate. See
     * <a href="https://developer.android.com/training/articles/security-key-attestation.html">
     * Key Attestation</a> for the format of the certificate extension.
     * <p>
     * Attestation will only be successful when all of the following are true:
     * 1) The device has been set up to support device identifier attestation at the factory.
     * 2) The user has not permanently disabled device identifier attestation.
     * 3) You have permission to access the device identifiers you are requesting attestation for.
     * <p>
     * For privacy reasons, you cannot distinguish between (1) and (2). If attestation is
     * unsuccessful, the device may not support it in general or the user may have permanently
     * disabled it.
     *
     * @param context the context to use for retrieving device identifiers.
     * @param idTypes the types of device identifiers to attest.
     * @param attestationChallenge a blob to include in the certificate alongside the device
     * identifiers.
     *
     * @return a certificate chain containing the requested device identifiers in the first element
     *
     * @exception SecurityException if you are not permitted to obtain an attestation of the
     * device's identifiers.
     * @exception DeviceIdAttestationException if the attestation operation fails.
     */
    @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
    @NonNull public static X509Certificate[] attestDeviceIds(Context context,
            @NonNull int[] idTypes, @NonNull byte[] attestationChallenge) throws
            DeviceIdAttestationException {
        if (attestationChallenge == null) {
            throw new NullPointerException("Missing attestation challenge");
        }
        if (idTypes == null) {
            throw new NullPointerException("Missing id types");
        }

        String keystoreAlias = generateRandomAlias();
        KeyGenParameterSpec.Builder builder =
                new KeyGenParameterSpec.Builder(keystoreAlias, KeyProperties.PURPOSE_SIGN)
                        .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
                        .setDigests(KeyProperties.DIGEST_SHA256)
                        .setAttestationChallenge(attestationChallenge);

        if (idTypes != null) {
            builder.setAttestationIds(idTypes);
            builder.setDevicePropertiesAttestationIncluded(true);
        }

        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
            keyPairGenerator.initialize(builder.build());
            keyPairGenerator.generateKeyPair();

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);

            Certificate[] certs = keyStore.getCertificateChain(keystoreAlias);
            X509Certificate[] certificateChain =
                Arrays.copyOf(certs, certs.length, X509Certificate[].class);

            keyStore.deleteEntry(keystoreAlias);

            return certificateChain;
        } catch (SecurityException e) {
            throw e;
        } catch (Exception e) {
            // If a DeviceIdAttestationException was previously wrapped with some other type,
            // let's throw the original exception instead of wrapping it yet again.
            if (e.getCause() instanceof DeviceIdAttestationException) {
                throw (DeviceIdAttestationException) e.getCause();
            }
            // Illegal argument errors are wrapped up by a ProviderException. Catch those so that
            // we can unwrap them into a more meaningful exception type for the caller.
            if (e instanceof ProviderException
                    && e.getCause() instanceof IllegalArgumentException) {
                throw (IllegalArgumentException) e.getCause();
            }
            throw new DeviceIdAttestationException("Unable to perform attestation", e);
        }
    }

加密相关的内容看起来比较费劲,从代码注释上能够看出,测试case从设备中获取证书,并将证书中的相关信息返回。那么证书中有哪些信息呢?在申请attestation keybox时候,我提供了设备的fingerprint,而fingerprint中包含了manufacture/prodcut/device 等等信息        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EVAL长度突破限制

目录 突破15位限制 代码 绕过方式 第一种&#xff08;使用echo执行&#xff09; 第二种&#xff08;使用file_get_content追加文件后进行问件包含&#xff09; 第三种&#xff08;使用usort可变长参数&#xff09; 突破7位限制 第一种&#xff08;可以使用>创建文件…

whistle非常好用的抓包工具

文档&#xff1a; https://wproxy.org/whistle/install.html 总结 这个工具的界面非常好理解&#xff0c;易于使用。 前端开发过程中&#xff0c;经常需要抓包看数据&#xff0c;mock请求数据&#xff0c;mock响应数据&#xff0c;代理线上资源等 这个工具统统可以满足 一、…

【C++二分查找 贪心】792. 匹配子序列的单词数

本文涉及的基础知识点 C二分查找 贪心 LeetCode792. 匹配子序列的单词数 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其…

基于PCA-BP的数据多变量回归预测 Matlab代码(多输入单输出)[可显示原始特征贡献率+贡献率排序+累计贡献率]

基于PCA-BP的数据多变量回归预测 Matlab代码&#xff08;多输入单输出&#xff09;[可显示原始特征贡献率] 1.首先通过主成分分析PCA将数据进行降维&#xff0c;会显示原始特征对应的贡献率(不是贡献率排序&#xff0c;不会让你对应不到对应特征)&#xff0c;选取要求为累计贡…

RAG 系列之二:PDF 文件的解析

在 RAG&#xff08;检索增强生成&#xff09;简介的流程图中&#xff0c;有一个环节是检索向量数据库&#xff08;下图中红色框标识的部分&#xff09;。向量数据库存储了外部知识库经过向量化处理的内容。在检索之前&#xff0c;我们首先需要创建向量数据库&#xff0c;而创建…

虚拟化—XenServer安装教程详细(附客户端连接)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

积鼎 VirtualFlow 案例|高精度工程雾化模型,优化离心旋流喷嘴雾化效果

雾化喷嘴已广泛渗透于航空航天、车辆工程、医药制造、精密生产、食品加工、环境保护以及现代农业等众多工业领域&#xff0c;成为提升各行业生产效率与性能的关键工具。因此&#xff0c;雾化喷嘴的仿真技术显得尤为重要&#xff0c;通过准确模拟喷嘴的雾化过程&#xff0c;帮助…

idea项目注册在nacos错误:Cannot determine local hostname

一开始想把项目注册在nacos上&#xff0c;启动报错是这样的&#xff0c;而且yml文件也不生效&#xff0c;因为默认端口是8080&#xff0c;我在yml文件中写了8081没用&#xff0c;正好nacos的配置也在yml文件中。各种百度&#xff0c;各种依赖添加删除&#xff0c;反复启动没用 …

Redis7-分布式锁

目录 基本原理 分布式锁的实现 基于Redis的分布式锁 Redis分布式锁误删 分布式锁的原子性问题 基于Redis的分布式锁优化 Redission概述 Redisson入门 Redisson可重入锁原理 ​编辑 Reddisson锁重试和WatchDog机制 Redisson分布式锁原理 Redission的MultiLock原理 …

《江南:在爱开始的地方等你》定档9月15日,愿有情人终成眷属

由康锐原创小说《月落姑苏》改编&#xff0c;并由康锐导演、编剧&#xff0c;赖雨濛、刘冬沁领衔主演、朱丹妮、王沛为、金巧巧、阎青妤、李菁菁、苇青等共同主演的电影《江南&#xff1a;在爱开始的地方等你》官宣定档中秋。 影片讲述了陆骁&#xff08;刘冬沁饰&#xff09;…

Excel VBA批量获取文件夹内文件名及重命名文件教程

在本文中&#xff0c;我们将介绍如何使用Excel VBA宏来批量获取文件夹内的文件名&#xff0c;并将其输出到Excel单元格区域。此外&#xff0c;我们还将展示如何根据Excel中的列表批量重命名这些文件。 一、批量获取文件夹内文件名 首先&#xff0c;我们需要编写一个VBA宏来列出…

【《Kafka 入门指南:从零基础到精通》】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索KAFKA&#xff0c;本篇文章主要讲述了&#xff1a;消息队列的基础知识&#xff0c;KAFKA消息队列等等。欢迎大家一起探索讨论&#xff01;&#xff01;&#x…

用7EPhone云手机进行TikTok的矩阵运营

“根据市局机构Statista发布的报告显示&#xff0c;截至2024年4月&#xff0c;TikTok全球下载量超过49.2亿次&#xff0c;月度活跃用户数超过15.82亿。TikTok的流量受欢迎程度可想而知&#xff0c;也一跃成为了全球第五大最受欢迎的社交APP。” 人群密集的地方社区也是适合推广…

《pygame游戏开发实战指南》第八节 Sprite类和Group类

Sprite(精灵)是游戏中一个非常重要的概念。在游戏开发中&#xff0c;‌Sprite指的是一个可以移动、‌旋转或变换的二维图像&#xff0c;‌它负责管理游戏中的图像元素&#xff0c;‌使得开发者可以轻松地在游戏中创建各种动态效果和角色。‌pygame.sprite模块提供了Sprite类和G…

分类预测|基于鲸鱼优化-卷积-长短期记忆网络-注意力数据分类预测Matlab程序 WOA-CNN-LSTM-Attention

分类预测|基于鲸鱼优化-卷积-长短期记忆网络-注意力数据分类预测Matlab程序 WOA-CNN-LSTM-Attention 文章目录 前言分类预测|基于鲸鱼优化-卷积-长短期记忆网络-注意力数据分类预测Matlab程序 WOA-CNN-LSTM-Attention 一、WOA-CNN-LSTM-Attention模型1. 鲸鱼优化算法&#xff0…

产品经理的具体职责有哪些?

产品经理作为产品团队的核心角色&#xff0c;负责从概念到市场发布的整个过程&#xff0c;确保产品能够满足用户需求&#xff0c;实现商业目标。其工作职责广泛且深入&#xff0c;涵盖了产品规划、设计、开发、运营、推广等多个方面。以下是详细的工作职责描述以及产品经理的核…

一文彻底搞懂Transformer - 注意力机制

Transformer 一、注意力机制 Seq2Seq 注意力机制目标 Attention模块的主要作用是确定在给定上下文中哪些嵌入向量与当前任务最相关&#xff0c;并据此更新或调整这些嵌入向量的表示。 Transformer注意力机制 注意力机制案例 注意力机制计算公式 生成Q、K、V向量&#xff1a;对…

智能升降晾衣架:NRK3301语音识别模块ic让家务变得更轻松

对于经常做家务的人来说&#xff0c;洗衣服和晾衣服是一件非常耗费体力和时间的任务。传统的晾衣架安装在了一个固定的高度&#xff0c;挂衣服和取衣服需要通过撑衣杆来晾取衣物&#xff0c;即便是电动升降的晾衣架&#xff0c;也需要人手动去操作&#xff0c;增加了工作量。然…

Vue 项目中导入文件时如何默认找寻该文件夹下的 index.vue 文件

文章目录 需求分析 需求 如下图&#xff0c;在Vue 项目中导入 frequencyChange 文件夹时如何默认找寻该文件夹下的 index.vue 文件 分析 确保项目结构和命名约定 首先&#xff0c;确保你的 Vue 单文件组件按照约定命名&#xff0c;例如&#xff1a; components/Example/inde…

Python酷库之旅-第三方库Pandas(080)

目录 一、用法精讲 331、pandas.Series.str.repeat方法 331-1、语法 331-2、参数 331-3、功能 331-4、返回值 331-5、说明 331-6、用法 331-6-1、数据准备 331-6-2、代码示例 331-6-3、结果输出 332、pandas.Series.str.replace方法 332-1、语法 332-2、参数 33…