
根据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。
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- android开发中fragment获取context
在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Android开发中的输入合法性检验
Why ? 合法性检查对于程序的健壮性具有重要作用.在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好. What ? 合法性检查的目的在于确定边界.对于 ...
- 在android开发中使用multdex的方法-IT蓝豹为你整理
Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...
- 怎样实现了捕获应用中的日志在android开发中
怎样实现了捕获应用中的日志在android开发中,大家可研究一下. Process mLogcatProc = null; BufferedReader reader = null; try { mL ...
- Android开发中Eclispe相关问题及相应解决(持续更新)
1.Eclipse项目中的Android Private Libraries没有自动生成. 一般而言,在Android开发中,项目中引用到的jar包会放到项目目录中的libs中,引入库会放到Andro ...
- Android开发中的问题及相应解决(持续更新)
最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.特定业务需求下try cath ...
- 关于Android开发中的证书和密钥等问题
关于Android开发中的证书和密钥等问题 引言 除了Android发布应用签名时需要用到证书外,在进行google Map Api开发和Facebook SDK API开发等时都需要申请API Ke ...
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
随机推荐
- Swift类型推测在可选调用中的小提示
我们知道Swift中协议里也有对应于Objc中的可选方法或计算属性,当然协议必须以@objc伪指令修饰否则不可以哦. 如下示例: @objc protocol Transaction{ fun com ...
- ubuntu垃圾清理命令
ubuntu的空间莫名不够用了 通过系统自带的工具磁盘使用分析器,发现var文件下面的log100多个g,这个日志文件是可以删除的,然后tmp文件也是可以删除的. 1.sudo rm -rf /tmp ...
- python语言学习
前段时间要做视频直播需要编写自动模块,就考虑使用python脚本语言,python的好多语法都是很独特的,比如数据类型不需要预定义,缩进的方式等,另外功能也很强大,豆瓣就是用python写的.我写的部 ...
- 网卡配置和DNS配置,手动挂在nas存储的共享目录,网络相关其它操作命令,修改防火墙中的端口配置,resolv.conf配置详细介绍和网卡信息配置详细介绍
1. 网卡配置和DNS配置 若想服务器能够发邮件,需要让部署的服务器能够访问到外网环境.若部署的服务器访问不到外网,通过ping www.baidu.com的方式执行的时候,会出现以下问题: &q ...
- 最近邻查找算法kd-tree
http://blog.csdn.net/pipisorry/article/details/52186307 )选择特征(坐标轴)的方法 (2)以该特征的哪一个为界 (3)达到什么条件算法结束. ...
- 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条
混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...
- iOS中的两种搜索方式UISearchDisplayController和UISearchController
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayCon ...
- linux内核cfs浅析
linux调度器的一般原理请参阅<linux进程调度浅析>.之前的调度器cfs之前的linux调度器一般使用用户设定的静态优先级,加上对于进程交互性的判断来生成动态优先级,再根据动态优先级 ...
- Linux驱动基础:MSM平台AP/CP通信机制
点击打开链接 概述 MSM平台AP和CP封装到一个芯片,共享内容.所以之前也说过,高通的MSM解决方案中,CP的代码都是由AP放到指定地址的内存中以供CP运行.那上传完代码,CP开始跑之后,AP/CP ...
- Oracle分页存储过程及PLSQL中的调用脚本
撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经整理后终于通过测试,特分享给大家 测试步骤:1.运行创建包命令;2.运行创建存储过程命令;3.运行调用分页存储过程语句 测试环境:wind ...