Android Basis - 密钥和ID认证

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

遇到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) throwsDeviceIdAttestationException {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.rhkb.cn/news/397349.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权

身份验证 身份认证是大多数应用程序的重要组成部分&#xff0c;有很多不同的方法和策略来处理身份认证。 当前比较流程的是JWT 认证&#xff0c;也叫令牌认证&#xff0c;今天我们探讨一下在 Nest.js 中如何实现。 认证流程 客户端将首先使用用户名和密码进行身份认证认证成…

Sql与Rce注入相关漏洞复现

目录 sqli-labs注入第38&#xff0c;48关 第38关&#xff08;单引号闭合&#xff09; ​编辑 第48关 (GET请求-基于错误-盲注-数字型-order by 排序 ​编辑 贷齐乐系统多处Sql注入漏洞 环境搭建 将贷齐乐源码放入phpstudy中的www目录下 在phpstudy上创建网站&#xff1…

ESP8266与阿里云物联网平台连接

前言 最近折腾项目&#xff0c;需要用到ESP8266模块对接阿里云物联网平台&#xff0c;网上感觉十分完善的教程少了一点点&#xff0c;比较折腾我哈哈哈&#xff0c;所以打算自己写一篇。 材料准备 1、ESP8266 WiFi模块 数据线 网上随便买一个就好&#xff0c;十块钱左右一个…

C# winform 三层架构增删改查,(删除篇)

一.留言 C# wnform 三层架构增删改查&#xff0c;本篇是增删改查是删除篇&#xff0c;也就增删改查外加一个登录更新完&#xff0c;后续考虑出一个增删改查就是不用三层架构&#xff0c;在uI里面 直接写完&#xff0c;并且放一个帮助类&#xff0c;基本十分钟可以写完一套增删…

数据保存--总结

目录 Excel Excel--openpyxl mysql Excel Excel--openpyxl ... mysql

快速幂、矩阵快速幂

乘法快速幂&#xff1a; P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import ja…

【C#】一个项目移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF,解决方法

文章目录 1 问题分析2 本文解决方法 一个项目可以正常运行编译的项目&#xff0c;所有路径均为相对路径。 移动了位置&#xff0c;或者换到其他电脑上&#xff0c;编译报错 Files 的值“IGEF&#xff0c; 1 问题分析 这个错误信息表明在处理文件时&#xff0c;Files 的值出…

(限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!

目录 haproxy七层代理详解一、负载均衡1.1 什么是负载均衡1.2 为什么使用负载均衡1.3 负载均衡类型1.3.1 硬件负载1.3.2 四层负载1.3.3 七层负载1.3.4 四层与七层的区别 二、haproxy介绍2.1 haproxy简介2.2 haproxy特性 三、haproxy详细部署3.1 实验所用的环境3.2 软件安装3.3 …

C语言 | Leetcode C语言题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; int minPatches(int* nums, int numsSize, int n) {int patches 0;long long x 1;int index 0;while (x < n) {if (index < numsSize && nums[index] < x) {x nums[index];index;} else {x << 1;patches;}}retu…

【HarmonyOS NEXT星河版开发学习】小型测试案例06-小红书卡片

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;自适应伸缩是指应用程序能够根据不同设备的屏幕尺寸、分辨率和形态&…

气象大数据案例项目(求各气象站的平均气温)

气象大数据案例项目&#xff08;求各气象站的平均气温&#xff09; 一、项目需求二、数据格式三、项目开发3.1 在windows 进行开发3.2 运行结果3.3 对项目打包 一、项目需求 现在有一份来自美国国家海洋和大气管理局的数据集&#xff0c;里面包含近30年每个气象站、每小时的天…

WSL2 最新最全帮助小白一步步详细安装教程

文章目录 一、前言1.1、什么是 WSL &#xff1f;1.2、WSL2 相比传统虚拟机的优势1.3、微软官方 二、安装步骤*2.1、启用 WSL 功能2.2、重启电脑2.3、dos命令自动安装 (一行命令搞定&#xff0c;非常方便)2.3.1、通过 cmd 打开 dos 命令行 或者 WIN键 R&#xff1a;2.3.2、输入…

探案录 | 在线打补丁,运维更轻松

清晨&#xff0c;曙光温柔地洒落在福尔摩斯K那标志性的书房内&#xff0c;福尔摩斯K坐在他那张熟悉的扶手椅上&#xff0c;眼神锐利如鹰&#xff0c;正沉浸在思考的海洋中。门突然被推开&#xff0c;华生K带着一丝急切步入室内。 “福尔摩斯K&#xff0c;这次案件非同小可&…

如何在线观看汤姆克鲁斯、比莉艾利什、红辣椒乐队、HER等明星的奥运闭幕式

2024 年巴黎奥运会将以一系列众星云集的表演者为结尾&#xff0c;他们将帮助将奥运会移交给洛杉矶——以下是在线直播盛大决赛的时间和地点。 经过两周多令人惊叹的田径运动、激烈的比赛和表情包活动后&#xff0c;2024 年巴黎奥运会即将落下帷幕。 奥运会闭幕式将于 8 月 12 …

【C++】 特殊类设计:从构思到实现,引领设计新潮流

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 &#x1f680; 前言 一&#xff1a; &#x1f525; 不能被拷贝的类 二&#xff1a; &#x1f525; 只能在堆上创建对象的类 三&#xff1a; &#x1f525; 只能在栈上创建对象的…

uniapp使用echarts在H5上显示报错问题的解决方法

前言 在做uniapp vue3开发的echarts图表的时候&#xff0c;发现在浏览器上面正常运行&#xff0c;但在微信开发者工具上显示报错了&#xff0c;报错如下 原因&#xff1a;在微信小程序中&#xff0c;使用document.getElementById会报错&#xff0c;因为小程序的运行环境是基于…

目前最强的文生图模型?!FLUX完全解读!附体验地址

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

css rem之2024

话题开始前 我们都知道1rem是等于html fontSize标签的字体大小的&#xff0c;我们主要用来做移动端网页设计稿等比例在手机上面的显示。 看到的问题 这个html fontsize的大小是通过js动态计算的&#xff0c;而这个js的运行时晚于html渲染的&#xff0c;所以会导致一个问题&am…

python网络爬虫使用代理

Python网络爬虫使用代理的实用指南 在网络爬虫的开发过程中&#xff0c;使用代理是一个非常重要的环节。代理不仅可以帮助爬虫绕过反爬虫机制&#xff0c;还能保护开发者的隐私。本文将介绍如何在Python中使用代理进行网络爬虫&#xff0c;包括基本的设置和示例代码。 1. 代理…

WordPress多用途电子商务博客新闻主题betheme 21.5.6版本

简介&#xff1a; WordPress多用途电子商务博客新闻主题betheme 21.5.6版本 自带500多套模板 BeTheme第一次发布于2014年5月21日&#xff0c;自那时以来&#xff0c;已有数以百万计的人下载了BeTheme&#xff0c;其评分为4.8。 这个主题是WooCommerce支持的&#xff0c;在此…