数据存储与访问之——SharedPreferences保存用户偏好参数

数据存储与访问之——SharedPreferences保存用户偏好参数_第1张图片

1.保存和读取本地SharedPreferences

上面这张图就概括了SharedPreferences的用法,所以这里就不细讲了,这里需要注意的一点是editor.putString(key,value),不仅可以设置string,还可以设置boolean,long等

2.读取其他应用的SharedPreferences

核心: 获得其他app的Context,而这个Context代表访问该app的全局信息的接口,而决定应用的唯一标识 是应用的包名,所以我们可以通过应用包名获得对应app的Context 另外有一点要注意的是:其他应用的SP文件是否能被读写的前提就是SP文件是否指定了可读或者 可写的权限,我们上面创建的是MODE_PRIVATE的就不可以了~所以说你像读别人的SP里的数据, 很难,另外,一些关键的信息,比如密码保存到SP里,一般都是会做加密的,所以只能自己写自己玩~ 等下会讲下常用的MD5加密方法!

实现流程图

数据存储与访问之——SharedPreferences保存用户偏好参数_第2张图片

代码示例:

运行效果图

数据存储与访问之——SharedPreferences保存用户偏好参数_第3张图片

代码实现

我们读取SP的操作放在MainActivity.java中完成,点击按钮后读取SP,并通过Toast显示出来:

public class MainActivity extends AppCompatActivity {

    private Context othercontext;
    private SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnshow = (Button) findViewById(R.id.btnshow);
        btnshow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得第一个应用的包名,从而获得对应的Context,需要对异常进行捕获
                try {
                    othercontext = createPackageContext("com.jay.sharedpreferencedemo", Context.CONTEXT_IGNORE_SECURITY);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
                //根据Context取得对应的SharedPreferences
                sp = othercontext.getSharedPreferences("mysp", Context.MODE_WORLD_READABLE);
                String name = sp.getString("username", "");
                String passwd = sp.getString("passwd", "");
                Toast.makeText(getApplicationContext(), "Demo1的SharedPreference存的\n用户名为:" + name + "\n密码为:" + passwd, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

3.使用MD5对SharedPreference的重要数据进行加密

1.简单的加密处理流程

流程图如下

数据存储与访问之——SharedPreferences保存用户偏好参数_第4张图片

流程图解析

Step 1.用户注册账号密码,账号密码校验后(账号是否重复,密码位数 > 6位等), 即账号密码有效,注册成功后,我们提交给服务器的账号,以及本地加密过的密码!

Step 2.服务器端将用户提交的账号,加密过的密码保存到服务端的数据库中,也就是服务 端并不会保存我们的明文密码(原始)密码!

Step 3.说回客户端,如果注册成功或者登陆成功,你想保存账号密码到SP中,保存的的密码 也需要走一趟加密流程!即明文密码——>加密,再保存!如果不保存,每次请求的时候,明文密码 也要走一趟家里流程,然后拿着加密后的密码来请求服务器!

Step 4.服务器验证账号以及加密密码,成功,分配客户端一个session标识,后续客户端可以拿着 这个session来访问服务端提供的相关服务!

2.MD5简单介绍:

1)MD5是什么鬼?:

答:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛 使用的一种散列函数,用以提供消息的完整性保护——摘自《百度百科》 简单点说就是一种加密算法,可以将一个字符串,或者文件,压缩包,执行MD5加密后, 就可以生产一个固定长度为128bit的串!这个串基本唯一!另外我们都知道:一个十六进制 需要用4个bit来表示,那么对应的MD5的字符串长度就为:128 / 4 = 32位了!另外可能 你看到一些md5是16位的,只是将32位MD5码去掉了前八位以及后八位!

数据存储与访问之——SharedPreferences保存用户偏好参数_第5张图片

2)MD5能破解吗?
答:MD5不可逆,就是说没有对应的算法,无法从生成的md5值逆向得到原始数据! 当然暴力破解除外,简单的MD5加密后可以查MD5库~

3)MD5值唯一吗?
答:不唯一,一个原始数据只对应一个MD5值,但是一个MD5值可能对应多个原始数据!

3.MD5加密实现例子:

其实网上有很多写好的MD5的例子,百度或者谷歌一搜一大堆

Md5Util.java

public class MD5 {
    public static String getMD5(String content) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(content.getBytes());
            return getHashString(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String getHashString(MessageDigest digest) {
        StringBuilder builder = new StringBuilder();
        for (byte b : digest.digest()) {
            builder.append(Integer.toHexString((b >> 4) & 0xf));
            builder.append(Integer.toHexString(b & 0xf));
        }
        return builder.toString();
    }
}

MainActivity.java直接调用getMD5这个静态方法:

Log.e("HeHe", MD5.getMD5("呵呵"));

我们可以看到Logcat上打印出:

这就是加密过后的呵呵了,我们可以把这串密文拷贝到上面这个md5的在线解密网站:

数据存储与访问之——SharedPreferences保存用户偏好参数_第6张图片

嘿嘿,果然,只是这样加密一次,就直接破解了,有点不安全的样子,那就加密100次咯, 就是将加密后的字符串再加密,重复100次,我们在原先的基础上加个加密一百次的方法:

public static String getMD5x100(String content){
    String s1 = content;
    for(int i = 0;i < 100;i++){
        s1 = getMD5(s1);
    }
    return s1;
}

然后调用下,发现打印这个的Log:

复制界面网站上:

数据存储与访问之——SharedPreferences保存用户偏好参数_第7张图片

你可能感兴趣的:(数据存储与访问之——SharedPreferences保存用户偏好参数)