Android开发中的安全

根据Android四大框架来解说安全机制

  •   代码安全

java不同于C/C++,java是解释性语言,存在代码被反编译的隐患;

默认混淆器为proguard,最新版本为4.7; proguard还可用来压缩、优化java字节码,删除无用的类、字段、方法、属性、注释等。

配置方法为在Android.mk中设置LOCAL_PROGUARD_FLAG_FILES
:= proguard.flags

packages/apps/Launcher2/proguard.flags

//特定方法

-keep class com.android.launcher2.Launcher {

  public void previousScreen(android.view.View);

  public void nextScreen(android.view.View);

  public void launchHotSeat(android.view.View);

}

//特定类,“$”表示后面的类是前面的类的内部类

-keep class com.android.launcher2.AllApps3D$Defines {

  *;

}

-keep class com.android.launcher2.ClippedImageView {

  *;

}

  • 接入权限

权限主要用来对应用的操作增加限制,防止恶意应用进行非法操作给用户造成敏感数据泄漏和设备被非法控制,防止恶意收费等;

Android的接入权限

Normal权限

Dangerous权限

signatureOrSystem权限

Signature权限

框架层权限定义位置

frameworks/base/core/res/ AndroidManifest.xml权限可用于整个应用、Activity、Service等。

创建接入权限和权限组

<permission android:name=“android.permission.GET_ACCOUNTS” 
 

android:permissionGroup=“android.permission-group.ACCOUNTS”

android:protectionLevel="normal“

android:description=“@string/permdesc_getAccounts”

android:label="@string/permlab_getAccounts" />

<permission-group android:name=“android.permission-group.STORAGE”

android:label="@string/permgrouplab_storage“

android:description="@string/permgroupdesc_storage" />

  • 应用权限的设置

共享用户ID即共用一个进程

Android源代码树携带的系统证书包括“media”、“platform”、“shared”、“testkey”等,其中“media”证书用于多媒体、下载场景中;“platform”证书用于系统场景中;“shared”证书用于启动器、电话簿场景中;“testkey”证书用于开发场景中,这些证书位于build/target/product/security目录下;

目前支持的“sharedUserId”属性包括“com.android.cts.shareduid”、“com.android.cts.process.uidpid_test”、“android.uid.system”、“com.android.uid.test”、“android.uid.calendar”
、“android.media”、“com.android.framework.externalsharedpermstestapp”、“android.uid.shared”、“android.uid.phone”等。常用的包括“android.uid.system”、“android.media”、“android.uid.shared”等。

设置应用权限

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

权限验证

Android提供了多个方法可用于验证调用方是否具有相应的权限。

如果调用方拥有相应的权限,则权限验证的返回值为PackageManager. PERMISSION_GRANTED否则返回PackageManager.PERMISSION_DENIED。

示例

private int enforceAccessPermission() {

int ret =

mContext.checkCallingOrSelfPermission("android.permission.BIND_WALLPAPER ");

return ret;

}

  • 数字证书

Android的数字证书是免费的,分调试模式和发布模式两种;

通过命令行和Eclipse可以生成发布模式的数字证书;

在命令行方式下利用Keytool来生成数字证书,并利用Jarsigner来为APK进行数字签名;

使用ADT Export Wizard进行签名;

只有同一包名且采用同一数字证书的应用才被认为是同一个应用;

数字证书的最大用途是应用升级和设置应用间通信的权限;

Keytool生成数字证书

keytool -genkey -v -keystore android.keystore -alias miaozl-keyalg RSA -validity 20000

“keystore android.keystore”表示生成的证书为“android.keystore”,可以加上路径(默认在用户主目录下);“alias
miaozl”表示证书的别名是“miaozl”;“keyalg
RSA”表示采用的RSA算法;“validity
20000”表示证书的有效期是20000天。另外通过keypass可以设置数字证书私钥的密码,通过keysize可以设置算法的位长,默认为1024比特,推荐2048比特及更长,通过storepass可以设置证书的密码。

Jarsigner进行数字签名

jarsigner -verbose -keystore android.keystore demo.apk  证书别名

接下来jarsigner会提示输入密钥库的口令和证书别名的口令,全部输入后,即可完成签名

查看数字证书签名

#jarsigner -verify -verbose -certs demo.apk

  • 网络安全

加密算法(敏感数据)

DES(对称)、3DES(对称)、RSA(非对称)、MD5、RC2/RC4(对称)、IDEA、AES、BLOWFISH等

Web服务(HTTP层)

三种手段WS-Security、SSL、数字签名。目前ksoap不支持WS-Security

TCP层

SSL、TSL

数据链路层

WAPI

  • 数据库安全

Android采用的SQLite目前采用明文存储数据;安全涉及加密、读写、搜索等。

加密方法

加密算法(实现方法参考网上)

权限设置

权限设置

android:permission

android:readPermission

android:writePermission

读写权限示例

<provider

            android:name=".provider.AttachmentProvider"

            android:authorities="com.android.email.attachmentprovider"

            android:multiprocess="true"

            android:grantUriPermissions="true“  

android:readPermission="com.android.email.permission.READ_ATTACHMENT"/>

  • 数据库安全--搜索

<provider android:name="SuggestionsProvider"

            android:readPermission="android.permission.READ_SMS"

            android:authorities="com.android.mms.SuggestionsProvider" >

            <path-permission

                    android:pathPrefix="/search_suggest_query"

                    android:readPermission="android.permission.GLOBAL_SEARCH" />

            <path-permission

                    android:pathPrefix="/search_suggest_shortcut"

                    android:readPermission="android.permission.GLOBAL_SEARCH" />

        </provider>

  • 虚拟机

通常情况下,每个应用均拥有一个虚拟机。

通常情况下,应用间无法相互访问私有数据。

访问数据的方法为:

文件方式

数据库权限开放

配置文件开放

Intent通信

  • 文件访问控制

Android在权限管理上应用了Linux的ACL(Access
Control List)权限机制,而非早期Unix采用的UGO权限机制。

分区层面

在系统运行时,最外层安全保护是由Linux系统提供的,其中system.img所在的分区是只读的,不允许用户写入,而data.img所在的分区是可读写的,用于存放用户数据。

分区的用户权限在init.rc中定义。

单独文件

单独文件访问权限控制分群组、用户、权限。

权限分可读、可写、可执行。

命令:chown\chgrp\chmod。

时间: 2024-07-30 15:36:07

Android开发中的安全的相关文章

解析json数据-android 开发中 json解析问题出错啊

问题描述 android 开发中 json解析问题出错啊 {"msg":1,"msgbox":"返回歌手分类!","data":"[ { "rownum":"11","id":"1047","userName":"敖日格勒","picurl":"mobile1_1047

在android开发中如何搜索下载国外精美的图标资源

问题描述 在android开发中如何搜索下载国外精美的图标资源 在安卓开发中,图标是我们经常和必须用到的东西,但是自己设计图标又不在行,只能在网上搜索,但是国内很多网站的图标资源是收费的,如何找到国外的图标资源站,谢谢! 解决方案 https://www.iconfinder.com/

Android开发中比较耗时的一些操作小结

  这篇文章主要介绍了Android开发中比较耗时的一些操作小结,本文根据实际开发经验总结了6条比较耗时的编程操作,请大家注意下,需要的朋友可以参考下 在Android软件开发过程中,经常遇到耗时操作.为了使手机app运行流畅,耗时操作需要在新的一个线程中完成.那么,Android手机应用开发中,耗时操作有哪些呢?下面来总结一下. 1.下载文件操作 2.网络连接操作(尤其是网络不好的时候) 3.音频格式转换操作 4.文件操作 5.比较大的数据的初始化操作 6.sleep函数等 注: 具体的功能还

Android开发中遇到端口号占用问题解决方法

  这篇文章主要介绍了Android开发中遇到端口号占用问题解决方法,本文给出了一个简洁实用的方法来解决这个烦人的问题,需要的朋友可以参考下 Android开发的时候经常遇到端口号被占用的问题,经常使程序无法运行,很烦人.我总结了一个很好的方法,非常实用.方法如下: (1):方法1: 第一步:1:netstat -ano | findstr "5037" 第二步:2:TASKLIST | findstr "9292" (2):方法2: 首先进入目录下:E: 代码如下

Android开发中使用SQLite 数据库

SQPte 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 SQPte. SQPte 由以下几个组件组成:SQL 编译器.内核.后端以及附件.SQPte 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展 SQPte 的内核变得更加方便. 图 1. SQPte 内部结构 开发中使用SQLite 数据库-android sqlite数据库"&g

android开发中url的openConnection()不能被IDE识别怎么办?

问题描述 android开发中url的openConnection()不能被IDE识别怎么办? new AsyncTask() { @Override protected String doInBackground(String... params) { try { URI url = new URI(params[0]); URLConnection connection=url.openConnection();//这行的openConnection显示为红色 long total = co

android开发-在Android开发中打开网络设置出错,点击后直接退出而不是打开网络设置 怎么会事啊

问题描述 在Android开发中打开网络设置出错,点击后直接退出而不是打开网络设置 怎么会事啊 private void showSetNetworkDialog() { AlertDialog.Builder builder = new Builder(this); builder.setTitle("设置网络"); builder.setMessage("网络错误请检查网络链接"); builder.setPositiveButton("设置网络&qu

android-请问在Android开发中如何只获得手机桌面上的App列表

问题描述 请问在Android开发中如何只获得手机桌面上的App列表 我现在能够获得手机中安装的所有App列表,但我只想获得手机桌面上的App列表,请问应该如何解决? 解决方案 第一步:建立基本数据:PakageMod.java public class PakageMod { public String pakageName;//应用的包名 public String appName;//应用的名称 public Drawable icon;//应用图标 public PakageMod()

android-求助:Android 开发中eclipse4.2.0和ndk-r10配置问题

问题描述 求助:Android 开发中eclipse4.2.0和ndk-r10配置问题 450248298_989119.png) 解决方案 Eclipse中配置NDK R10环境 解决方案二: ni zixianh 解决方案三: 图片挂掉了..重新传一个吧

Android开发中include控件用法分析_Android

本文实例讲述了Android开发中include控件用法.分享给大家供大家参考,具体如下: 我们知道,基于Android系统的应用程序的开发,界面设计是非常重要的,它关系着用户体验的好坏.一个好的界面设计,不是用一个xml布局就可以搞定的.当一个activity中的控件非常多的时候,所有的布局文件都放在一个xml文件中,很容易想象那是多么糟糕的事情!笔者通过自身的经历,用include控件来解决这个问题,下面是一个小例子,仅仅实现的是布局,没有响应代码的设计. user.xml文件内容如下: <