1,关于安卓的剪切板风险.
手机里面的几乎所有的程序都能访问剪切板,甚至一些权限不高的APP都可以通过剪贴板功能获取我们复制或者剪切的信息。如果我们复制或者剪切账户密码信息,很容易就被嗅探泄密,原因是Android剪贴板的内容向任何权限的app开放 .如果是明文内容将会有信息泄露的风险,
首先可能有的人不是很熟悉,安卓的剪切板,我在先说一下安卓剪切板的用法.
1,先获取一个Manger的对象,和获取大多管理服务一样,在上下文的环境中调用 getSystemService(CLIPBOARD_SERVICE);获取一个剪切板管理器对象 取名为manager ,强转成ClipboardManager;
2.现在有一个管理器对象了,还有有一个存放剪切的内容的地方就是ClipData,这个对象不是new出来的而是通过静态方法ClipData.newPlainText(CharSequence label, CharSequence text),
ClipData.newIntent(CharSequence label, Intent intent),
ClipData.newUri(ContentResolver resolver, CharSequence label,
Uri uri) 获得的,分别对应存储的三种类型的数据: 文本,Intent,URL.
这里我以复制密码为例 :
// 剪切板数据
ClipData clip = ClipData.newPlainText("password", "helloworld123456");
3.现在剪切板管理对象有了,数据对象也有了,就把数据通过manager放进剪切板里面.
manager.setPrimaryClip(clip);
现在剪切板就使用完成了,这里我模拟复制了密码,现在剪切板里面的内容可以别任意APP读取,可想而知,这里应该是代码安全的注意点.
现在我们看一下如何读取剪切板的数据
如下代码可以在任意APP中读取剪切板的文字内容:
ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
ClipData cd2 = cm.getPrimaryClip();
str2 = cd2.getItemAt(0).getText().toString();
修改方法:
使用完clipboard及时清空,并避免使用剪贴板明文存储敏感信息我找了API但是没有找到清空的方法,这里我们可以这样给他清空
ClipData data = ClipData.newPlainText("password", "");
manager.setPrimaryClip(data);
一句话 : 使用安卓剪切板的时候注意清空,并避免使用剪贴板明文存储敏感信息!
2 安卓应用截屏安全风险
解析:我们开发程序的地方可能有的地方不想让用户截屏,或者不想让其他程序为我们截屏,需要注意的地方
解决:
加入一行代码就可以解决:
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
这样就能防止应用截屏了
3 Database配置模式安全风险
代码描述:安卓数据库创建代码。
代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
try {
database = openOrCreateDatabase("login.db",
Context.MODE_WORLD_READABLE, null);
database.execSQL(CREATE_TABLE);
} catch (SQLiteException e) {
e.printStackTrace();
}
et_name = (EditText) findViewById(R.id.et_name);
et_password = (EditText) findViewById(R.id.et_password);
btn_login = (Button) findViewById(R.id.btn_login);
解析:
Database配置模式安全风险源于:1)开发者在创建数据库(Database)时没有正确的选取合适的创建模式(MODE_PRIVATE、MODE_WORLD_READABLE以及MODE_WORLD_WRITEABLE)进行权限控制,从而导致数据库(Database)内容被恶意读写,造成账户密码、身份信息、以及其他敏感信息的泄露,甚至攻击者进一步实施恶意攻击。
如果在开发中没有使用正确的创建模式数据库(Database)文件,将会导致敏感信息泄露危害,如个人账户密码、身份信息以及金融账户等重要敏感信息。
**修改方法:
避免使用MODE_WORLD_WRITEABLE和MODE_WORLD_READABLE模式创建数据库(Database),权限不要开方太大,安全建议不要使用全局可读模式和全局可写模式创建数据库;**
4 安卓LogCat安全风险
代码描述:LogCat打印敏感调试信息。
解析:
Logcat是我们开发中最常用的了,用它打印信息,看程序是否执行到了这里,和输出一些信息帮助我们开发程序,可是我们在打印的过程中,常常可能会打印一些关键的信息,如用户名,密码,接获取到有价值的隐私敏感信息。.还有可能会让攻击者更加容易了解APP内部结构,方便破解和攻击.
修改方法:
禁止隐私信息的log,设置布尔值来控制打印信息,或者使用ProGuard等工具在APP的发行版本(release)中自动删除Log.d()和Log.v()对应的代码.
5 安卓debuggable安全风险
代码描述:安卓manifest.xml文件功能代码。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:debuggable="true">
解析:
android:debuggable=”true”应用存在debug调试风险
debuggable 属性有两个值“true|false”;
只有Android:debuggable=”true”时我们才可以在手机上调试Android程序。
但是当我们没在AndroidManifest.xml中设置其debug属性时:
使用Eclipse运行这种方式打包时其debug属性为true,使用Eclipse导出这种方式打包时其debug属性为法false.
在使用ant打包时,其值就取决于ant的打包参数是release还是debug.
6 SharedPreferences存储数据
解析:
在保存特殊数据时,没有对特殊数据进行加密处理,存在数据信息泄漏风险。开放的权限不要太大.
修改:
1.将Context.MODE_WORLD_READABLE改为Context.MODE_PRIVATE
Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
Context.MODE_PRIVATE:表示当前文件为默认操作模式,代表该文件是私有数据,只能被应用本身访问。
2.对存储的数据采用MD5方式加密
ps :
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、不可逆性:知道MD5值不会得到原数据.