Android开发规范:App安全规范

Android开发规范:App安全规范
我的新书《Android App开发⼊门与实战》已于2020年8⽉由⼈民邮电出版社出版,欢迎购买。
⽂章⽬录
加壳
加壳也就是加固,或者叫做加密,app打包成apk后,通过加壳技术给app上了⼀层保护,⽤来预防app被破解、反编译、⼆次打包等。
免费的加固应⽤有乐固、阿⾥聚安全、360加固宝等;
收费的有梆梆、爱加密、以及⼀些免费加固应⽤的收费版本。烘干机组
以下是相关机构发布的安全报告:
65%的移动APP⾄少存在1个⾼危漏洞,平均每1个APP就有7.32个漏洞; 88%的⾦融类APP存在内存敏感数据泄露问题;
每10个娱乐类APP就有9个⾄少包含⼀个⾼危漏洞; ——《FreeBuf:2017年度移动App安全漏洞与数据
泄露现状报告》
所以加壳是重中之重,没了壳等于裸奔。建议如果有条件的话还是选择收费版本的加壳软件,毕竟加密的强度会⾼些,⽽且还有合同保障。
组件外露
android四⼤组件Activity、Service、ContentProvider、Broadcast Receiver,有⼀个android:exported属性。如果是false,那么只能在同⼀个应⽤程序组件间或带有相同⽤户ID的应⽤程序间才能启动或绑定该服务;如果是true,这该组件可以被任意应⽤启动或执⾏,这样就会有组件被恶意调⽤的风险。
<activity
android:name="com.androidwind.safe.DemoActivity"
android:exported="false"
android:label="@string/app_name">
</activity>
如果组件没有包含过滤器intent-filter,那么android:exported属性的值默认是false;如果组件包含了⾄少⼀个intent-filter,那么android:exported属性的值默认就是true。
如果必须暴露这些组件,那么需要添加⾃定义的permission权限来进⾏访问控制。
<activity
立式干粉搅拌机android:name="com.androidwind.safe.DemoActivity"
android:exported="true"
android:label="@string/app_name"
android:permission="com.androidwind.permission.demoPermission">
</activity>
外部应⽤如果想直接打开DemoActivity,需要在l配置:
<uses-permission name="com.androidwind.permission.demoPermission"/>
webview
由于WebView在低系统版本中存在远程代码执⾏漏洞,如JavascriptInterface,中间⼈可以利⽤此漏洞执⾏任意代码。
所以app的targetSdkVersion需要⼤于17,也就是Android版本⾄少要4.2。
另外需要注意将wenview⾃动保存密码功能关闭:
logcat⽇志
有的时候为了⽅便跟踪⽤户操作反馈,app端往往会把⽇志保存在sd卡上,然后在适当的机会将⽤户⽇志上传到服务器,然后开发⼈员可以查看⽤户⽇志信息,分析相关的问题。
但是这样做有个很⼤的风险就是⽇志⾥⾯往往包含了app的⼀些敏感信息,⽐如url地址、参数、还有类名,以及⽤户的使⽤记录,包括名称、id、聊天记录等等。
虽然app可以做⼀些操作来减少风险,⽐如定期删除⽇志等,但是毕竟这些信息还是外露了,可能被别有⽤⼼的⼈利⽤。
所以我们对⽇志输出的要求是:
1. 不存储在外部,⽐如⼿机存储空间;
全自动真石漆生产设备2. 测试环境可以在logcat输出⽇志信息;
3. 正式环境屏蔽所有⽇志输出。包括logcat和⼿机外部存储;
4. 不使⽤System.out输出⽇志;
另外,项⽬中⽇志输出需要统⼀使⽤同⼀个⽇志管理类,不应该存在多个输出⽇志的类。
⽹络请求
所有⽹络请求必须使⽤https。⽽且在Android P系统中,默认使⽤加密连接,所有未加密的连接会受限:
Google表⽰,为保证⽤户数据和设备的安全,针对下⼀代 Android 系统(Android P)
的应⽤程序,将要求默认使⽤加密连接,这意味着 Android P 将禁⽌ App 使⽤所有未加密的连接,因此运⾏ Android P
系统的安卓设备⽆论是接收或者发送流量,未来都不能明码传输,需要使⽤下⼀代(Transport Layer
Security)传输层安全协议,⽽ Android Nougat 和 Oreo 则不受影响。
如果使⽤http连接,那么会返回如下错误信息:
//http在使⽤HttpUrlConnection时遇到的异常 : java.io.IOException:
Cleartext HTTP traffic to **** not permitted //http在使⽤OkHttp时遇到的异常
java.UnknownServiceException: CLEARTEXT communication ** not
permitted by network security policy
api接⼝
参考:
so⽂件
通常简单的做法是将密钥等敏感信息保存在Java代码中,⽐如直接写在静态变量⾥。但是这样很容易被编译破解,即使代码有混淆。
我们考虑可以将⼀些敏感信息,⽐如密码、密钥等,通过cpp代码,保存在so⽂件中。这样会增加敏感信息被破解的难度。
金银卡纸需要说明的是,如果使⽤so⽂件,那么so⽂件也需要加壳。
github上有⼀个可以⾃动⽣成加密so库的插件,这样通过在gradle⾥配置需要加密的数据,即可加密保存到so库,并且⾃动⽣成对应的Java接⼝。
cipher.so {
keys {
数据库 {
防身报警器value = '你好数据库!,?'
}墨菲氏滴管
hello {
value = 'Hello From Cipher.so?'        }
}
//    signature = '1708229056'
encryptSeed = 'HelloSe1cretKey'
}

本文发布于:2024-09-23 16:24:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/278265.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:加密   需要   组件   代码   存在
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议