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

  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5494761.html
Copyright © 2011-2022 走看看