美文网首页Android技术知识程序员Android开发
数据存储与访问之——SharedPreferences保存用户

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

作者: 侯蛋蛋_ | 来源:发表于2017-10-18 16:37 被阅读0次

    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加密方法!

    实现流程图

    代码示例:

    运行效果图

    代码实现

    我们读取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.简单的加密处理流程

    流程图如下

    流程图解析

    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码去掉了前八位以及后八位!

    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的在线解密网站:

    嘿嘿,果然,只是这样加密一次,就直接破解了,有点不安全的样子,那就加密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保存用户

        本文链接:https://www.haomeiwen.com/subject/ckleuxtx.html