当前位置: 首页 > 科技观察

Android数据存储安全实践

时间:2023-03-15 19:02:24 科技观察

1.数据存储安全Android操作系统自问世以来就以其开放性和易用性成为智能手机的主流操作系统之一。作为与人关系最密切的智能设备,越来越多的联系人、短信、视频等隐私数据以明文形式存储在手机中。虽然这些数据有锁屏密码或指纹保护,但由于安卓系统本身的安全性,专业人士也可以轻松获取。手机数据镜像,个人隐私有泄露风险。另一方面,日益繁荣的移动互联网应用也是以用户数据和应用程序为基础的。如何保护这些用户数据的安全是应用开发的基石。随着人们对数据安全的关注度越来越高,如何更好地保护用户数据已经成为移动应用开发者面临的一大挑战。本文从Android开发实践出发,由浅入深地探讨Android数据存储和加密的实现方法,以供移动开发参考。并结合自己的经历谈谈对Android数据安全的一些思考。二、常用的数据存储方式及示例1、将数据存储在文件中最直接的方式是以文件的形式保存在手机中。Android开发主要基于Java语言。因此,读写文件等基本操作是相同的,文件操作和数据流都来自java.IO.*,但是对于Android,开发者需要注意以下几点:(1)文件目录Android权限管理有独立的存储空间,存储结构如下:(2)普通文件目录和路径/data/data/(packageName)/cache目录应用缓存文件,目录获取方式:filecache=getCacheDir()/data/data/(packageName)/files目录,即应用通用文件,目录获取方法:Filefile=getFilesDir()/data/data/(packageName)/shared_prefs目录,存放应用SharedPreference文件目录位置/data/data/(packageName)/databases目录,应用数据库目录(SQLite)/storage/emulated/0/sdcard内置sd卡目录,获取方式:Stringsdcard=getInnerSDCardPath()/storage/extSdCard外置sd卡目录,交流电获取方法:Stringexsdcard=Environment.getExternalStorageDirectory().getPath()在Android手机中,获取默认sd卡目录的方法很明确,但是由于Android手机不一定支持外接SD卡,或者有/没有插入外置SD卡,获取外置SD卡需要注意陷阱。一是避免异常,二是区分内置和外置。关键:位置。通过文件保存用户或应用数据时,首先要遵循Android开发规则,根据应用目录下的文件类型选择外部存储。存储在SD卡中时,避免直接保存在根目录下。这是为了避免用户手机的文件管理混乱;二是避免文件修改和删除。2.数据库Android数据库使用SQLite,它是一种内置于移动设备的轻量级数据库,是一种符合ACID(原子性、一致性、隔离性和持久性)的关系型数据库管理系统。在Android开发中,可以使用SQLiteOpenHelper或者自定义类SQLiteOpenHelper来实现数据存储查询修改的功能。另外,SQLite数据库支持加密操作,可以通过sqlite3.exe或者SQLiteConnection对数据库进行加密。SQLiteEncrypt、SQLiteCrypt、SQLCipher等工具提供了对数据库的加密操作,但前两个需要收费。SQLCipher是一款开源工具,GitHub地址为:SQLCipher;通过SQLiteConnection类加密的方法如下:SQLiteConnectionconn=newSQLiteConnection("DataSource=TestDatabase.sqlite;Version=3;");conn.SetPassword("password");conn.open();3。SharedPreferences存储SharedPreferences存储方式是Android中一种轻量级数据存储方式,内部以Map的形式存储,保存数据以xml格式存储在本地/data/data/(packagename)/shared_prefs文件夹中。SharedPreferenceSharedPreferencespref=getSharedPreferences("test",MODE_PRIVATE);SharedPreferences.Editoreditor=pref.edit();SharedPreferences.Editoreditor=pref.edit();editor.putString("name","root");//保存字符串编辑器.putInt("age",12);//保存整数数据editor.commit();//putXXX方法中第一个参数为key,第二个参数为valueSharedPreferencesspref=getSharedPreferences("setting",0);pref.getInt("key_name",-1);//gettingIntegerpref.getFloat("key_name",null);//gettingFloatpref.getLong("key_name",null);//gettingLong//getXXX方法的第一个参数代表thekey名称,第二个表示默认值value3。Android加密算法和DES的实现,对称加密,类似的还有3DES,3DES在DES的基础上进行三重加密,以牺牲效率为代价提高加密安全性.//DES加密[]encrypt([]data,Stringkey){{[]bkey=key.getBytes();//初始化向量IvParameterSpeciv=IvParameterSpec(bkey);DESKeySpecdesKey=DESKeySpec(bkey);//创建密钥工厂,ConvertDESKeySpectosecurekeySecretKeyFactoryke??yFactory=SecretKeyFactory.getInstance();SecretKeysecurekey=keyFactory.generateSecret(desKey);Ciphercipher=Cipher.getInstance();//用密钥初始化Cipher对象cipher.init(Cipher.,securekey,iv);//现在,获取数据并加密//加密操作cipher.doFinal(data);}(Throwablee){e.printStackTrace();};}//DES解密[]decrypt([]src,Stringkey)Exception{[]bkey=key.getBytes();//初始化向量IvParameterSpeciv=IvParameterSpec(bkey);//创建DESKeySpec对象DESKeySpecdesKey=DESKeySpec(bkey);//创建密钥工厂SecretKeyFactoryke??yFactory=SecretKeyFactory.getInstance();//SetConverttheDESKeySpecobjectintoSecretKeyobjectSecretKeysecurekey=keyFactory.generateSecret(desKey);//Cipher对象实际完成解密操作Ciphercipher=Cipher.getInstance();//用密钥初始化Cipher对象cipher.init(cipher.,securekey,iv);//真正开始解密操作cipher.doFinal(src);}AES高级加密标准,用于替代DES的对称加密算法//AESencryption[]encrypt([]data,[]key){{KeyGeneratorkgen=KeyGenerator.getInstance();//创建AESKeyproducerkgen.init(128,SecureRandom(key));//128位keyproducerSecretKeysecretKey=kgen.generateKey();//根据key[]enCodeFormat生成key=secretKey.getEncoded();//返回基本编码格式的密钥SecretKeySpecaesKey=SecretKeySpec(enCodeFormat,);//转换为AES密钥Ciphercipher=Cipher.getInstance();//创建密码cipher.init(Cipher.,aesKey);//以加密方式初始化密码//加密cipher.doFinal(data);}(NoSuchAlgorithmExceptione){e.printStackTrace();}(NoSuchPaddingExceptione){e.printStackTrace();}(InvalidKeyExceptione){e.printStackTrace();}(IllegalBlockSizeExceptione){e.printStackTrace();}(BadPaddingExceptione){e.printStackTrace();};}//AES解密[]decrypt([]data,[]key){{KeyGeneratorkgen=KeyGenerator.getInstance();//创建AESKeyproducerkgen.init(128,SecureRandom(key));SecretKeysecretKey=kgen.generateKey();//根据用户密码生成密钥[]enCodeFormat=secretKey.getEncoded();//返回基本编码格式的密钥SecretKeySpecaesKey=SecretKeySpec(enCodeFormat,);//转换为AES私钥Ciphercipher=Cipher.getInstance();//创建密码cipher.init(Cipher.,aesKey);//初始化为解密方式Cipher//decryptcipher.doFinal(data);}(NoSuchAlgorithmExceptione){e.printStackTrace();}(NoSuchPaddingExceptione){e.printStackTrace();}(InvalidKeyExceptione){e.printStackTrace();}(IllegalBlockSizeExceptione){e.printStackTrace();}(BadPaddingExceptione){e.printStackTrace();};}对称加密的特点是实现效率快,但由于加解密密钥相同,在密钥存储、分发、安全等方面存在诸多问题.,比如密钥管理,密钥泄露就是基于此,将加密密钥和解密密钥分开,形成客户端使用公钥加密,服务端使用私钥解密的非对称加密,加密和解密密钥分开,加密密钥不用担心泄露的风险。常用的非对称加密算法如RSA。RSA加解密实现//生成公私钥KeyPairbuildKeyPair()NoSuchAlgorithmException{keySize=2048;KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance();keyPairGenerator.initialize(keySize);keyPairGenerator.genKeyPair();}//RSA加密[]encrypt(PaterivateKeyprivate]data)Exception{Ciphercipher=Cipher.getInstance();cipher.init(Cipher.,privateKey);//加密cipher.doFinal(data);}//RSA解密[]decrypt(PublicKeypublicKey,[]enData)Exception{ciphercipher=Cipher.getInstance();cipher.init(Cipher.,publicKey);//解密cipher.doFinal(enData);}在常见的数据加密方式中,通常会遇到md5、sha-256等算法,但是这些该算法是明文的哈希值。哈希算法和加密算法的本质是是否可逆,即通过运算从密文中得到明文。特别地,base64编码是一种除了增加可读性之外没有任何安全性的编码格式。4.高级存储安全以上介绍了常用的Android数据存储方式和加密算法,通过直观的介绍进入Android存储安全。在实际应用中,数据存储安全问题是复制的系统性问题。不仅在开发方面,而且在从数据结构到编码和密钥生成和管理的数据存储安全方面。文件隐藏Android创建隐藏文件或文件夹,只需添加一个“.”即可。在文件名或文件夹名前(这里是英文输入法下的.号),隐藏的文件/文件夹可以直接读写。这是一个容易被开发者忽视的问题。乍一看,似乎并不难。问题出在开发者和用户的角度。由于安卓手机默认有文件查看器,用户可以方便的查看和修改sdcard目录下的文件。使用隐藏文件时,最大的作用是避免用户误操作。密钥存储如果密钥保存在手机文件中,或者硬编码在代码中,很容易被逆向。一般情况下,对称加密密钥需要存储在用户手机中,不安全。性欲侵犯。通常最好的方式是不保留密钥,而是使用固定的数据或字符串作为加密关键因素,比如用户独有的账户属性。编码方式Android代码主要有Java编码。打包文件时,将Java代码打包成dex文件,防止被包含在安装包文件中,但dex文件很容易逆向为smali代码或Java文件。尽管混淆、加壳甚至虚拟机保护(VMP)技术都非常成熟,简单的逆向工作无法获取代码逻辑和硬编码字符串,但Java代码仍然存在较高的安全风险。因此,需要通过Native代码来实现加解密相关操作,基于so保护技术,既保证了效率,又具有更高的安全性。五、关于Android数据安全的思考随着移动互联网的深入发展,移动应用正在发生质的变化。相较于繁荣之初的粗犷和野蛮,现在的移动应用开始考虑安全和质量,尤其是在我国互联网信息安全的现状下。数据安全关系到企业和应用生存的前提,保护应用数据安全十分重要。在Android数据存储安全方面,由于Android系统的安全机制,用户在获得root权限后可以访问手机的所有目录,包括应用私有目录。因此,数据存储应考虑白盒环境或不可信任环境。在这种情况下,用于数据加密的密钥就成为密钥。一机一密、动态密钥、密钥白盒等方式各有优缺点。一机一密需要保护密钥生成方式的逻辑;动态密钥需要考虑密钥的时效性、有效性和链路安全性;关键白盒由于目前没有得到广泛认可,在兼容性和安全性方面还有待测试。