Android 安全与防护策略

2023-04-12


背景:


随着应用的发展,应用的安全也变的越来越重要,有些不法分子开始反编译或者劫持一些app源码。甚至有人通过截图然后做识别,获取别人内容。我们在处理时应该如何去保护我们的应用呢?接下来我们可以分析一下,一些场景,的用途


1.防止截屏:

在系统中,已提供防止截屏的标识,我们只需要加进去即可


getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);


这个只能防止一个页面被截屏,如果需要所有页面,可以放在基类(父类)中,子类可以通过参数来配置



通过IDE的截屏也会报错。



录屏也是黑屏。


2.数据加密


2.1SharedPreferences




SharedPreferences这个类,在Android中用的比较多,是用来存储临时数据的,但是这个类存储的数据以xml文件落在文件夹里。所有,只要root设备后,找到该文件夹下的文件,就可以以明文的方式展示。有些开发者也把登录密码或者token值直接存储,这样就会导致这些数据有可能会被盗取。




所以在SharedPreferences存储一些重要数据可以进行加密。


2.2加密算法


加密分为对称加密和非对称加密。


对称加密:所谓对称,就是采用这种加密方法的双方,使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。


非对称加密:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法


3.网络请求的证书


在APP中,应用和服务器请求需要网络,常见的是http或者https。裸奔的网络一般会被抓包工具抓去,这样,我们的数据就会被被人劫持或者修改。


证书的绑定可以很好的解决这个问题,通过证书验证,来拒绝非法拦截等


在启用https和证书时,我们可以通过https的证书来进行证书校验,如果证书验证不过,会直接拒绝,目前证书在app的网络中被广泛投入使用。关于证书的绑定可以参考不同的网络框架。


4.签名验证


每个应用都有自己的独立签名,我们可以获取app当前的签名MD5或者SHA1值,和原签名的进行校验,如果对不上,基本判断是非法签名。原签名信息如果泄露应及时更换签名文件,否则可能导致签名信息被恶意盗用。




public String getSingleAlgorithm(Context context) {
    try {
        PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
        byte[] cert = info.signatures[0].toByteArray();
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] publicKey = md.digest(cert);
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < publicKey.length; i++) {
            String appendString = Integer.toHexString(0xFF & publicKey[i])
                    .toUpperCase(Locale.US);
            if (appendString.length() == 1)
                builder.append("0");
            builder.append(appendString);
            builder.append(":");
        }
        return builder.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}



5.代码的混淆


代码混淆,是一种安全措施。在应用中被广泛使用。将代码混淆后,提高了代码的阅读难度,即使apk被破解,混淆后的代码阅读难度更大。


如何混淆代码?请看混淆详解


混淆目前来说,对应用算是比较小的投入。在混淆开启,需要注意的是会产生一个mapping.txt文件,这个文件对应的包,且该文件最好保存起来,如果在后期出现崩溃或者异常,可以通过trace追踪还原源代码所在行。有助于bug修复和定位


6.加固


加固已成为防脱壳的一种常见的手段,目前市场上有好多种加固方案,我们自己可以选择一种,但是在进入应用市场,第三方也会对我们的应用进行加固。加固的目的就是提高apk的安全性,提高被破解的难度


7.dex加密


可以参考三方


8.android:exported="" 开闭


如果封闭起来,对应的组件只在内部使用,无法和外部通讯,外部也无法去获取你应用的通信。


9.其他会不定期补充进来


本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com