Android資料儲存之SharedPreferences及如何安全儲存

總李寫程式碼發表於2016-05-15

前言:

    最近一直在學習ios的資料儲存,當學習到NSUserDefaults的時候讓我回想起了SharedPreferences,今天閒來無事,想著總結一下SharedPreferences的使用。

什麼是SharedPreferences儲存?

      SharedPreferences是基礎key-value(鍵值對)來儲存一些輕量資料的儲存方式,特別適用於儲存軟體配置引數。使用SharedPreferences 儲存資料,其背後是用xml檔案存放資料,檔案存放在/data/data/<package name>/shared_prefs。

具體是怎麼使用的?

1.)寫入資料

       SharedPreferences sharedPreferences= getSharedPreferences("test",
                Activity.MODE_PRIVATE);
        //例項化SharedPreferences.Editor物件
        SharedPreferences.Editor editor = sharedPreferences.edit();
        //用putString的方法儲存資料
        editor.putBoolean(USER_ISLOGIN,true);
        editor.putString(USER_ID, "123456");
        editor.putString(USER_PWD, "pwd123");
        //提交當前資料
        editor.apply();

2.)讀取資料

SharedPreferences sharedPreferences= getSharedPreferences("test",
                Activity.MODE_PRIVATE);
        String userId=sharedPreferences.getString(USER_ID,"");
        String userPwd=sharedPreferences.getString(USER_PWD,"");
        boolean isLogin=sharedPreferences.getBoolean(USER_ISLOGIN,false);

        Log.e("","userId---->"+userId);
        Log.e("","userPwd---->"+userPwd);
        Log.e("","isLogin---->"+isLogin);

3.)監聽資料變化

        SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

            }
        };
        sharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//註冊資料變化監聽
        sharedPreferences.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解註冊資料變化監聽

4.)許可權控制

SharedPreferences sharedPreferences= getSharedPreferences("test",
                Activity.MODE_PRIVATE);

第一個引數是生成xxx.xml檔案的檔名字,第二個引數是檔案的訪問許可權以及檔案資料寫入方式。簡單說明一下幾種方式:

Activity.MODE_PRIVATE,//預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容
Activity.MODE_WORLD_READABLE,//表示當前檔案可以被其他應用讀取,
Activity.MODE_WORLD_WRITEABLE,//表示當前檔案可以被其他應用寫入;
Activity.MODE_APPEND//該模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案

可以複合使用例如:
如果希望檔案被其他應用讀和寫,可以傳入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE  

5.)看下具體寫入檔案的儲存結構:

     看到上面的儲存資料那麼清晰是不是嚇壞了!對!你沒有看錯!儲存在檔案中就是這樣的,純明文儲存沒有一點安全性可言~即使設定了Activity.MODE_PRIVATE許可權在ROOT許可權面前也是不堪一擊的。所以我們在使用SharedPreferences的時候儘量不要儲存一些有關使用者資訊的資料比如本文例子中的userId,userPwd等,如果要儲存那該怎麼補救的呢?我們可以把key md5一下例如MD5Utils.md5(USER_ID),value 值加密一下,可以採用AES加密 附上一個AndroidAES加密文章(http://www.cnblogs.com/whoislcj/p/5473030.html)。

6.)資料共享探討

            Context otherAppContext = createPackageContext("com.gary.appdisplaycontrol", Context.CONTEXT_IGNORE_SECURITY);
            SharedPreferences sharedPreferences = otherAppContext.getSharedPreferences("preferences",Context.MODE_WORLD_READABLE|Context.MODE_MULTI_PROCESS);

看了下官方api強烈說明這是一個非常危險的操作。

 

相關文章