APK签名是什么
Android系统要求所有安装的应用程序都必须用数字证书进行过签名。签名的意义在于,确认应用程序的作者,尽力各个应用之间的信任关系。同一个应用程序升级时,系统也会对签名进行验证,只有签名相同的APP才会被允许update。
理解签名需要注意下面几点:
所有应用程序都必须被签名,没有签名的APK是不会被Android允许安装的
Debug程序时,SDK会为debug release自动生成一个特殊的debug签名
带有debug签名的APP是不允许被发布的
android系统只在安装时检查签名中的过期时间。如果安装后才过期,APP也能被正常使用
可以用JDK自带的工具Keytool 和 Jarsigner 生成签名并进行签名
对APK签名后,建议用zipalign对APK package进行优化
为什么需要重签名
修改一个APP的行为,一般先要用Apktool对APK进行反编译,修改smali代码后,在编译回APK(参考[2])。
但smali代码经Apktool编译出的APK,其中的签名就丢失了(没有了META-INF文件夹)。
这里写图片描述
没有签名的APK是不会被Android允许安装的,所以此时就需要对APK进行重签名。
除此之外,发布APP之前,也是需要对APK进行签名的。
怎么给APK重新签名
用JDK自带的工具Keytool和Jarsigner,就能生成签名,并对APK进行签名。
生成新证书
用keytool就能生成新证书,下面生成一个叫ybdesire的证书(注意这里需要根据CMD提示,输入信息)。
E:\mine\tmp\baidu_yun_crack>keytool -genkey -alias ybdesire.keystore -keyalg RSA -validity 20000 -keystore ybdesire.keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: 123
What is the name of your organizational unit?
[Unknown]: 456
What is the name of your organization?
[Unknown]: 789
What is the name of your City or Locality?
[Unknown]: 123
What is the name of your State or Province?
[Unknown]: 456
What is the two-letter country code for this unit?
[Unknown]: cn
Is CN=123, OU=456, O=789, L=123, ST=456, C=cn correct?
[no]: y
Enter key password for <ybdesire.keystore>
(RETURN if same as keystore password):
这里keytool的参数含义为:
-alias ybdesire.keystore, 别名为ybdesire.keystore
-keyalg RSA, 使用RSA算法对签名加密
-validity 20000, 有效期限20000天
-keystore ybdesire.keystore,证书为ybdesire.keystore
重新签名
用jarsigner对反编译并打包后的baiduyun_481_d.apk进行签名。
jarsigner -verbose -keystore ybdesire.keystore -signedjar baiduyun_481_d_s.apk baiduyun_481_d.apk ybdesire.keystore
用zip工具打开重签名后的baiduyun_481_d_s.apk可以看到,包里面含有META-INF文件夹,说明这个APK签名成功了。
结论
注意重新签名后的APK,只能保证能被正常安装,不能保证安装后能正常运行。因为APP的代码可能做了签名验证,。
Android系统要求所有安装的应用程序都必须用数字证书进行过签名。签名的意义在于,确认应用程序的作者,尽力各个应用之间的信任关系。同一个应用程序升级时,系统也会对签名进行验证,只有签名相同的APP才会被允许update。
理解签名需要注意下面几点:
所有应用程序都必须被签名,没有签名的APK是不会被Android允许安装的
Debug程序时,SDK会为debug release自动生成一个特殊的debug签名
带有debug签名的APP是不允许被发布的
android系统只在安装时检查签名中的过期时间。如果安装后才过期,APP也能被正常使用
可以用JDK自带的工具Keytool 和 Jarsigner 生成签名并进行签名
对APK签名后,建议用zipalign对APK package进行优化
为什么需要重签名
修改一个APP的行为,一般先要用Apktool对APK进行反编译,修改smali代码后,在编译回APK(参考[2])。
但smali代码经Apktool编译出的APK,其中的签名就丢失了(没有了META-INF文件夹)。
这里写图片描述
没有签名的APK是不会被Android允许安装的,所以此时就需要对APK进行重签名。
除此之外,发布APP之前,也是需要对APK进行签名的。
怎么给APK重新签名
用JDK自带的工具Keytool和Jarsigner,就能生成签名,并对APK进行签名。
生成新证书
用keytool就能生成新证书,下面生成一个叫ybdesire的证书(注意这里需要根据CMD提示,输入信息)。
E:\mine\tmp\baidu_yun_crack>keytool -genkey -alias ybdesire.keystore -keyalg RSA -validity 20000 -keystore ybdesire.keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: 123
What is the name of your organizational unit?
[Unknown]: 456
What is the name of your organization?
[Unknown]: 789
What is the name of your City or Locality?
[Unknown]: 123
What is the name of your State or Province?
[Unknown]: 456
What is the two-letter country code for this unit?
[Unknown]: cn
Is CN=123, OU=456, O=789, L=123, ST=456, C=cn correct?
[no]: y
Enter key password for <ybdesire.keystore>
(RETURN if same as keystore password):
这里keytool的参数含义为:
-alias ybdesire.keystore, 别名为ybdesire.keystore
-keyalg RSA, 使用RSA算法对签名加密
-validity 20000, 有效期限20000天
-keystore ybdesire.keystore,证书为ybdesire.keystore
重新签名
用jarsigner对反编译并打包后的baiduyun_481_d.apk进行签名。
jarsigner -verbose -keystore ybdesire.keystore -signedjar baiduyun_481_d_s.apk baiduyun_481_d.apk ybdesire.keystore
用zip工具打开重签名后的baiduyun_481_d_s.apk可以看到,包里面含有META-INF文件夹,说明这个APK签名成功了。
结论
注意重新签名后的APK,只能保证能被正常安装,不能保证安装后能正常运行。因为APP的代码可能做了签名验证,。