Android数据存储安全实践

常用的非对称加密算法如RSA

Android操作系统自问世以来凭借其开放性和易用性成为当前智妙手机的主流操作系统之一,作为与人们关系最亲昵的智能设备,越来越多的通讯录、短信、视频等隐私数据以明文的要领保存在手机中,这些数据虽然有锁屏密码或者指纹保护,然则因为Android系统自身的安然性,专业人士可以绝不辛勤的获取得手机数据镜像,小我隐私面临泄露风险另一方面,日益繁荣的移动互联网利用也是基于用户数据和利用法度榜样构成,若何保护这些用户数据安然性是利用成长的基石跟着人们对数据安然注重,若何更好地保护用户数据成为移动利用开拓者的一大年夜寻衅

本文以Android开拓实践启程,由浅入深评论争论Android数据的存储、加密等实现措施供移动开拓进行参考并结合自身履历探究对Android数据安然的一些思虑

0×01常用数据存储措施及实例

文件

存储数据最直接的措施便因此文件的形式保存在手机中,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卡中寄放时,避免直接保存在根目录下,这样做是避免造成用户手机文件治理的纷乱;二是避免文件被改动、删除等

数据库

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();

SharedPreferences存储

SharedPreferences存储要领是Android中存储轻量级数据的一种要领,内部以Map要领进行存储,保存的数据以xml款式寄放在本地的/data/data/(packagename)/shared_prefs文件夹下SharedPreferencevalue支持Java的基础操作类型,如Boolean、Int,Float等,文件轻量级数据要求保存数据value大年夜小不能太大年夜,数据太大年夜会给系统GC、内存带来压力,以致造成Activity法度榜样卡顿

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默认值

0×02 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);

// 现在,获取数据并加密

[1] [2] [3]下一页

// 加密操作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);

}

AES 高档加密标准,用来替代DES的对称加密算法

//AES 加密[] encrypt([] data, [] key) {

{

KeyGenerator kgen = KeyGenerator.getInstance();// 创建AES的Key临盆者kgen.init(128, SecureRandom(key));// 128位的key临盆者SecretKey secretKey = kgen.generateKey();// 根据key天生密钥[] enCodeFormat = secretKey.getEncoded();// 返回基础编码款式的密钥SecretKeySpec aesKey = SecretKeySpec(enCodeFormat, );// 转换为AES密钥Cipher cipher = Cipher.getInstance();// 创建密码器cipher.init(Cipher., aesKey);// 初始化为加密模式的密码器

// 加密cipher.doFinal(data);

}(NoSuchAlgorithmException e){

e.printStackTrace();

} (NoSuchPaddingException e) {

e.printStackTrace();

}(InvalidKeyException e) {

e.printStackTrace();

} (IllegalBlockSizeException e) {

e.printStackTrace();

} (BadPaddingException e) {

e.printStackTrace();

}

;

}//AES 解密[] decrypt([] data, [] key) {

{

KeyGenerator kgen = KeyGenerator.getInstance();// 创建AES的Key临盆者kgen.init(128, SecureRandom(key));

SecretKey secretKey = kgen.generateKey();// 根据用户密码,天生一个密钥[] enCodeFormat = secretKey.getEncoded();// 返回基础编码款式的密钥SecretKeySpec aesKey = SecretKeySpec(enCodeFormat, );// 转换为AES专用密钥Cipher cipher = Cipher.getInstance();// 创建密码器cipher.init(Cipher., aesKey);// 初始化为解密模式的密码器

//解密cipher.doFinal(data);

} (NoSuchAlgorithmException e) {

e.printStackTrace();

} (NoSuchPaddingException e) {

e.printStackTrace();

} (InvalidKeyException e) {

e.printStackTrace();

} (IllegalBlockSizeException e) {

e.printStackTrace();

} (BadPaddingException e) {

e.printStackTrace();

}

;

}

对称加密特征是实现效率快,然则因为加/解密密钥相同,在密钥保存、分发、安然各方面呈现许多问题,例如密钥治理,密钥泄露基于此,将加密密钥和解密密钥分开,形成客户端端应用公钥加密,办事端用私钥解密的非对称加密,将加解密密钥分开,加密密钥不必担心泄露风险

RSA加解密实现

// 天生 public and private keysKeyPair buildKeyPair() NoSuchAlgorithmException {

keySize = 2048;

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance();

keyPairGenerator.initialize(keySize);

keyPairGenerator.genKeyPair();

}

//RSA 加密 [] encrypt(PrivateKey privateKey, [] data) Exception {

Cipher cipher = Cipher.getInstance();

cipher.init(Cipher., privateKey);

//加密cipher.doFinal(data);

}

//RSA 解密 [] decrypt(PublicKey publicKey, [] enData) Exception {

Cipher cipher = Cipher.getInstance();

cipher.init(Cipher., publicKey);

上一页[1] [2] [3]下一页

//解密cipher.doFinal(enData);

}

在常用数据加密措施中,平日也会碰到md5、sha-256算法等,然则这些算法是明文的hash值,哈希算法和加密算法的本色是是否可逆,即由密文经由过程运算获得明文分外留意,base64编码是一种编码款式,除了增添可读性难度没有任何安然性

0×03 存储安然进阶

在上文中先容了常用的Android数据存储要领和加密算法,经由过程直不雅的先容进入到Android存储安然中,在实际的利用中数据存储安然性问题是一个复制的系统性问题,不仅仅表现在开拓中,从数据布局到编码以及密钥的天生和治理都邑涉及到数据存储安然

文件的暗藏 Android创建暗藏文件或者文件夹,在文件名或者文件夹名字前加一个“.”号即可(这里是英文输入法下的.号),暗藏文件/文件夹可直接进行读写这是一个轻易被开拓者轻忽的问题,乍一看似乎没什么难度,问题在于开拓者和用户视角问题因为Android手机默认带文件查看器,是以用户可以轻松查看、改动sdcard目录下的文件,当应用暗藏文件是最大年夜的感化是避免用户误操作

密钥的保存 假如将密钥保存得手机文件中,或者经由过程硬编码的要领写在代码中,轻易被逆向出来,在平日环境下,采纳对称加密密钥必要保存在用户手机中,这和安然性想违抗平日最好的要领是不要保有密钥,经由过程固定命据或者字符串做加密密钥因子,例如用户独一账号属性等

编码要领 Android代码主要有Java编码,打包文件时Java代码打包成dex文件防到安装包文件中,然则dex文件轻易被逆向回smali代码或者Java文件虽然今朝肴杂和加壳以致是虚拟机保护(VMP)技巧已经很成熟,简单逆向事情无法获取代码逻辑和硬编码字符串,然则Java代码依然存在很高的安然风险是以,将加解密相关操作经由过程Native代码实现很有需要,不仅包管效率而且在so保护技巧之上安然性更高

0×04 Android数据安然思虑

跟着移动互联网深入成长,今朝移动利用正在发生质的改变比拟繁荣初始的粗狂、野蛮,现在的移动利用开始斟酌安然和质量,分外是当前我国互联网信息安然的大年夜形势,数据安然关乎企业和利用的生计的条件,保护利用数据安然至关紧张在Android数据存储安然中,因为Android系统的安然机制,用户获取root权限后可以造访手机所有目录,包括利用私有目录,是以,数据存储要斟酌到一个白盒情况,或者非可托情况这种环境下,数据加密的密钥成为关键一机一密、动态密钥、密钥白盒等手段各有优毛病一机一密必要保护密钥天生措施逻辑;动态密钥必要斟酌密钥时效性,有效性以及链路安然;密钥白盒因为今朝没有广泛认可,在兼容性安然性方面有待磨练

(后面有光阴针对一机一密、动态密钥、密钥白盒零丁先容)

上一页[1] [2] [3]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包