Android 的应用程序/签名验证如何工作?

2023-11-23

我想用两件事作为这个问题的序言,这样我就可以缩小我的实际问题范围:

a) 我以前做过软件开发,但从未针对 Android

b) 我熟悉 PKI、加密、散列和数字签名等等等等

话虽这么说,我无法找到有关 Android 在何处以及如何验证应用程序创建者的更多信息。我听过很多不同的信息,因此我正在尝试综合以更好地了解工作流程。

我知道每个应用程序开发人员都有自己的私钥/公钥对,他们通过对 APK 进行哈希处理(如果我没记错的话,大多数时候使用 SHA-1)来签署他们的应用程序,就这样。您上传它,(我相信)公钥会进入 APK 内的 META INF 中。我就明白这么多了。

我的问题是这与用户下载应用程序本身有何关系。我知道手机会检查以确保应用程序已有效签名,并且签名还包含有关作者等的信息。但我也读到,应用程序是自签名的,Google Play(或者他们现在所说的市场)没有实现 CA,并且没有身份验证?但我的问题是,什么可以阻止人们以另一个开发者的名义上传应用程序(除了众包)?

如果手机仅检查有效签名是否意味着唯一的身份验证方法是在上传应用程序时完成的?如果是这种情况,应用市场如何检查?是不是像往常一样——使用存档的私钥并验证签名?或者开发者是否必须向市场提供他们的私钥来进行身份验证?


简而言之,Android 和 Google Play 本质上并不关心实际证书中的内容。 Google Play 确实会验证它,并检查它是否在 30 年或更长时间内有效,但他们并没有真正使用(至少目前,据我所知)证书中的实际信息。您可以在 CN 中使用您自己的名称/公司名称,但没有人会验证这一点,并且用户根本不会看到此信息。 Android 所做的是:

  • 检查签名以确保 APK 未被篡改
  • 然后对比歌唱证书作为二进制 blob应用程序当前安装的版本之一,以确保这两个版本已使用相同的密钥/证书进行签名(例如,由同一个人/公司)
  • 如果您在两个或多个应用程序中使用共享 Uid 或签名权限,它会执行相同的操作来强制执行权限。

因此,为了回答你的问题,有人可以轻松创建一个带有你名字的证书,但 Android 和 Google Play 并不关心。只要他们没有您的私钥,他们就无法生成与您的私钥相同的应用程序签名,因此他们无法用他们的私钥覆盖/更新您的应用程序,或获得任何特殊权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 的应用程序/签名验证如何工作? 的相关文章

  • Android 30+ 中的视频捕获意图 - 只有所有者才能与待处理项目交互

    我正在尝试在我的应用程序上捕获视频 它可以在 android API 30 以下运行 但不能在 30 以上运行 似乎在 sdk 30 之后 android 不允许完全读取外部存储 作用域存储 我目前遇到这个错误 java lang Ille
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • Adobe 是否为其 PDF 阅读器提供 Android SDK 或 API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在我们的应用程序内的视图中显示本地 PDF 文件 在 Android 4 03 下的平板电脑上运行 目前 我们将 Adob eR
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 我必须使用什么加密程序来通过 HTTP 协议发送加密的“电子邮件”和“密码”值?

    我正在使用 Ruby on Rails 3 我想通过 HTTP 协议发送 电子邮件 和 密码 值 我知道 我不应该 但我需要 我需要从发送用户凭据我的客户申请到一个我的服务应用 我可以使用公共和私人RSA密钥来实现这一点 但如果是这样 我不
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来

随机推荐

  • Angular 2:类型错误:l_thing0 在 AppComponent@4:44 中的 [{{thing.title}} 中未定义

    我的应用程序中出现奇怪的错误 应该打印出来 thing title 来自对象 但它在控制台中显示错误 EXCEPTION TypeError l thing0 is undefined in thing title in AppCompon
  • 设置 TCP_NODELAY 是否会影响套接字两端的行为?

    我一直假设 Nagle 的算法在两个方向上影响套接字 并且该设置TCP NODELAY以某种方式通知远程端也关闭 Nagle 是这样吗 还是设置TCP NODELAY只影响调用端的行为吗 TCP NODELAY仅影响在其套接字上设置此选项的
  • 从一行字符串列表构建 SQL“where in”语句?

    我有一个 List Of String 它对应于我们数据库表上的 类型 我们正在使用 DB2 ADO NET 提供程序 我的最终查询需要如下所示 select from table where type in type1 type2 typ
  • 如何在 Google Chrome 扩展程序中生成可供下载的文件?

    我想生成一个 CSV 文件作为一些用户交互的结果 然后提示用户下载它 我怎样才能做到这一点 我不认为这在直接的 JS 中是可能的 但也许 Chrome 给了我一些更高的权限 您现在可以使用 HTML5File API下载文件 它仍在开发中
  • MySQL 连接表,其中表名是另一个表的字段

    我有5张桌子 1 个主要的和 4 个附加的 它们有不同的列 objects obj 手机 对象平板电脑 对象计算机 这是我的主表 对象 的结构 身份证 类型 名称 ETC 所以我想做的是将对象与其他 obj mobiles obj tabl
  • 防止僵尸.js 仅加载外部资源

    我在测试期间使用 Zombie js 从本地 Express 服务器加载页面 不幸的是 有一个脚本元素调用了 Google Analytics 如果可能的话 我想 优雅地 阻止此外部脚本而不阻止其他 本地 脚本加载 我知道 runScrip
  • 用于字符串元素的 JdbcTemplate IN 子句

    我正在使用NamedParameterJdbcTemplatefor where 子句元素和其中之一似乎是List
  • JQuery Mobile 检测到是否有互联网连接

    通过网络应用程序检测我的手机是否有互联网连接的最佳方法是什么 不需要为此编写任何代码 它是 HTML5 API 的一部分 检查值window navigator onLine 这将是false如果用户离线 http www whatwg o
  • 在Python中将字符串中的数字与单位分开

    我有包含数字及其单位的字符串 例如2GB 17 英尺等 我想将数字与单位分开并创建 2 个不同的字符串 有时 它们之间有空格 例如 2 GB 使用 split 很容易做到这一点 当它们在一起时 例如 2GB 我会测试每个字符 直到找到字母而
  • 如何(优雅地)确定 C# winforms 应用程序中是否需要代理身份验证

    我的用例是这样的 我想调用一个网络服务 如果我位于需要身份验证的代理服务器后面 我只想使用默认凭据 WebRequest DefaultWebProxy Credentials CredentialCache DefaultCredenti
  • 如何设置 JScrollPane 仅显示特定数量的行

    我只需要一个表来显示 3 行 这些行从数据库中获取前 3 个畅销产品 表已准备就绪 但表的很大一部分实际上是空的 除了 3 行之外 如何设置此滚动窗格的高度以匹配 3 行的高度 解决方案 table setPreferredScrollab
  • 如何将 ICS 会议自动添加到组织者的日历中?

    我们的 java 应用程序使用 ical4j 生成 ICalendar 文件 并将它们作为 HTML 电子邮件通知的一部分发送给用户 一些用户 会议的组织者 报告说 会议的 接受 拒绝 等按钮呈灰色且无法单击 该会议不会添加到组织者的日历中
  • 如何使用 YouTube API 获取视频时长? [复制]

    这个问题在这里已经有答案了 我想获取 Youtube 视频的时长 这是我尝试过的代码 vidID voNEBqRZmBc http www youtube com watch v voNEBqRZmBc url http gdata you
  • 来自 Google 的 ExpandableListView 示例

    我刚刚尝试了当前的 Google 示例ExpandableListiew 这个示例看起来非常简单且易于使用 但我想做的是说其中一个类别没有子级 我删除了所有子项 但问题是箭头仍然出现在当前行上 例如 假设我删除了所有 猫的名字 箭头仍然在那
  • 当 JOptionPane 窃取焦点时,JButton 保持按下状态

    我是 Swing 新手 我遇到了一个情况 我正在设计一个基于 xml 文件输入 元数据 动态呈现 GUI 组件的应用程序 现在 我的大多数 JTextFields 都设置了 InputVerifier 用于验证目的 每当存在无效输入时 输入
  • 如何以编程方式关闭/隐藏 Android 软键盘?

    我有一个EditText and a Button在我的布局中 在编辑字段中写入后 单击Button 我想在触摸键盘之外时隐藏虚拟键盘 我认为这是一段简单的代码 但是在哪里可以找到它的示例 您可以使用以下命令强制 Android 隐藏虚拟键
  • 如何在视频js中创建自定义按钮

    我想在视频 js 中创建自定义按钮 我已经尝试了很多事情 并且在应用时进行了大量搜索 但没有找到结果 我认为我的代码中有一些错误 我已成功在视频 js 上设置我的播放器 这是我的代码 我正在尝试添加自定义按钮
  • 用户图像 - 数据库与文件系统存储[重复]

    这个问题在这里已经有答案了 我正在 NET 中编写一个上传函数 用于在用户个人资料上显示图像 我正在两种不同的方式之间进行选择 并想就利弊征求建议和意见 将图像直接存储在文件系统上 将图像存储在数据库中 到目前为止 我主要支持第一个选项 以
  • 检查向量是否包含另一个向量

    我想检查向量是否y包含另一个向量x y lt c 0 0 0 NA NA 0 x lt c 0 0 0 0 在这种情况下 它应该给我FALSE因为里面不存在四个NULL的序列y 但如果我们看一下向量y2 结果应该是TRUE y2 lt c
  • Android 的应用程序/签名验证如何工作?

    我想用两件事作为这个问题的序言 这样我就可以缩小我的实际问题范围 a 我以前做过软件开发 但从未针对 Android b 我熟悉 PKI 加密 散列和数字签名等等等等 话虽这么说 我无法找到有关 Android 在何处以及如何验证应用程序创