Android■如何检查手机上的 App 是不是正版?( 二 )


运行安卓7.0及更高版本的设备支持APK签名方案v2(亦即v2方案)和它的更高版本 。 (在Android P中 , v2方案被更新为v3方案 , 以支持在签名块中包含附加信息 , 但在其他情况下也一样 。 ) 。 v2方案对APK的内容进行散列和签名 , 然后将生成的APK签名块插入APK中 。
应用程序可以非常简单地通过Android Studio的选项或命令行进行签名 。
打开Android Studio , 进入Build > Generate Signed APK 。
你可以按照下文中的步骤进行操作 , 来生成一个签名密钥:https://developer.android.com/studio/publish/app-signing#sign-apk 。
当你可以选择谷歌应用商店对你的应用的每一个版本进行签名时 , 你有很多选择 。 详情请参照上面的链接 。
生成密钥并查看其内容的简单命令分别如下:
生成秘钥:
keytool -genkey -v -keystore-storepass-alias-keypass-keyalg RSA -keysize 2048 -validity 30000 查看秘钥:
keytool -list -v -keystore-alias-storepass-keypass 备注:你需要用实际值替换上面尖括号里的变量 。 根据你的应用程序的实际需要 , 设置生成密钥、密钥大小和有效日期(以天为单位)的算法需要提供的值 。
此外 , 还可以使用APKSigner和ZipAlign工具来检查 , 这些工具很方便(本文将不讨论它们 , 但是它们非常值得探讨) 。
Android■如何检查手机上的 App 是不是正版?
本文插图
如何通过代码检查应用程序签名信息?
下面的代码可以用来检查应用程序签名信息:
public boolean validateAppSignature(Context context) throws NameNotFoundException {PackageInfo packageInfo = context.getPackageManager.getPackageInfo(getPackageName, PackageManager.GET_SIGNATURES);//note sample just checks the first signaturefor (Signature signature : packageInfo.signatures) { // SHA1 the signatureString sha1 = getSHA1(signature.toByteArray);// check is matches hardcoded valuereturn APP_SIGNATURE.equals(sha1);}return false;} 当一个应用程序(APK文件)被安装到安卓设备上时 , 包管理器将验证APK文件是否已经使用该APK中包含的证书正确地签名 。 如果证书(或者更准确地说 , 证书中的公钥)与用于在设备上签署任何其他APK的密钥匹配 , 则新APK可以在清单中指定它将与其他类似签名的APK共享UID 。
如果设备上的私有签名密钥丢失 , 会出现什么情况?
这将导致旧的应用程序无法更新!这种情况下 , 它将生成一个新的包名&一个新的证书 。 比如说:
Authenticator应用程序是一个身份验证程序 , 这个应用程序的一个私有应用程序签名密钥丢失或受损 , 因为在几年前的一次更新中 , 它的软件包名称从com.google.android.apps.authenticator被更改为com.google.android.apps.authenticator2 。 由于此更改 , 所有后续的Authenticator应用程序更新只能以新的程序包名称发布 , 并且使用由新的专用签名密钥生成的新签名 。
不过 , 最近谷歌公司也增加了对“rolling key”的支持 , 这可能会在有这种麻烦的情况下为开发者节轻一点压力 。
以上所有这些内容供你参考 , 希望你能从中获得一些帮助 。 签名是一个至关重要的场景 , 需要深入了解才能理解安卓系统的整体安全状况 。
原文:https://hackernoon.com/how-to-check-whether-the-mobile-app-on-your-phone-is-authentic-or-not-j9gt32lw
本文为 CSDN 翻译 , 转载请注明来源出处 。


推荐阅读