{"action":"opened","issue":{"url":"https://api.github.com/repos/Anonyp/Anonyp.github.io/issues/1","repository_url":"https://api.github.com/repos/Anonyp/Anonyp.github.io","labels_url":"https://api.github.com/repos/Anonyp/Anonyp.github.io/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/Anonyp/Anonyp.github.io/issues/1/comments","events_url":"https://api.github.com/repos/Anonyp/Anonyp.github.io/issues/1/events","html_url":"https://github.com/Anonyp/Anonyp.github.io/issues/1","id":171347355,"number":1,"title":"Android项目安全注意事项和解决方案","user":{"login":"Anonyp","id":8921988,"avatar_url":"https://avatars.githubusercontent.com/u/8921988?v=3","gravatar_id":"","url":"https://api.github.com/users/Anonyp","html_url":"https://github.com/Anonyp","followers_url":"https://api.github.com/users/Anonyp/followers","following_url":"https://api.github.com/users/Anonyp/following{/other_user}","gists_url":"https://api.github.com/users/Anonyp/gists{/gist_id}","starred_url":"https://api.github.com/users/Anonyp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Anonyp/subscriptions","organizations_url":"https://api.github.com/users/Anonyp/orgs","repos_url":"https://api.github.com/users/Anonyp/repos","events_url":"https://api.github.com/users/Anonyp/events{/privacy}","received_events_url":"https://api.github.com/users/Anonyp/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2016-08-16T07:58:04Z","updated_at":"2016-08-16T07:58:04Z","closed_at":null,"body":"> 在个人和公司开发的项目发布后，作为软件工程师最担心的就是代码安全(虽说现今而言，技术已没有什么秘密，聪明人很多，你的功能可能别人稍加研究就能不看代码也能实现(黑科技除外)，但实现归实现，实现的方案，思路，性能这些是别人无法复制的)。\r\n> 还有就是项目发布后项目中一些数据安全，等方面，都值得我们考虑，思索。\r\n\r\n## 1. AndroidManifest\r\n\r\nAndroidManifest中的android:allowBackup属性，默认为true，如无特殊情况，可以改为false，防止数据被备份。\r\n\r\n[官方文档](https://developer.android.com/guide/topics/manifest/application-element.html)    [安全说明](http://www.freebuf.com/articles/terminal/60778.html)\r\n\r\n> Android API Level\r\n> 8及其以上Android系统提供了为应用程序数据的备份和恢复功能，此功能的开关决定于该应用程序中AndroidManifest.xml文件中的allowBackup属性值[1]\r\n> ，其属性值默认是True。当allowBackup标志为true时，用户即可通过adb backup和adb\r\n> restore来进行对应用数据的备份和恢复，这可能会带来一定的安全风险。\r\n>\r\n> Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB\r\n> 调试开关的人从Android手机中复制应用数据到外设，一旦应用数据被备份之后，所有应用数据都可被用户读取；adb\r\n> restore\r\n> 容许用户指定一个恢复的数据来源（即备份的应用数据）来恢复应用程序数据的创建。因此，当一个应用数据被备份之后，用户即可在其他Android手机或模\r\n> 拟器上安装同一个应用，以及通过恢复该备份的应用数据到该设备上，在该设备上打开该应用即可恢复到被备份的应用程序的状态。\r\n>\r\n> 尤其是通讯录应用，一旦应用程序支持备份和恢复功能，攻击者即可通过adb backup和adb\r\n> restore进行恢复新安装的同一个应\r\n> 用来查看聊天记录等信息；对于支付金融类应用，攻击者可通过此来进行恶意支付、盗取存款等；因此为了安全起见，开发者务必将allowBackup标志值\r\n> 设置为false来关闭应用程序的备份和恢复功能，以免造成信息泄露和财产损失。\r\n\r\n## 2. 防截屏\r\n\r\n在登录和注册，或修改密码等敏感数据操作时，如果手机中有后台默认隐藏截屏的应用，在输入是一直截屏，就有可能盗取敏感数据信息。\r\n\r\n解决方案：\r\n\r\n在Activity onCreate 中加入：\r\n\r\n```\r\ngetWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);\r\n\r\n```\r\n\r\n## 3. 本地数据加密\r\n\r\n开发过程中少不了通过 android.content.SharedPreferences 进行一些数据和变量存储，但是这些数据很容易被读取到，所以需要应对数据进行加密处理。\r\n\r\n解决方案：\r\n\r\n1. 自己进行数据加密。\r\n2. 通过第三方进行加密，在此推荐：[Hawk](https://github.com/orhanobut/hawk)\r\n\r\n## 4. 隐藏日志\r\n\r\n如果开发项目搭建之初就对项目整体考虑周到了，我觉得这点应该不用，但是如果项目框架搭建之初没进行此方面的考虑，就得自行处理了，具体方案如下：\r\n\r\n先在当前Module下的build.gradle中的buildTypes方法中代码至如下(之前自己的配置代码不变)：\r\n\r\n```\r\nbuildTypes {\r\n    release {\r\n        buildConfigField \"boolean\", \"LOG_DEBUG\", \"false\"\r\n        \r\n        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\r\n    }\r\n}\r\n\r\n```\r\n\r\n然后在proguard-rules.pro文件中加入：\r\n\r\n```\r\n-assumenosideeffects class android.util.Log{\r\n    public static boolean isLoggable(java.lang.String, int);\r\n    public static int v(...);\r\n    public static int i(...);\r\n    public static int w(...);\r\n    public static int d(...);\r\n    public static int e(...);\r\n}\r\n\r\n```\r\n\r\n至此，可以完全隐藏android.util.Log的所有日志。\r\n\r\n## 5. 混淆\r\n\r\n先在当前Module下的build.gradle中的buildTypes方法中修改代码至如下(之前自己的配置代码不变)：\r\n\r\n```\r\nbuildTypes {\r\n    release {\r\n        minifyEnabled false\r\n    }\r\n}\r\n```\r\n\r\n然后再在proguard-rules.pro文件中加入引用的jar、library等进行排除操作。\r\n\r\n在此推荐一个Android Studio插件，免去自己一个一个添加的麻烦：[AndroidProguardPlugin](https://github.com/zhonghanwen/AndroidProguardPlugin) 一键生成项目混淆代码插件(此插件还在继续完善中，如有没有添加的库，可以直接联系插件开发者进行添加)\r\n\r\n**以上是总结的一些安全方面的方案，希望有用，当然，代码方面还可以进行项目加壳处理，进一步进行安全保护，具体加壳可以利用一些第三方平台等，这里不一一列举，自行Baidu，Google。**"}}
{"actor":{"display_login":"Anonyp"}}