副标题[/!--empirenews.page--]
【新产品上线啦】51CTO播客,随时随地,碎片化学习
一、数据存储安全
Android操作系统自问世以来凭借其开放性和易用性成为当前智能手机的主流操作系统之一,作为与人们关系最密切的智能设备,越来越多的通讯录、短信、视频等隐私数据以明文的方式保存在手机中,这些数据虽然有锁屏密码或者指纹保护,但是由于Android系统自身的安全性,专业人士可以毫不费力的获取到手机数据镜像,个人隐私面临泄露风险。另一方面,日益繁荣的移动互联网应用也是基于用户数据和应用程序构成,如何保护这些用户数据安全性是应用发展的基石。随着人们对数据安全重视,如何更好地保护用户数据成为移动应用开发者的一大挑战。
本文以Android开发实践出发,由浅入深讨论Android数据的存储、加密等实现方法供移动开发进行参考。并结合自身经验探讨对Android数据安全的一些思考。

二、常用数据存储方法及实例
1. 文件
存储数据最直接的方法就是以文件的形式保存在手机中,Android开发主要基于Java语言,因此,在文件读写等基本操作相同,文件操作和数据流来源于java.IO.*,但是对于Android而言,开发者需要注意一下几点:
(1) 文件目录 Android权限管理中各个应用程序有独立的存储空间,存储结构如下:

(2) 常见文件目录及路径
- /data/data/(packageName)/cache目录 应用缓存文件,目录获取方法:File cache = getCacheDir()
- /data/data/(packageName)/files目录,即应用一般文件,目录获取方法:File file = getFilesDir()
- /data/data/(packageName)/shared_prefs目录,存放应用SharedPreference文件目录位置
- /data/data/(packageName)/databases目录,应用数据库目录(SQLite)
- /storage/emulated/0/sdcard内置sd卡目录,获取方法:String sdcard = getInnerSDCardPath()
- /storage/extSdCard外置sd卡目录,获取方法:String exsdcard = Environment.getExternalStorageDirectory().getPath()
在Android手机中,获取默认sd卡目录方法明确,但是由于Android手机本身不一定支持外置sd卡,或者有/没有插入外置sd卡,因此在获取外sd卡时需要留心有坑,一是避免异常,二是分清内置和外置。
关键:位置。通过文件保存用户或者应用数据时,首先要遵循Android开发的规则,在应用目录中根据文件的类型选择保存的外置。在sd卡中存放时,避免直接保存在根目录下,这样做是避免造成用户手机文件管理的混乱;二是避免文件被修改、删除等。
2. 数据库
Android 数据库采用SQLite,SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统。Android开发中可以通过SQLiteOpenHelper或者自定义类SQLiteOpenHelper来实现数据存储查询修改的功能。此外SQLite数据库支持加密操作,通过sqlite3.exe或者SQLiteConnection均可对数据库进行加密操作。SQLiteEncrypt、SQLiteCrypt、SQLCipher等工具提供对数据库的加密操作,但是前两个需要收费,SQLCipher是开源工具,GitHub地址为: SQLCipher;通过SQLiteConnection类加密方法如下:
- SQLiteConnection conn = new SQLiteConnection("Data Source=TestDatabase.sqlite;Version=3;"); conn.SetPassword("password"); conn.open();
3. SharedPreferences存储
SharedPreferences存储方式是Android中存储轻量级数据的一种方式,内部以Map方式进行存储,保存的数据以xml格式存放在本地的/data/data/(packagename)/shared_prefs文件夹下。SharedPreference
- SharedPreferences pref = getSharedPreferences("test", MODE_PRIVATE); SharedPreferences.Editor editor=pref.edit(); SharedPreferences.Editor editor=pref.edit();editor.putString("name", "root");//保存字符串 editor.putInt("age", 12);//保存整型数据 editor.commit(); //putXXX 方法中第一个参数是key,第二参数为value
- SharedPreferences pref = getSharedPreferences(“setting”, 0);
- pref.getInt("key_name", -1); // getting Integer pref.getFloat("key_name", null); // getting Float pref.getLong("key_name", null); // getting Long //getXXX方法第一个参数表示key名称,第二个表示value默认值
三、Android加密算法及实现
DES,对称加密,同理有3DES,3DES在DES的基础上进行3重加密,以牺牲效率来提高加密安全性。
- //DES加密[] encrypt([] data,String key){
- {
- [] bkey = key.getBytes();
- // 初始化向量IvParameterSpec iv = IvParameterSpec(bkey);
- DESKeySpec desKey = DESKeySpec(bkey);
- // 创建密匙工厂,把DESKeySpec转换成securekey
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance();
- SecretKey securekey = keyFactory.generateSecret(desKey);
- Cipher cipher = Cipher.getInstance();
- // 用密匙初始化Cipher对象cipher.init(Cipher., securekey, iv);
- // 现在,获取数据并加密
- // 加密操作cipher.doFinal(data);
- } (Throwable e) {
- e.printStackTrace();
- }
- ;
- }
- //DES解密[] decrypt([] src, String key) Exception {
- [] bkey = key.getBytes();
- // 初始化向量IvParameterSpec iv = IvParameterSpec(bkey);
- // 创建一个DESKeySpec对象DESKeySpec desKey = DESKeySpec(bkey);
- // 创建密匙工厂SecretKeyFactory keyFactory = SecretKeyFactory.getInstance();
- // 把DESKeySpec对象转换成SecretKey对象SecretKey securekey = keyFactory.generateSecret(desKey);
- // Cipher对象实际完成解密操作Cipher cipher = Cipher.getInstance();
- // 用密匙初始化Cipher对象cipher.init(Cipher., securekey, iv);
- // 真正开始解密操作cipher.doFinal(src);
- }
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|