查天气、找美食、玩游戏、买电影票、网上购物……安装
APP后,手机变成“百事通”。不过,
智能手机越来越“聪明”,也越来越不安全,病毒感染、垃圾短信、隐私泄露等关乎手机用户切身利益的问题频发。保护手机安全,不仅需要用户到正规官网下载APP,更重要的是开发者要做好APK安全保护工作。 http://write.blog.csdn.net/postedit
下面小编就分享一下APK高级保护的方法——运行时验证
运行时验证,主要是指在代码启动的时候本地获取签名信息,然后对签名信息进行检验来判断自己的应用是否是
正版,如果签名信息不是正版则提示盗版或者直接崩溃。
它的原理:APK的唯一识别是根据包名+签名,包名信息是写死在Android Manifest.xml里面的,但是签名则是与APK绑定的,一旦APK被反编译后签名会自动消失。APK的签名需要签名文件,签名文件的md5值基本上是无法伪造成一样的。
签名验证的方法也可以细分为3种:
1) Java 层验证
获取签名信息和验证的方法都写在android 的java层。这种保护方法保护的
意义并不大,因为反编译出源码后通过
关键字搜索很快就能够找到验证的代码块,稍微一修改这验证保护就完全无效了。
2) 服务器验证
在android 的java层获取签名信息,上传服务器在
服务端进行签名然后返回验证结果。这种保护还不如在纯java层验证有用,一旦没有网络验证保护就无效了。用android方法获取的签名信息用java方法也可以获取,验证存放在服务器上也是为了把保护正确的签名信息值,但是保护的意义其实没有任何作用,同样破解后
全局搜索关键字然后伪造一个正确的签名信息就可完美破解了。
3) NDK技术底层获取签名和验证
通过把Context,Activity,PackageManager,PackageInfo四个对象中的一个作为参数参入底层,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。不过通过java层的hook技术一样可以把这种保护完美破解。但是相比于前两种,此保护的意义和价值就更大了。
再来看一下爱加密(www.ijiami.cn)的APK保护方法,它采用指纹校验保护APK中的文件。加密后,APK中所有的文件都对应一个唯一的指纹,每次运行时,APK内部会再次进行指纹生成,如果生成的指纹和原本指纹不相同,则判断为被二次打包过的APK,程序就会自动退出或直接崩溃。该方法可以防止资源文件、主配置文件被修改或删除等操作,完全保证APK的安全。