浅谈Android安全风险与防范措施

做好的apk文件,被检测工具检测出一大堆风险问题,是不是感觉自己的付出白费了,今天咱就聊聊android的安全防范问题。

一,先说安全检查方面的吧

1,源文件安全问题方面

1.1篡改和二次打包风险

1.2应用签名未校验风险

1.3Java代码反编译风险检测

1.4代码未混淆风险检测

1.5资源文件泄露风险检测

2,数据存储安全问题方面

2.1 WebView明文存储密码风险检测

2.2Internal Storage数据全局可读写风险检测

3.3加密算法不安全使用风险

4.4日志数据泄露风险

4.5URL硬编码风险

3,组件风险

3.1Activity组件导出风险

3.2Service组件导出风险

3.3Content Provider组件导出风险

3.4Broadcast Receiver组件导出风险

3.5WebView远程代码执行漏洞

3.6Intent Scheme URL攻击风险

4,安全防护能力

4.1Java层代码动态调试风险

4.2C层代码动态调试风险

4.3动态注入攻击风险

4.4模拟器运行风险

4.5启动隐藏服务风险

4.6Root设备运行风险

5,内容风险

5.1自定义词汇

5.2敏感文本

5.3敏感图片

这种类型的风险存在于发布文章类或信息类应用,“涉黄”,“赌博”等词汇与图片需要进行敏感内容识别或过滤。为了节约成本,可以人工审核信息来完成,当然,这样工作量太大,要是有Money的话可以介入专业的

检测公司API,来让应用的内容安全做的更严密些。

二,在自己没钱的情况下,看我们能做哪些事吧

1,打包应用,基本要加的就是混淆了,当然,我们还要再创建一个签名文件

2,要是我们应用体积大了,还可以再压缩一下资源文件,我用 的是 AndResGuard

3,没钱,没办法啊,那就来个免费的加固服务吧。

做到这些,是不是大家都觉得,我也是这样做的。是的,一般我们程序都会做这些基本的操作,但是我们还可以再做些什么?

情况1,应用被反编译后二次打包了----apk在正式打包后生成hash签名保存在服务端。应用每次启动后校验当前应用hash与服务端保存的是不是一致,以此来校验应用是不是合法的。嘿嘿,是不是解决问题的一种方法了

上代码:

/**
 * 根据apk MD5摘要获取对应的哈希值
 *
 * @param context
 * @return
 */
public static String getApkHashValue(Context context) {
    String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径
    try {
        MessageDigest dexDigest = MessageDigest.getInstance("MD5");
        byte[] bytes = new byte[1024];
        int byteCount;
        FileInputStream fis = new FileInputStream(new File(apkPath)); // 读取apk文件
        while ((byteCount = fis.read(bytes)) != -1) {
            dexDigest.update(bytes, 0, byteCount);
        }
       /* BigInteger bigInteger = new BigInteger(1, dexDigest.digest()); // 计算apk文件的哈希值
        String sha = bigInteger.toString(16);*/
        //解决MD5在特殊情况下丢失0的情况
        StringBuffer buf = new StringBuffer();
        byte[] b = dexDigest.digest();
        int i;
        for (int offset = 0; offset < b.length; offset++) {
            i = b[offset];
            if (i < 0) {
                i += 256;
            }
            if (i < 16) {
                buf.append("0");
            }
            buf.append(Integer.toHexString(i));
        }
        fis.close();
        return buf.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return "";
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return "";
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
}

情况2;很多时候apk被反编译或被破坏,多通过模拟器或者获取root权限来操作

没办法,只能给模拟器说再见了。正式发布程序后,代码检测运行设备是否是模拟器,如果是的话,就不让运行了,root 设备一样的验证逻辑,简单粗暴!!!

但是root或模拟器检测并没有官方的或权威的检测代码,谁让android品牌太多太杂了捏,没办法。真遇到这种兼容性问题的话,没事,我们可以再做检查逻辑时,留一手服务端验证,

由服务端来控制这个版本或者某个用户走不走这部分验证逻辑额~~~~~,后边的可以自行发挥解决。

情况3,动态调试,内存读取......

和情况2思路一致,均是通过代码来检测是否有调试等工具在调试程序,然后做出相应的判断处理

其他情况都比较常见了,随便百度就能找到解决方法,这里就不啰嗦了。嘿嘿

最后,要是你们公司很有钱,那就不考虑那么多了,来个专业机构加密,一下风险就降到最低,只要有money~

没有绝对的安全,我们能做的就是把安全风险降到最低,欧力给!

以上就是浅谈Android安全风险与防范措施的详细内容,更多关于Android安全风险与防范措施的资料请关注我们其它相关文章!

(0)

相关推荐

  • AndroidStudio报错Emulator:PANIC:Cannot find AVD system path. Please define ANDROID_SDK_ROOT(解决方案)

    Android Studio 运行后出现了下面的错误 Emulator: Process finished with exit code 1 Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT 仿真器:进程结束退出代码1 模拟器:恐慌:找不到AVD系统路径.请定义ANDROID_SDK_ROOT 解决办法如下: 1.先把下载的AVD全部删除 这样打开 这样点,把这里的全部删除了 2.配置电脑环境

  • Android Studio一直停留在MyApplication:syncing该怎么解决

    在我们打开Android Studio时,可能出现一直停留在MyApplication:syncing的情况(下图的情况),我在此给出解决办法 注意看你的绿色框框位置的的zip是什么样的,在下面的链接中找到一样的压缩包下载下来. 注意,一定要下载相同的!! 链接:点这里 然后打开电脑C盘 打开C:\Users\用户名\.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx这个位置的文件夹 你的这个位置可能没有这些文件,应该

  • 浅谈Android安全风险与防范措施

    做好的apk文件,被检测工具检测出一大堆风险问题,是不是感觉自己的付出白费了,今天咱就聊聊android的安全防范问题. 一,先说安全检查方面的吧 1,源文件安全问题方面 1.1篡改和二次打包风险 1.2应用签名未校验风险 1.3Java代码反编译风险检测 1.4代码未混淆风险检测 1.5资源文件泄露风险检测 2,数据存储安全问题方面 2.1 WebView明文存储密码风险检测 2.2Internal Storage数据全局可读写风险检测 3.3加密算法不安全使用风险 4.4日志数据泄露风险 4

  • 浅谈Android性能优化之内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应一个被调用的方法.栈帧包括局部标量表, 操作数栈. 本地方法栈:本地方法栈主要是为执行本地方法服务的.而Java栈是为执行Java方法服务的. 方法区:该区域被线程共享.主要存储每个类的信息(类名,方法信息,字段信息等).静态变量,常量,以及编译器编译后的代码等. 堆:Java中的堆是被线程共享的,

  • 浅谈android中数据库的拷贝

    SQLiteDatabase不支持直接从assets读取文件,所以要提前拷贝数据库.在读取数据库时,先在项目中建立assets文件夹用于存放外部文件,将数据库文件拷到该目录下. 代码方法: /** * 拷贝数据库至file文件夹下 * @param dbName 数据库名称 */ private void initAddressDB(String dbName) { //1,在files文件夹下创建同名dbName数据库文件过程 File files=getFilesDir();//获取/dat

  • 浅谈Android Activity与Service的交互方式

    实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上. 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用.但缺点也十分明显,发送广播受到系统制约.系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟.同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

  • 浅谈android获取设备唯一标识完美解决方案

    本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi): * 2, IMEI(imei): * 3, 序列号(sn): * 4, id:随机码.若前面的都取不到时,则随机生成一个随机码,需要缓存. * * @param context * @return */ p

  • 浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer

    前言: 其实 studio3.0的工具大家也已经使用过一段时间了,自己呢,就是从bate版开始使用的,我觉得比较好用的几个地方.就几个,可能还没用到其他的精髓. 但我觉的这个两个功能对我是比较实用的.好那么下面就给大家介绍一下吧. 正文: 话不多说咱们直接上图吧.(个人比较喜欢看图说话) 第一个(Android Profiler)我要介绍的就是这个了.(先看一下效果"震撼一下") (图-1) (图-2) (图-3) (厉害不厉害,牛逼不牛逼)那么我们怎么来操作这个工具呢,来咱们接着看图

  • 浅谈Android获取ImageView上的图片,和一个有可能遇到的问题

    1.在获取图片前先调用setDrawingCacheEnabled(true)这个方法: 举例:mImageView.setDrawingCacheEnabled(true); 2.之后可以通过getDrawingCache()获取图片 举例:Bitmap obmp = Bitmap.createBitmap(mImageView.getDrawingCache());  //获取到Bitmap的图片 3.获取完图片后记得调用setDrawingCacheEnabled(false) 举例:mI

  • 浅谈Android View绘制三大流程探索及常见问题

    View绘制的三大流程,指的是measure(测量).layout(布局).draw(绘制) measure负责确定View的测量宽/高,也就是该View需要占用屏幕的大小,确定完View需要占用的屏幕大小后,就会通过layout确定View的最终宽/高和四个顶点在手机界面上的位置,等通过measure和layout过程确定了View的宽高和要显示的位置后,就会执行draw绘制View的内容到手机屏幕上. 在详细介绍这三大流程之前,需要简单了解一下ViewRootImpl,View绘制的三大步骤

  • 浅谈Android Studio JNI生成so库

    1.新建Android studio工程 2.新建class:AppKey.java.主要为了保存密钥 代码块 package com...adminapp.lib.utils.jni; /** * Created by seven on 16/9/8. */ public class AppKey { static { System.loadLibrary("AppKey"); } public static native String WechatId(); public stat

  • 浅谈Android为RecyclerView增加监听以及数据混乱的小坑

    为 RecyclerView增加监听 1.在实现好的MyAdapter中写内部接口: public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public void setOnItemClickListener(OnItemClickListener onIt

随机推荐