Android中的签名机制

安卓为啥要加签名机制 安卓签名机制的技术难点主要体现在确保应用程序的完整性和安全性上。首先,签名机制需要确保APK文件在发布后被篡改的可能性降到最低。其次,签名机制还需要确保应用程序的唯一性和来源的可追溯性,以防止应用程序被仿冒或滥用。这个示例展示了如何使用私钥对APK文件进行签名,并将签名和公钥证书写入APK文件的META-INF目录。请注意,这个示例仅用于说明签名机制的实现过程,并不包含完整的签名和验证逻辑。在探讨安卓为何需要加入签名机制时,我们需要从技术难点、面试官关注点、回答吸引力以及代码举例等多个维度进行详细的解析。 阅读详情
Android中签名用的Key的产生方法和签名的原理。

产生Key

产生RSA私钥(private key)
openssl genrsa -3 -out testkey.pem 2048
-3 是算法的参数(public exponent)。
2048 是私钥长度。
testkey.pem 是输出的文件。


产生PKCS#10格式的认证请求。所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人邮件地址)。
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’


如果不提供最后两个参数,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。如


openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:GuangDong
Locality Name (eg, city) [Newbury]:ShenZhen
Organization Name (eg, company) [My Company Ltd]:Topwise
Organizational Unit Name (eg, section) []:Broncho
Common Name (eg, your name or your server’s hostname) []:broncho.cn
Email Address []:bronchosales@gmail.com


把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)

openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt

私钥是不能让别人知道的,否则就起不到保密的作用了。私钥通常是要加密保存的,但这里指定了-nocryp,表示不加密

Android提供了一个脚本mkkey.sh用来简化上面的步骤:

if ["$1" == ""]; then
    echo "Create a test certificate key."
    echo "Usage: $0 NAME"
    echo "Will generate NAME.pk8 and NAME.x509.pem"
    echo "  /C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com"
    return
fi
 
openssl genrsa -3 -out $1.pem 2048
 
openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 /
    -subj '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 
openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -nocrypt


签名

Android提供了为jar/zip文件签名的程序signapk.jar 。

它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

第一个参数是公钥,即前面第二步产生的testkey.x509.pem。
第二个参数是私钥,即前面第三步产生的testkey.pk8。
第三个参数是要签名的文件。
第四个参数是输出的文件(即签名后的文件)。


如: java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update-signed.zip

现在我们来看看签名到底做了些什么:

 先为输入的jar/zip文件中的所有文件生成SHA1数字签名(除了CERT.RSA,CERT.SF和MANIFEST.MF)

      
 for (JarEntry entry: byName.values()) {
            String name = entry.getName();
            if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
                !name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&
                (stripPattern == null ||
                 !stripPattern.matcher(name).matches())) {
                InputStream data = jar.getInputStream(entry);
                while ((num = data.read(buffer)) > 0) {
                    md.update(buffer, 0, num);
                }
 
                Attributes attr = null;
                if (input != null) attr = input.getAttributes(name);
                attr = attr != null ? new Attributes(attr) : new Attributes();
                attr.putValue("SHA1-Digest", base64.encode(md.digest()));
                output.getEntries().put(name, attr);
            }
        }



并把数字签名信息写入MANIFEST.MF

     
 je = new JarEntry(JarFile.MANIFEST_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            manifest.write(outputJar);

     

对manifest签名并写入CERT.SF

           
// CERT.SF
            Signature signature = Signature.getInstance("SHA1withRSA");
            signature.initSign(privateKey);
            je = new JarEntry(CERT_SF_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            writeSignatureFile(manifest,
            new SignatureOutputStream(outputJar, signature));



把对输出文件的签名和公钥写入CERT.RSA。


            // CERT.RSA
            je = new JarEntry(CERT_RSA_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            writeSignatureBlock(signature, publicKey, outputJar);



签名的作用

签名的主要目的为了检测文件是否被别人修改了。但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。

http://blog.csdn.net/absurd/article/details/5002763

testkey.pk8 testkey.x509.pem 生成系统签名 windows 立即下载

相关推荐

Android的APK程序签名和重新签名的方法

签名工具的使用 Android源码编译出来的signapk.jar既可给apk签名,也可给rom签名的。使用格式: java –jar signapk.jar [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar -w 是指对ROM签名时需使用的参数 publickey.x509[.pem] 是公钥文件 privatekey.pk8 是指 私钥文件 input.jar 要签名的apk或者rom output.jar 签名后生成的apk或者rom signapk.java 1) main函数 main

Android签名总结

一、为什么要签名        开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。         由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换。        APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖

tangmin0719的专栏 5896

keystore转x509pem工具

在使用signapk工具签名时,是需要 x509.pem + pk8格式的证书,它是一个公私钥分开存放的格式,在电脑上生成的证书一般是以 keystore格式存放的,有时在证书签发机构申请的证书也是 keystore格式的。这时用signapk工具进行签名时,需要把 keystore格式的文件转化为 x509.pem + pk8的格式来进行使用。本工具比起openssl工具集来说,转化快速有效,只要一条命令就可以解决问题,几毫秒转化完成,使用openssl需要三条命令才可以完成,并且中间还有人为打开文本文件的方式,进行选择,非常麻烦,并且转化速度需要好几秒。 命令示例:java -jar ks2x509.jar xyz.keystore myAlias password

Apk 系统签名

随着物联网与人工智能的发展,越来越多需要开发一些应用集成到系统中,这些应用往往回需要获取系统的相关使用权限,因此需要对应的需要进行申明权限。 Apk系统签名一般的提供了两种签名方式jarsign和signapk。jarsign方式是就是通常的keystore方式,signapk 通常指使用系统的plateform.pk8 和 plateform.x509.pem(公钥+私钥)方式。 一、....

laipigui905的博客 928

Android签名机制简介

签名机制Android系统相对于Linux独有的安全机制,本文将对该机制做详细介绍。 一、介绍 Android签名机制主要用在以下两个场合:App更新包的校验和申请手机权限时的权限检查。 1. 更新包的校验 用户在升级一款已经安装过的App时,如果程序的修改来自于同一来源,则允许升级安装,否则会提示签名不一致无法安装的提示。 2. 权限检查 对于申请权限的 protection l...

weixin_30263073的博客 242

【转】android签名机制,【转】Android签名机制

Android签名机制可划分为两部分:(1)ROM签名机制;(2)第三方APK签名机制Android APK实际上是一个jar包,而jar包又是一个zip包。APK包的签名实际上使用的是jar包的签名机制:在zip中添加一个META的子目录,其中存放签名信息;而签名方法是为zip包中的每个文件计算其HASH值,得到签名文件(*.sf),然后对签名文件(.sf)进行签名并把签名保存在签名块文件(*...

weixin_35726635的博客 213

android 画图签名,【Android安卓签名机制

图1 DF_SDM_1008.zip文件1. META-INF\ (注:签名后的信息);2. res\ (注:存放资源文件的目录) ;3. AndroidManifest.xml (注:程序全局配置文件) ;4. classes.dex (注:Dalvik字节码);5. resources.arsc (注:编译后的二进制资源文件)。接下来针对META-INF\文件进行分析。3.3META-INF\...

weixin_39660931的博客 359

Android签名机制

Android签名机制可划分为两部分:(1)ROM签名机制;(2)第三方APK签名机制Android APK实际上是一个jar包,而jar包又是一个zip包。APK包的签名实际上使用的是jar包的签名机制:在zip中添加一个META的子目录,其中存放签名信息;而签名方法是为zip包中的每个文件计算其HASH值,得到签名文件(*.sf),然后对签名文件(.sf)进行签名并把签名保存在签名

edisonlg的专栏 3003

android签名机制

android签名机制     发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制Android应用和框架中有着十分重要的作用。例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证APK签名与Framework签名一致,等等。在《APK Crack》一文中,我们了解到,要破解一个APK,必然需要重新对AP

prettyice的专栏 4460

安卓应用签名机制分析

Android 应用签名是应用打包过程的重要步骤之一,Google 要求所有的应用必须被签名才可以安装到 Android 操作系统中。Android签名机制也为开发者识别和更新自己应用提供了方便。本文尝试对 Android 应用签名机制进行简单分析,个人理解有限,难免有纰漏之处,请多多拍砖。 背景知识 想要搞清楚安卓应用签名到底是什么东西,首先需要了解一些背景知识。 数字摘要 Digital ...

weixin_33949359的博客 710

安卓签名机制浅析

提纲 初步了解:是什么,为什么需要,有什么好处,怎么加密和验证,怎么使用,要点补充 签名方案:v1,v2,v3签名及校验流程,版本缺陷 初步了解Android签名机制 Android应用程序的签名(是什么) - 在Android 系统中,所有安装到系统的应用程序都必有一个数字证书,要求每一个安装进系统的应用程序都是经过数字证书签名的,此数字证书用于标识应用程序的...

WHHGARSKY的博客 1409

深入探索Android签名机制:从v1到v3的演进之旅

消息摘要(Message Digest)是一种通过单向散列算法对任意长度的数据进行计算并产生固定长度的小型摘要信息(又称哈希值或指纹)的技术。(1)、消息摘要主要特点压缩性:无论输入的数据有多大,计算出来的消息摘要的长度都是固定的,通常为128位或更长。易计算:给定需要计算摘要的数据,非常容易计算出消息摘要。隐行性:相同的输入必定得到相同的输出,但反过来,由输出极其困难推导出输入值。抗碰撞:理论上不可能找到两个不同的输入计算出相同的消息摘要。常见的消息摘要算法有:MD5、SHA-1、SHA-256等。

w风雨无阻w的专栏 3429

Android 7.0新签名机制

由于之前的打包机制是采用Python进行打包的,导致打包后的apk在7.0上无法进行安装,特此研究下android7.0的签名机制Android7.0加强了签名的加固,导致在新的签名机制下无法使用修改apk文件的方式进行多渠道打包,首先再说一下打包的流程,整个打包的流程就是将Java代码,资源文件以及第三方库整合成一个Apk文件,并对整合后的文件进行签名和优化对其。 1.资源预编译 为每一个非a

2609
上一篇: Android APK 签名比对
下一篇: 花样Android ProgressBar 史上最强大讲解/定制ProgressBar
只是纸老虎
博客等级 码龄18年 55粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值