有幸参加了淘宝网组织的工程师之夜第二轮无线之夜, 与boss铁花和乔倩同学一起做了个 短信的收读程序 , 重点在体现安全性上, 在程序过程中有点小收获,记录于此, 第一次做完整的android 程序, 没看什么参考,单纯个人理解 ,这里的安全我分三块,APK反编译、activity安全,数据库安全。 

 

APK反编译, 在APK反编译上,我们使用了淘宝两套反编译工具, 一套代码保护,一套DEX文件保护,使用通过So文件加载, 以及不能被反编译的Dex文件 等,由于涉及到淘宝产品安全, 具体就不细讲了 。

 

activity 安全,在这一块上我们做了几个内容,

  1.     第一个是所有程序入口必须是输入密码界面,用户不能从其他方式进入到程序的其他activity中

    使用方法:

  • 所有activity 在intent 跳转之后,必须finish ,一开始程序即是这么设计,后来发现,这样写用户体验会非常不好,在程序中,用户一旦点返回就会整个退出程序,后面改了操作, 在程序中intent 跳转 不 finish , 一旦activity 要跳转到输密码的 activity , 不论从哪儿过来, 输密码的activity 都会结束所有activity 并 直接 kill 进程, 这样下次用户进来之后 ,必须先进入输入密码的activity中 
  • 还有一种情况是用户在 内部 页面,点击 home 键,回退到页面 ,在进入程序, 这时我们可以在 onResume 方法中查看如果intent没有特定参数带入或没有intent(内部跳转的intent会顺带来一个 带加密参数的intent),那么即跳转到 main页面,要求输入密码 
  • 总之概括一句话, 不论用户如何退出,都会结束所有activity 后在退出 ,即下次再进来会要求输入密码 

     2.     第二所有intent 必须带加密参数才容许跳转

            在程序内部传递, 或通知栏信息进入的时候, 必须带上指定的加密参数, 才容许跳转,否则重新调回到主页面,要求输入密码 。这块主要是放 伪造通知栏信息 进入程序内容页面

     3.    第三是在main 页面,onStart(),方法中查看当前 activity 栈中 第一个activity 是否是程序的activity , 如果不是,根据activity 生命周期的看法, back前的activity 很可能是攻击者的activity在获取你的密码 。这个是防activity劫持的基础

    4 .  所有 intent 均为点对点跳转, 不使用广播事件。 为了防止 intent 事件被监听 

    5 . (在manifest文件中将所有activity 设置为 android:launchMode="singleTask" 并且不配置 main filter ,作用是 用户按home 键退出之后 ,在进入肯定回到首屏,这个方法其实有点点问题,不合符google的开发规范, 建议谨慎使用,另一个方法, 建议在onStop方法中 finish 这样也方便) 1 和 5 的作用是  不论用户如何退出,都会结束所有activity 后在退出 ,即下次再进来会要求输入密码 ,这个具体怎么做 参考另一篇博文 http://www.taobaotest.com/blogs/2337



1 2 3 4 点 加起来, 基本可以防止activity劫持的情况,这点我各种测试中验证了一把, 是可行的。 这一块上,也只是测试 ,希望有想法的同学给我留言,探讨下

 

    

数据库安全 

        1 、 防暴力破解

            对于爆破而言,我们需要做的是如何缓解攻击者的破解时间,该程序采用的方法是如果输错密码 ,即会退出程序,需要在点击图标进入,这样尝试一个密码,至少需要2s , 按照我上回8位 数字密码 爆破 每秒 300-500次 破解,需要35个小时才能遍历完毕的速度, 如果用户设置一个6位 纯数字密码, 攻击者要暴力破解,则至少需要400d 。

        2 、用户名和密钥绑定 

            加解密的密钥设置为通过用户密码几次转码后得到, 跟随用户密码动态绑定,如果用户密码更改, 那么加密内容也必须重新拿出来解密后在加密

        3 、防止数据库注入

            防止数据库注入,所有操作均使用sqllite 的封装函数, 并且对search函数中的参数做强制类型转义

      2点 的作用体现在,即使攻击者攻破一台手机, 也无法使用 该台手机的密钥去做第二台的破解,另外,就算攻击者拿到了数据库, 把密码字段删除后,也无法通过重置密码来获取短信内容 。