Android 签名 v1,v2的区别及命令行查看apk签名信息

Apk签名就是对我们的apk加了一个校验参数,防止apk被掉包。一开始做Android开发,就接触到了apk签名;后来在微信开放平台、申请ysdk的参数,需要填写apk签名的md5值和sha256值;就想整理一下,也分享给其它小伙伴们。

 

一、v1、v2签名的理解:

v1:在v1中只对未压缩的文件内容进行了验证,所以在APK签名之后可以进行很多修改——文件可以移动,甚至可以重新压缩。即可以对签名后的文件在进行处理 

v2:v2签名验证了归档中的所有字节,而不是单独的ZIP条目,如果您在构建过程中有任何定制任务,包括篡改或处理APK文件,请确保禁用它们,否则您可能会使v2签名失效,从而使您的APKs与Android 7.0和以上版本不兼容。

google官方文档解释:一个APK可以同时由v1和v2签名同时签署,所以它仍然可以向后兼容以前的Android版本。

使用经验总结:

一定可行的方案: 只使用 v1 方案       

不一定可行的方案:同时使用 v1 和 v2 方案       

对 7.0 以下一定不行的方案:只使用 v2 方案

1, 如果要支持 Android 7.0 以下版本,那么尽量同时选择两种签名方式,但是一旦遇到签名问题,可以只使用 v1 签名方案   

2,如果需要对签名后的信息做处理修改,那就使用v1签名方案   

3,如果最后遇到各种不同的问题,可以不勾选v1和v2,直接打包签名

 

二、命令行查看apk是v1或v2签名

apksigner verify -v demo.apk

三、jks与keystore生成,以及命令行查看签名信息

Eclipse默认生成的签名文件是keystore格式,而Android Studio生成的是jks格式,二者只是签名格式的不同;

keytool -v -list -keystore demo.jks

用代码获取md5值和sha256值

public static String getSign(Context context, String packageName) {        

  String signValidString = "";      
  try {          
    @SuppressLint("PackageManagerGetSignatures")          
    PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.*GET_SIGNATURES*);          
    signValidString = *getSignValidString*(packageInfo.signatures[0].toByteArray(), "MD5");  //参数可以填"SHA1"、"SHA256"      
  } catch (Exception e) {      
  }      
  return signValidString;  
}  

private static String getSignValidString(byte[] paramArrayOfByte, String signType) throws NoSuchAlgorithmException {

  MessageDigest localMessageDigest = MessageDigest.*getInstance*(signType); 
  localMessageDigest.update(paramArrayOfByte);      
  return *toHexString*(localMessageDigest.digest());  //转为16进制显示,实现略去  
}

四、命令行生成签名文件

keytool -genkeypair -alias csdemo -keyalg RSA -validity 400 -keystore demo.keystore 

命令行对未签名的apk签名

jarsigner -verbose -keystore demo.keystore -signedjar test_sign.apk Test.apk csdemo

重签名

进行重签名时,会报错java.util.zip.ZipException: invalid entry compressed size (expected 41278 but got 42575bytes) bytes)。如何解决呢?就是要重签名的apk后缀改成zip,打开后删除里面的META-INF目录,然后重新改成apk后缀,再进行签名就可以了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值