android 为什么需要签名

2023-05-16

 所有的Android应用程序都要求开发人员用一个证书进行数字签名,anroid系统不会安装没有进行签名的由于程序。
    平时我们的程序可以在模拟器上安装并运行,是因为在应用程序开发期间,由于是以Debug面试进行编译的,因此ADT根据会自动用默认的密钥和证书来进行签名,而在以发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名。
    给apk签名可以带来以下好处:
    1. 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
    2.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
    3.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。
    不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。

    怎样签名呢?用java自带的keytool和jarsigner工具。
1. 通过以下命令可以获取证书和私钥:keytool -genkey -v -keystore doumiw.keystore -alias doumiw -keyalg RSA -validity 10000
2. 通过以下命令可以对apk签名:jarsigner -verbose -keystore doumiw.keystore doumiw.apk doumiw

 

 

 

一下是android 签名的转载:

http://ijavagos.iteye.com/blog/1057666

 

1. 为什么要签名

1) 发送者的身份认证
由于开发商可能通过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换

2) 保证信息传输的完整性
签名对于包中的每个文件进行处理,以此确保包中内容不被替换

3) 防止交易中的抵赖发生, Market 对软件的要求

2. 签名的说明

1) 所有的应用程序都必须有数字证书, Android 系统不会安装一个没有数字证书的应用程序

2) Android 程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证

3) 如果要正式发布一个 Android 应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用 adt 插件或者 ant 工具生成的调试证书来发布

4) 数字证书都是有有效期的, Android 只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能

5) 签名后需使用 zipalign 优化程序

6) Android 将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序

3. 签名的方法



4. 签名的相关文件


1) apk 包中签名相关的文件在 META_INF 目录下
CERT.SF
:生成每个文件相对的密钥
MANIFEST.MF
:数字签名信息
xxx.SF
:这是 JAR 文件的签名文件,占位符 xxx 标识了签名者
xxx.DSA
:对输出文件的签名和公钥

2) 相关源码
development/tools/jarutils/src/com.anroid.jarutils/SignedJarBuilder.java
frameworks/base/services/java/com/android/server/PackageManagerService.java
frameworks/base/core/java/android/content/pm/PackageManager.java
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
dalvik/libcore/security/src/main/java/java/security/Sign*
build/target/product/security/platform.*
build/tools/signapk/*



5. 签名的相关问题

一般在安装时提示出错: INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

1) 两个应用,名字相同,签名不同

2) 升级时前一版本签名,后一版本没签名

3) 升级时前一版本为 DEBUG 签名,后一个为自定义签名

4) 升级时前一版本为 Android 源码中的签名,后一个为 DEBUG 签名或自定义签名

5) 安装未签名的程序

6) 安装升级已过有效期的程序



6. 相关工具



7. 参考
http://developer.android.com/guide/publishing/app-signing.html
http://www.pgcw.com.cn/Newsdetail.asp?id=257565010
http://www.eoeandroid.com/thread-23010-1-1.html
http://pepa.javaeye.com/blog/250991

1) 查看某个 x509 证书的的有效日期
SignApk.java 中打印出 publicKey.getNotAfter() 即可

a) 使用源码中的默认签名
在源码中编译一般都使用默认签名的,在某源码目录中用运行
$ mm showcommands
能看到签名命令
Android
提供了签名的程序 signapk.jar ,用法如下:
$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
*.x509.pem
x509 格式公钥, pk8 为私钥
build/target/product/security
目录中有四组默认签名可选: testkey, platform, shared, media (具体见 README.txt ),应用程序中 Android.mk 中有一个 LOCAL_CERTIFICATE 字段,由它指定用哪个 key 签名,未指定的默认用 testkey.

b) 在源码中自签名
Android
提供了一个脚本 mkkey.sh build/target/product/security/mkkey.sh ),用于生成密钥,生成后在应用程序中通过 Android.mk 中的 LOCAL_CERTIFICATE 字段指名用哪个签名

c) mkkey.sh 介绍

i. 生成公钥
openssl genrsa -3 -out testkey.pem 2048
其中 -3 是算法的参数, 2048 是密钥长度, testkey.pem 是输出的文件

ii. 转成 x509 格式(含作者有效期等)
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com

iii. 生成私钥
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式转换成 PKCS #8 ,这里指定了 -nocryp ,表示不加密,所以签名时不用输入密码


 

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

android 为什么需要签名 的相关文章

随机推荐

  • ChatGPT 有哪些 “激动人心的时刻“?以及自己的一些思考

    文章目录 一 前言二 主要内容三 一些思考 x1f349 CSDN 叶庭云 xff1a https yetingyun blog csdn net 一 前言 近日 xff0c 英伟达创始人兼 CEO 黄仁勋与 OpenAI 联合创始人及首席
  • Codeforces Round #201 (Div. 2) E - Number Transformation II

    题意 xff1a 给你一个数组xi和两个数a和b xff0c 求通过两个途径由a到b的最小次数 xff0c 1 当前的a减去1 xff0c 2 当前的a减去a xi 思路 xff1a 首先考虑xi有重复元素 xff0c 所以去重 xff0c
  • 用好 ChatGPT | Prompt 编写模式:如何将思维框架赋予机器

    文章目录 一 前言二 主要内容三 总结 x1f349 CSDN 叶庭云 xff1a https yetingyun blog csdn net 一 前言 人类相对于其他动物更擅长于类比 概念抽象 符号化等高级认知活动 xff0c 这些认知活
  • 倡议书:关于暂停「巨型 AI」 实验的一封公开信

    本文是 futureoflife 公开信 xff0c 原文地址 https futureoflife org open letter pause giant ai experiments 目前已经有 1127 1127 1127 名 AI
  • 学习笔记 | Meta AI:分割一切的 SAM 模型

    文章目录 一 前言 二 主要内容 1 惊艳的效果 2 方法介绍 3 未来展望 三 解决方案关键 四 代码实践 五 讨论 一 前言 Meta AI 博客 Introducing Segment Anything Working toward
  • GPT-4 验明真身的三个经典问题:快速区分 GPT-3.5 与 GPT-4

    现在已经有很多 ChatGPT 的套壳网站 xff0c 以下分享验明 GPT 4 真身的三个经典问题 xff0c 帮助你快速区分套壳网站背后到底用的是 GPT 3 5 还是 GPT 4 测试问题 1 xff1a What is tomorr
  • 解决 Microsoft Edge Dev 版本中右上角的 bing 按钮消失的问题 让 New Bing 还能阅读分析文档!

    Microsoft Edge Dev 右上角的必应图标消失了 xff0c 使得无法用 New Bing 阅读分析文档 xff0c 到底什么原因呢 xff1f 针对 Microsoft Edge Dev 版本中右上角的发现按钮消失的问题 xf
  • OpenStack网络指南(7)防火墙即服务(Firewall-as-a-service)

    Firewall as a Service xff08 FWaaS xff09 插件将防火墙应用于OpenStack对象 xff0c 如项目 xff0c 路由器和路由器端口 OpenStack防火墙的核心概念是防火墙策略和防火墙规则的概念
  • OpenStack网络指南(14)DNS集成

    此页面作为如何使用网络服务的DNS集成功能的指南 描述的功能从两个角度涵盖DNS xff1a 网络服务提供的内部DNS功能及其与Compute服务的交互 将计算服务和网络服务与外部DNSaaS xff08 DNS即服务 xff09 集成 用
  • 2022年,立个Flag

    2021年在平静的生活中 xff0c 慢慢的从手指缝中划过 xff0c 新的一年已经都来 xff0c 我也立下几个flag xff0c 待明年末来验收 2022年我希望自己可以开始并坚持做一些事 xff1a 1 实现自己定义的目标 xff0
  • 零开始学习OpenWrt完美教程

    http zhidx com p 186 html 从零开始学习OpenWrt完美教程 Cisco Linksys在2003年发布了WRT54G这款无线路由器 xff0c 同年有人发现它的IOS是基于Linux的 xff0c 然而Linux
  • Sublime Text3使用总结

    写在前面的话 xff1a 平时做项目中在用eclipse和vs xff0c 但是对于一些小项目 xff0c 感觉没有必要搞那么大的一个工具使用 xff0c 比如写个小微商城 xff0c 搞个小脚本了什么 xff0c 所以就一直在用Subli
  • Gym 101028J 100541D

    Gym 100499I 这题当理解题意的时候就出现一个难题 xff0c 循环小数怎么转化为分数 xff0c 果断百度下 普及知识 xff1a 1 纯循环小数 小数点后有几位数 分母就有几个9 分子为一个循环节 如 0 345 345循环 6
  • Wayland与Weston简介

    xfeff xfeff 简单地说 xff0c Wayland是一套display server Wayland compositor 与client间的通信协议 xff0c 而Weston是Wayland compositor的参考实现 其
  • 什么是IaaS,PaaS和SaaS及其区别

    云计算的三种服务模式 xff1a IaaS xff0c PaaS和SaaS Infrastructure xff08 基础设施 xff09 as a Service xff0c Platform xff08 平台 xff09 as a Se
  • Backup for tire

  • 用QXDM获取log的方法说明

    用 QXDM 获取 log 的方法说明 对于获取 LOG 可能我们会有一些误解 测试人员害怕得到的 LOG 信息不全 而将所有的选项都选上 希望能够得到最全的 LOG 其实不然 受到手机及手机与 PC 的通讯限制 如果选择保存所有的 LOG
  • Python环境变量PYTHONPATH设置和easy_install简单使用

    1 把自己编写的 python模块添加到 PYTHONPATH上 要想让 python解释器找到自己编写的模块 xff0c 则该模块必须 PYTHONPATH上 xff0c 否则在导入该模块时会出现找不到该模块的错误 xff0c 因此必须把
  • 超级有用的git reset --hard和git revert命令

    很多时候 xff0c git新手容易误操作 xff0c 比如 xff0c 在levelIISZ 1 4 dev分支下 xff0c 运行了git pull idc cpp 1 0的结果 xff0c 这样做麻烦很大 xff0c 经常导致mave
  • android 为什么需要签名

    所有的Android应用程序都要求开发人员用一个证书进行数字签名 xff0c anroid系统不会安装没有进行签名的由于程序 平时我们的程序可以在模拟器上安装并运行 xff0c 是因为在应用程序开发期间 xff0c 由于是以Debug面试进