亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android SQLite數(shù)據(jù)庫(kù)加密的操作方法

 更新時(shí)間:2021年09月30日 15:48:53   作者:殤神馬  
因?yàn)锳ndroid自帶的SQLite數(shù)據(jù)庫(kù)本身是沒(méi)有實(shí)現(xiàn)加密的,那我們?nèi)绾螌?shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的加密呢?今天通過(guò)本文給大家介紹下Android SQLite數(shù)據(jù)庫(kù)加密的操作方法,一起看看吧

一、前言

SQLite是一個(gè)輕量級(jí)的、跨平臺(tái)的、開(kāi)源的嵌入式數(shù)據(jù)庫(kù)引擎,也是一個(gè)關(guān)系型的的使用SQL語(yǔ)句的數(shù)據(jù)庫(kù)引擎,
讀寫效率高、資源消耗總量少、延遲時(shí)間少,使其成為移動(dòng)平臺(tái)數(shù)據(jù)庫(kù)的最佳解決方案(如Android、iOS)
但是Android上自帶的SQLite數(shù)據(jù)庫(kù)是沒(méi)有實(shí)現(xiàn)加密的,我們可以通過(guò)Android Studio直接導(dǎo)出應(yīng)用創(chuàng)建的數(shù)據(jù)庫(kù)文件,然后通過(guò)如SQLite Expere Personal 這種可視化工具打開(kāi)數(shù)據(jù)庫(kù)文件進(jìn)行查看數(shù)據(jù)庫(kù)的表結(jié)構(gòu),以及數(shù)據(jù),這就導(dǎo)致存儲(chǔ)在SQLite中的數(shù)據(jù)可以被任何人查看,如果是一些賬號(hào)密碼,或者聊天數(shù)據(jù)等,那么我們的應(yīng)用就面臨著嚴(yán)重的安全漏洞隱患;

二、數(shù)據(jù)庫(kù)加密方法

因?yàn)锳ndroid自帶的SQLite數(shù)據(jù)庫(kù)本身是沒(méi)有實(shí)現(xiàn)加密的,那我們?nèi)绾螌?shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的加密呢?

(1)對(duì)SQLite數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行加密

我們可以在程序中對(duì)保存到數(shù)據(jù)庫(kù)中的數(shù)據(jù) 進(jìn)行加密后保存,然后查詢數(shù)據(jù)的時(shí)候,對(duì)查詢的數(shù)據(jù)進(jìn)行解密后使用,如果還不希望別人看到數(shù)據(jù)庫(kù)的表結(jié)構(gòu),我們可以對(duì)數(shù)據(jù)庫(kù)名字,表名,表中的字段名字使用MD5等加密手段加密后再進(jìn)行操作;
這種方法是可以達(dá)到數(shù)據(jù)庫(kù)加密的目的的,但是相對(duì)來(lái)說(shuō)操作就比較繁瑣了

(2)使用SQLCipher對(duì)SQLite數(shù)據(jù)庫(kù)加密

SQLCipher是基于SQLite基礎(chǔ)之上實(shí)現(xiàn)了數(shù)據(jù)庫(kù)加密的開(kāi)源庫(kù),可以采用第三方的開(kāi)源框架SQLCipher,SQLCipher是基于原生SQlite數(shù)據(jù)庫(kù)進(jìn)行擴(kuò)展,實(shí)現(xiàn)數(shù)據(jù)庫(kù)整體加密(數(shù)據(jù)庫(kù)文件加密),提供的數(shù)據(jù)庫(kù)的操作接口,和原生的SQLite數(shù)據(jù)庫(kù)操作接口基本一樣的;我們創(chuàng)建或者打開(kāi)數(shù)據(jù)庫(kù)都需要密碼,我們打開(kāi)數(shù)據(jù)庫(kù)時(shí)的密碼,需要和創(chuàng)建數(shù)據(jù)庫(kù)時(shí)的密碼保護(hù)一致,否則打開(kāi)數(shù)據(jù)庫(kù)時(shí)會(huì)報(bào)錯(cuò),提示打開(kāi)的文件不是一個(gè)數(shù)據(jù)庫(kù)文件

net.sqlcipher.database.SQLiteException: file is not a database;

我們導(dǎo)出的數(shù)據(jù)庫(kù)文件,通過(guò)SQLite Expere Personal這類可視化工具也是無(wú)法直接打開(kāi)的;但是可以使用DB Browser for Sqlite這個(gè)數(shù)據(jù)庫(kù)查看工具進(jìn)行查看,查看的時(shí)候輸入創(chuàng)建數(shù)據(jù)庫(kù)時(shí)使用的加密密碼

SQLCipher的特點(diǎn):

SQLCipher 占用空間小,性能好,因此非常適合保護(hù)嵌入式應(yīng)用程序數(shù)據(jù)庫(kù),非常適合移動(dòng)開(kāi)發(fā)。

(1)極快的性能,加密開(kāi)銷低至 5-15%

(2)數(shù)據(jù)庫(kù)文件中的數(shù)據(jù) 100% 已加密,是對(duì)所有數(shù)據(jù)文件,包括數(shù)據(jù)文件和緩存、結(jié)構(gòu)文件等等進(jìn)行加密。

(3)使用良好的安全實(shí)踐(CBC 模式、密鑰派生),加密算法是256位 AES 在 CBC 模式

(4)使用 OpenSSL 加密庫(kù)提供的算法

在Android中集成SQLiteCipher:

-添加SQLiteCipher的依賴

implementation 'net.zetetic:android-database-sqlcipher:4.4.3@aar'
implementation "androidx.sqlite:sqlite:2.0.1"

-使用SQLiteCipher提供的相關(guān)接口操作

 SQLiteDatabase.loadLibs(this)
                val databaseFile = getDatabasePath("demo.db")
                if (databaseFile.exists()) databaseFile.delete()
                databaseFile.mkdirs()
                databaseFile.delete()
                val database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null)
                database.execSQL(
                    "CREATE TABLE " + DatabaseHelper.TABLE_MUSIC_TYPE + " (type_id integer primary key autoincrement not null," +
                            "type_no integer,type_name text)"
                )
                database.execSQL(
                    "insert into " + DatabaseHelper.TABLE_MUSIC_TYPE + " (type_no,type_name) " +
                            "values ('" + 1 + "','" + "送餐音樂(lè)" + "')"
                )

上面的代碼在調(diào)用時(shí),會(huì)創(chuàng)建數(shù)據(jù)庫(kù)demo.db,傳入了數(shù)據(jù)庫(kù)密碼,并且創(chuàng)建了一個(gè)表music_type,并且向表中插入了一條數(shù)據(jù);
注意代碼中的數(shù)據(jù)庫(kù)相關(guān)的操作,都是使用SQLIteCipher中的相關(guān)接口即net.sqlcipher.database包名下的相關(guān)接口,不要使用成了原生SQLite的相關(guān)接口

SQLiteDatabase.loadLibs(this)
                val databaseFile = getDatabasePath("demo.db")
                val database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null)
                val cursor = database.rawQuery(
                    "select * from " + DatabaseHelper.TABLE_MUSIC_TYPE,
                    null
                )

                var musicTypeList: MutableList<MusicTypeBean> = mutableListOf();

                while (cursor.moveToNext()) {
                    var musicTypeBean = MusicTypeBean();
                    musicTypeBean.id = cursor.getInt(cursor.getColumnIndex("type_no"))
                    musicTypeBean.name = cursor.getString(cursor.getColumnIndex("type_name"))
                    musicTypeList.add(musicTypeBean)
                }
                cursor.close()
                Log.e(TAG, "onClick: " + musicTypeList.size)

上述代碼就是查詢demo.db數(shù)據(jù)庫(kù)中的music_type表中的數(shù)據(jù),獲取數(shù)據(jù)庫(kù)對(duì)象的時(shí)候,注意傳入的密碼和創(chuàng)建數(shù)據(jù)庫(kù)時(shí)要保持一致;

上面使用SQLiteCipher創(chuàng)建數(shù)據(jù)庫(kù)和表,以及向表中插入數(shù)據(jù),查詢表中的數(shù)據(jù),除了創(chuàng)建數(shù)據(jù)庫(kù)獲取可讀寫數(shù)據(jù)庫(kù)對(duì)象和原生SQLite API有些區(qū)別一樣,其他執(zhí)行SQL語(yǔ)句,查詢表中數(shù)據(jù)的API 和原生 SQlite API是完全一樣的;

SQLiteCipher結(jié)合Room框架使用

我們知道在使用SQLite數(shù)據(jù)庫(kù)的時(shí)候,我們往往會(huì)使用一些比較方便的ORM(對(duì)象關(guān)系映射)框架來(lái)幫助我們操作數(shù)據(jù)庫(kù),如GreenDAO,Room(Jetpack組件)等,那如何將SQLiteCipher結(jié)合這些ORM框架使用;我們這里介紹一下Google Jetpack組件中的ORM框架 Room結(jié)合SQLiteCipher使用;

其實(shí)Room結(jié)合SQLiteCipher使用,就是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)候,需要先創(chuàng)建一個(gè)SupportFactory
,SupportFactory中會(huì)傳入通過(guò)SQLiteCipher中的SQLiteDatabase獲取的密碼字節(jié)數(shù)據(jù)

  SQLiteDatabase.loadLibs(this)
                val passphrase = SQLiteDatabase.getBytes("test123".toCharArray())
                val factory = SupportFactory(passphrase, object : SQLiteDatabaseHook {
                    override fun preKey(database: SQLiteDatabase?) {
                        LogUtil.e(TAG, "preKey")
                    }

                    override fun postKey(database: SQLiteDatabase?) {
                        LogUtil.e(TAG, "postKey")
                    }
                }, true)

然后在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,通過(guò)Room自帶的openHelperFactory()方法傳入創(chuàng)建的SupportFactory即可,這樣就能創(chuàng)建加密數(shù)據(jù)庫(kù)了;其他操作,就按照Room正常的操作即可

var mInstance= Room
                   .databaseBuilder(
                            context.applicationContext,
                            AppDatabase::class.java,
                            DB_NAME
                        ).addCallback(object : RoomDatabase.Callback() {
                            override fun onCreate(db: SupportSQLiteDatabase) {
                                super.onCreate(db)
                                Log.e(TAG, "onCreate: ")
                                initMusicTypeData(context, db)
                            }
                        }).openHelperFactory(factory)
                        .build()

查看并導(dǎo)出加密數(shù)據(jù)庫(kù)文件

-導(dǎo)出數(shù)據(jù)庫(kù)文件

我們手機(jī)通過(guò)USB連接電腦之后,打開(kāi)開(kāi)發(fā)者模式,然后在Android Studio菜單欄中的View->
Tool Windows->Device File Explorer

然后在Device File Explorer中進(jìn)入 data/data/應(yīng)用包名/databases中找到我們創(chuàng)建的數(shù)據(jù)庫(kù)文件demo.db,然后我們可以右鍵改文件Save As 導(dǎo)出該數(shù)據(jù)庫(kù)文件

在這里插入圖片描述
-查看加密數(shù)據(jù)庫(kù)文件

前面我們已經(jīng)提到過(guò),可以通過(guò)DB Browser for SQLite來(lái)查看加密的數(shù)據(jù)庫(kù)文件
下載地址:https://sqlitebrowser.org/dl/

下載安裝之后,我們打開(kāi)安裝目錄下的DB Browser for SQLCipher.exe程序,然后通過(guò)菜單欄中的文件->打開(kāi)數(shù)據(jù)庫(kù)->打開(kāi)導(dǎo)出的加密數(shù)據(jù)庫(kù)文件,然后輸入數(shù)據(jù)庫(kù)文件的加密密碼,就是我們?cè)诔绦蛑蠸QLiteCipher加密數(shù)據(jù)庫(kù)文件時(shí)使用的密碼,輸入正確密碼后,可以正常打開(kāi)數(shù)據(jù)庫(kù)文件

在這里插入圖片描述

在這里插入圖片描述
右鍵表名,選擇瀏覽數(shù)據(jù),即可查看表中的數(shù)據(jù)

在這里插入圖片描述

到此這篇關(guān)于Android SQLite數(shù)據(jù)庫(kù)加密的操作方法的文章就介紹到這了,更多相關(guān)Android SQLite數(shù)據(jù)庫(kù)加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論