‘壹’ 如何判断 android 应用的 Apk 签名是否一致
在程序中获取APK的签名时,通过signature方轮慎法进行获取,如卜散下:
packageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES);
signatures = packageInfo.signatures;
for (Signature signature : signatures) {
builder.append(signature.toCharsString());
}
signature = builder.toString();
所以一般的程序就是在代码中通过判型桐氏断signature的值,来判断APK是否被重新打包过。
‘贰’ 如何对android的apk签名进行验证
方法/步骤
1
菜单菜单键,键入cmd命令进入命令模式。如图:
2
命令模式中,进入JDK的安装目录的Bin子目录下。(我的JDK安装在E盘,所以先进入E盘,然后再进入JDK安装目录)
3
通过keytool.exe 工具来创建keystore库.
输入以下命令:
keytool -genkeypair -alias - mydemo.keystore -keyalg RSA -validity 100
-keystore mydemo.keystore
命令说明如下:
-genkeypair :指定生成数字证实
-alias :指定生成数字证书的别名
-keyalg:指定生成数字证书的算法 这里如RSA算法
-validity:指定生成数字证书的有效期
-keystore :指定生成数字证书的存储路径。 (这里默认在keytool.exe 目录下)
回车 出现如图交互式界面 输入数字证书费密码 作者 公司等详细信息
如图 :
4
完成后,keystore库创建完成,你可以在指定的保存目录下找到 如图:
5
使用jarsigner命令对未签名的APK安装包进行签名。使用JDK安装目录下bin子目录下的jarsigner.exe工具来进行签名。
然后把未签名的apk也拷贝到此目录。如图:
6
使用如下命令进行签名:
jarsigner -verbose -keystore mydemo.keystore -signedjar
-Note.apk Notes.apk mydemo.keystore
以上命令的说明:
-verbose:指定生成详细输出
-keystore:指定数字证书存储路径
-signedjar:该选项的三个参数为 签名后的apk包 未签名的apk包 数字证书别名
注意有效期哦。
7
签名后的apk 如图:
8
sdk目录下tool目录下使用zipalign.exe工具优化APK安装包。
将已经签名的apk包放在zipalign.exe同目录下 如图:
9
使用如下命令:
zipalign -f -v 4 -Note.apk -Notes.apk
命令说明:
-f :指定强制覆盖已有文件
-v 指定生成详细输出
4:指定档案整理基于的字节数 一般是4 也有基于32位的。
-Note.apk :优化前APK
-Notes.apk 优化后的APK
10
运行命令后,在该目录下生成一个-Notes.apk,这个就是优化过的APK安装包
,该安装包可以对外发布。
如图:
如果能对你有帮助,希望你能收藏和支持。
http://jingyan..com/article/3c48dd3491d91fe10be358f4.html
‘叁’ apk签名是什么意思
apk是安卓应用软件包,apk签名是软件包在安装的时候进行的安全性验证机制。
这种签名机制目的是为了确保Apk来源的真实性,以及Apk没有被第三方篡改。开发者通过对Apk进行签名:在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。
(3)android验证apk签名扩展阅读:
1、APK的格式定义
在Android平台中,dalvikvm的执行文件被打包为apk格式,最终运行时加载器会解压,然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下,会发现执行是不受限制的。安装的文件可能不是这个文件夹,而在androidrom中,系统的apk文件默认会放入这个文件夹,它们拥有着root权限。
2、APK的开发环境
Android是一个基于java的开发环境,Google也在API文档的书写和样例的提供上做了很出色的工作。
3、获取SDK
下载并安装android的SDK[软件开发套件],这套SDK主要包括有核心库文件,一个模拟器,开发工具和一些示范的样例文件。推荐使用Eclipse 和androideclipse 扩展。如果只是使用android,Eclipse IDE就已经足够了,但如果是第一次开发Java应用,建议下载完整的Java SE 开发工具 (JDK) 因为它包括签发应用程序所需要的工具。
4、APK应用架构
android应用架构很关键,如果不学习它,设计出来的游戏将是一种很难修复bug的产品。 需要了解应用程序、活动、Intents以及它们是如何互相联系交互的,Google在这儿提供了良好的信息架构。真正重要的是,要理解为什么在设计的游戏中,需要不止一个的活动进程,以及如何设计一个用户体验良好的游戏。这些都应当配合到应用的生命周期中。
5、APK应用的生命周期
应用的生命周期是由Android OS操作系统进行管理的,活动进程都将作为系统命令进行创建,正确处理这些事件对一个应用程序来说是极为重要的,因为终端用户不会知道什么是正确的。最好在开始设计游戏之前搞明白这些,因为这有助于节省调试时间以及避免代价高昂的重新设计。
对大多数应用而言,默认设置即可开始工作,但对游戏而言,可能需要调整单态实例的信号为打开。在默认情况下,Android会新建一个活动实例进程,因为它认为这是比较合适的,而游戏,可能只希望有一个活动的实例进程,这有一点儿影响,它需要了解一些系统状态的管理。
‘肆’ 安卓 自动签名 以及如何验证一个apk包是用你的签名文件签名的
## 使用自动签名的方法
1. 创建或者修改 ~/.gradle/gradle.properties
2. 在gradle.properties 文件中增加下面的内容.(具体内容需要根据实际来更改)
STORE_PASSWORD=xysys
KEY_ALIAS=xxsasd
KEY_PASSWORD=988asdf
3. 这样每次build的时候,总是用keystore来签名,不会用生成的debug来签名了
## 使用命令行来构建APK
进入项目最高层目录,找到 gradlew. 执行下面的命令来构建所有类型的APK,自动使用官方签名
## 验证签名是官方签名
1. 使用keytool 获取apk包的指纹
例如:
2. 查看keystore的指纹
apk的签名指纹跟keystore中的指纹一致表明该包是用keystore来签名的。
注意:若java版本是7之前的,需要先把apk解压,
来看包的指纹。
‘伍’ APK签名机制原理详解
众所周知,Android系统在安装Apk的过程中,会对Apk进行签名校验,校验通过后才能安装成功。那你知道签名校验的机制是什么?具体校验的是什么内容吗?申请第三方SDK(如微信支付)时填入的SAH1值是什绝颂高么?目前众多的快速批量打包方案又是如何绕过签名检验的?
我将通过一系列的文章来解开这些疑惑:
这篇文章先来介绍Apk签名相关的基本知识。
要知道签名是什么,先来看为什么需要签名 。大家都知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。在安装Apk时,同样需要确保Apk来源的真实性,以及Apk没有被第三方篡改。如何解决这两个问题呢?方法就是开发者对Apk进行签名:在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。
要了解如何实现签名,需要了解两个基本概念:数字摘要和数字证书。
简单来说,就是对一个任意长度的数据,通过一个Hash算法计算后,都可以得到一个固定长度的二进制数据,这个数据就称为“摘要”。摘要具有下面的几个特征:
前面已经说到,可以通过签名来确保数据来源的可靠性和数据的不可篡改性。签名就是在摘要的基础上再进行一次加密,对摘要加密后的数据就可以当作数字签名,在安装Apk需要对签名进行验证,验证通过才能继续安装。
这里有两个过程:签名过程 和 校验过程。
先来说 签名过程:
再来看 校验过程:
这里有一个前提:接收方必须要知道发送方的公钥和所使用的算法。如果数字签名和公钥一起被篡改,接收方无法得知,还是会校验通过。如何保证公钥的可靠性呢?答案是数字证书,数字证书是身份认证机构(Certificate Authority)颁发的,包含了以下信息:
接收方收到消息后,先向CA验证证书的合法性(根据证书的签名、绑定的域名等信息。CA机构是权威的,可以保证这个过程的可靠性。)再进行签名校验。
需要注意的是,Apk的证书通常的自签名的,也就是由开发者自己制作,没有向CA机构申请。Android在安装Apk时并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,这也正是对第三方Apk重新签名后,还能够继续在没有安装这个Apk的系统中继续安装的原因。
我们在对Apk签名时并没有直接指定私钥、公钥和数字证书,而是使用keystore文件,这些信息都包含在了keystore文件中。根据编码不同,keystore文件分为很多种,Android使用的是Java标准keystore格式JKS(Java Key Storage),所以通过Android Studio导出的keystore文件是以.jks结尾的。
keystore使用的证书标准是X.509,X.509标准也有多种编码格式,常用的有两种:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。jks使用的是der格式,Android也支持直接使用pem格式的证书进行签名,我们下面会介绍。
两种证书编码格式的区别:
X.509证书格式:
Android提供了两种对Apk的签名方式,一种是基于JAR的签名方式,另一种是基于Apk的签名方式,它们的主要区别在于使用的签名文件不一样:jarsigner使用keystore文件进行签名;apksigner除了并尺支持使用keystore文件进行签名外,还支持直接指定pem证书文件和私钥进行签名。
不知道大家有没有注意一个问题,我们通过樱御keytool或者AS生成一个keystore的时候( 签署您的应用 ),除了要输入keystore的密码外,还要输入一个alias和key的密码。在签名时,除了要指定keystore文件和密码外,也要指定alias和key的密码,这是为什么呢?
原因是keystore是一个密钥库,也就是说它可以存储多对密钥和证书,keystore的密码是用于保护keystore本身的,一对密钥和证书是通过alias来区分的。从这里可以看出jarsigner是支持使用多个证书对Apk进行签名的。apksigner也同样支持,关于apksigner的使用介绍可以参考官方文档 apksigner 。
ok,签名的基本概念和校验过程就介绍到这里,关于JAR签名和V2签名机制的详细介绍,参考下面两篇文章:
‘陆’ Android中APK签名工具之jarsigner和apksigner详解
转自 https://www.cnblogs.com/slysky/p/9780015.html
一.工具介绍
jarsigner是JDK提供的针对jar包签名的通用工具,
位于JDK/bin/jarsigner.exe
apksigner是Google官方提供的针对Android apk签名及验证的专用工具,
位于Android SDK/build-tools/SDK版本/apksigner.bat
不管是apk包,还是jar包,本质都是zip格式的压缩包,所以它们的签名过程都差不多(仅限V1签名),
以上两个工具都可以对Android apk包进行签名.
1.V1和V2签名的区别
在Android Studio中点击菜单 Build->Generate signed apk... 打包签名有两种签名选项 V1(Jar Signature) V2(Full APK Signature),
从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature);
但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing)
V1签名:
V2签名:
V2签名优点很明显:
注意: apksigner工具默认同时使用V1和V2签名,以兼容Android 7.0以下版本
2.zipalign和V2签名
位于Android SDK/build-tools/SDK版本/zipalign.exe
zipalign 是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗
zipalign -v 4 in.apk out.apk //4字节对齐优化
zipalign -c -v 4 in.apk //检查APK是否对齐
zipalign可以在V1签名后执行
但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!
二.签名步骤
1.生成密钥对(已有密钥库,可忽略)
Android Studio在Debug时,对App签名都会使用一个默认的密钥库:
1.生成密钥对
进入JDK/bin, 输入命令
参数:
提示: 可重复使用此条命令,在同一密钥库中创建多条密钥对
例如: 在debug.keystore中新增一对密钥,别名是release
keytool -genkeypair -keystore debug.keystore -alias release -validity 30000
2.查看密钥库
进入JDK/bin, 输入命令
keytool -list -v -keystore 密钥库名
参数:
例如:
keytool -list -v -keystore debug.keystore
现在debug.keystore密钥库中有两对密钥, 别名分别是androiddebugkey release
2.签名
1.方法一(jarsigner,只支持V1签名)
进入JDK/bin, 输入命令
从JDK7开始, jarsigner默认算法是SHA256, 但Android 4.2以下不支持该算法,
所以需要修改算法, 添加参数 -digestalg SHA1 -sigalg SHA1withRSA
参数:
例如:
用JDK7及以上jarsigner签名,不支持Android 4.2 以下
jarsigner -keystore debug.keystore MyApp.apk androiddebugkey
用JDK7及以上jarsigner签名,兼容Android 4.2 以下
jarsigner -keystore debug.keystore -digestalg SHA1 -sigalg SHA1withRSA MyApp.apk androiddebugkey
2.方法二(apksigner,默认同时使用V1和V2签名)
进入Android SDK/build-tools/SDK版本, 输入命令
若密钥库中有多个密钥对,则必须指定密钥别名
禁用V2签名
apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk
参数:
例如:
在debug.keystore密钥库只有一个密钥对
apksigner sign --ks debug.keystore MyApp.apk
在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名
apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey MyApp.apk
3.签名验证
1.方法一(keytool,只支持V1签名校验)
进入JDK/bin, 输入命令
keytool -printcert -jarfile MyApp.apk (显示签名证书信息)
参数:
2.方法二(apksigner,支持V1和V2签名校验)
进入Android SDK/build-tools/SDK版本, 输入命令
apksigner verify -v --print-certs xxx.apk
参数:
例如:
apksigner verify -v MyApp.apk
‘柒’ 如何判断 Android 应用的 Apk 签名是否一致
Android应用的发布形式apk中包含的签名加密方法除了RSA还有DSA,所以不能只从apk中提取常见的META-INF/CERT.RSA,第一步应该是检查apk中具体的签名文件是什么。
FILE="yourapp.apk"
cert_XSA=`jar tf $FILE | grep SA`
此时得到的cert_XSA可能是META-INF/*.RSA或者META-INF/*.DSA。
接下来从apk中提取具体的签名文件。
jar xf $FILE $cert_XSA
此时会在当前目录得到cert_XSA文件。
然后对于得到的签名文件,提取其中签名的MD5值
keytool -printcert -file $cert_XSA | grep MD5 > "$FILE.certMD5"
这时候yourapp.certMD5这个文件中就保存了yourapp.apkk中的签名MD5值。
最后比较两个app的签名可以用diff
FILE1="yourapp1.apk"
FILE2="yourapp2.apk"
# ...
# ... 经过上述步骤得到$FILE1.certMD5和$FILE2.certMD5
# ...
certMD5_diff=`diff $FILE1.certMD5 $FILE2.certMD5`
if [ "$certMD5_diff" = "" ]; then
echo "$FILE1.certMD5 == $FILE2.certMD5"
fi
若输出yourapp1.apk.certMD5 == yourapp2.apk.certMD5那么这两个应用的签名就一致。
‘捌’ 如何判断 Android 应用的 Apk 签名是否一致
FILE="yourapp.apk"
cert_XSA=`jar tf $FILE | grep SA`
此时得到的cert_XSA可能是META-INF/*.RSA或者META-INF/*.DSA。
接下来从apk中提取具体的签名文件。
jar xf $FILE $cert_XSA
此时会在当前目录得到cert_XSA文件。
然后对于得到的签名文件,提取其中签名的MD5值
keytool -printcert -file $cert_XSA | grep MD5 > "源衫$FILE.certMD5"
这时迟裂好候yourapp.certMD5这个文件中就保存了yourapp.apkk中的签名MD5值。
最后比较两个app的签名可以用diff
FILE1="yourapp1.apk"
作者:王仲禹
链接:https://www.hu.com/question/20749413/answer/17436681
来源:知乎
着作权归作者所有。商业转载请联系作者获码铅得授权,非商业转载请注明出处。
‘玖’ Android开发对apk文件进行签名
对apk签名的步骤(适用于找回apk,对空包进行签名)
1.复制java的jdk,bin目录的绝对路径(如果是默认安装应该和我的路径差不多)C:\Program Files\Java\jdk1.8.0_111\bin
2.进入cmd窗口,进入bin目录(如果是新手,输入cd C:\Program Files\Java\jdk1.8.0_111\bin)
输入命令 jarsigner -verbose -keystore d:\project\360Wallpaper.keystore -signedjar d:\qihusign.apk d:\Qihuunsign.apk QIHU360
将签名修改成自己签名的路径 ,生成的apk文件的名字路径修改一下,再输入需要签名的apk文件路径,最后输入自己签名的别名就可以
(新手,欢迎指正)
‘拾’ 如何判断 Android 应用的 Apk 签名是否一致
可以比对apk签名的fingerprint。
假定安装了JDK,如果想查HelloWorld.apk所使用的签名的fingerprint,可以这样做:
1. 查找apk里的rsa文件
(Windows)
> jar tf HelloWorld.apk |findstr RSA
(Linux)
$ jar tf HelloWorld.apk |grep RSA
META-INF/CERT.RSA
2. 从apk中解压rsa文件蠢慧
jar xf HelloWorld.apk META-INF/CERT.RSA
3. 获取签名的fingerprints
keytool -printcert -file META-INF/CERT.RSA
...
Certificate fingerprints:
MD5: BC:6D:BD:6E:49:69:2A:57:A8:B8:28:89:04:3B:93:A8
SHA1: 0D:DF:76:F4:85:96:DF:17:C2:68:1D:3D:FF:9B:0F:D2:A1:CF:14:60
Signature algorithm name: SHA1withRSA
Version: 3
...
4. 清理工作,删除rsa文件
(Windows)
rmdir /S /Q META-INF
(Linux)
rm -rf META-INF
如果你想知道两个apk是不是用的同一个签名,那比前悉一下它们签名的MD5码(或SHA1码)是不是带悔答一样就行了。