zoukankan      html  css  js  c++  java
  • Android数据存储之SharedPreferences及如何安全存储

    前言:

        最近一直在学习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强烈说明这是一个非常危险的操作。

  • 相关阅读:
    HTML5小游戏-绵羊快跑
    JavaScript模拟下拉菜单代码
    作业6
    作业5
    作业4
    作业三
    作业2(第二遍)
    sap jco3安装
    jmeter脚本文件(jmx)关联
    正则替换:删除空行、格式化Json/xml
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5494761.html
Copyright © 2011-2022 走看看