文件存储密码

转载 2016年08月31日 15:01:49

1、传统的保存用户名,密码方式 SharedPreferences

  

1
2
Editor editor = shareReference.edit();
editor.putString(KEY_NAME,"username_value");

  

通过这样的方法,能够基本满足需求,比如有用户名,那么就Editor.putString存放就好。

 

但是这样的方法有一些弊端:

(1)在存放一些集合信息,存储ArrayList就不合适

(2)如果针对用户,新增加了很多熟悉,比如性别,头像等信息,那么需要一个一个的添加put和get方法,非常的繁琐。

 

 

2、通过序列化对象,将对象序列化成base64编码的文本,然后再通过SharedPreferences 保存,那么就方便很多,只需要在对象里增加get和set方法就好。

 

3、 序列换通用方法, 将list对象或者普通的对象序列化成字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.example.imagedemo;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.List;
 
import android.util.Base64;
 
public class SerializableUtil {
     
    public static <E> String list2String(List<E> list) throws IOException{
        //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //然后将得到的字符数据装载到ObjectOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        //writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
        oos.writeObject(list);
        //最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
        String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
        //关闭oos
        oos.close();
        return listString;
        }
     
    public static  String obj2Str(Object obj)throws IOException
    {
        if(obj == null) {
            return "";
        }
              //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                //然后将得到的字符数据装载到ObjectOutputStream
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                //writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
                oos.writeObject(obj);
                //最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
                String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
                //关闭oos
                oos.close();
                return listString;
    }
     
    //将序列化的数据还原成Object
    public static Object str2Obj(String str) throws StreamCorruptedException,IOException{
        byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
        ByteArrayInputStream bais = new ByteArrayInputStream(mByte);
        ObjectInputStream ois = new ObjectInputStream(bais);
         
        try {
            return ois.readObject();
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
     
    }
     
    public static <E> List<E> string2List(String str) throws StreamCorruptedException,IOException{
        byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
        ByteArrayInputStream bais = new ByteArrayInputStream(mByte);
        ObjectInputStream ois = new ObjectInputStream(bais);
        List<E> stringList = null;
        try {
            stringList = (List<E>) ois.readObject();
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return stringList;
        }
 
}

 

4、 要保存的用户对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.example.imagedemo;
 
import java.io.Serializable;
 
import android.annotation.SuppressLint;
 
 
public class UserEntity implements Serializable
{
     private static final long serialVersionUID = -5683263669918171030L; 
 
    private String userName;
    // 原始密码
     
    public String getUserName()
    {
        return userName;
    }
 
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
 
    public String getPassword()
    {
        return password;
    }
 
    public void setPassword(String password)
    {
        this.password = password;
    }
 
    private String password;
 
}

  

5、编写SharedPreUtil ,实现对对象的读取和保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.example.imagedemo;
 
import java.io.IOException;
import java.io.StreamCorruptedException;
 
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
 
public class SharedPreUtil
{
     
    // 用户名key
    public final static String KEY_NAME = "KEY_NAME";
 
    public final static String KEY_LEVEL = "KEY_LEVEL";
     
     
    private static SharedPreUtil s_SharedPreUtil;
     
    private static UserEntity s_User = null;
 
    private SharedPreferences msp;
     
    // 初始化,一般在应用启动之后就要初始化
    public static synchronized void initSharedPreference(Context context)
    {
        if (s_SharedPreUtil == null)
        {
            s_SharedPreUtil = new SharedPreUtil(context);
        }
    }
     
    /**
     * 获取唯一的instance
     *
     * @return
     */
    public static synchronized SharedPreUtil getInstance()
    {
        return s_SharedPreUtil;
    }
     
    public SharedPreUtil(Context context)
    {
        msp = context.getSharedPreferences("SharedPreUtil",
                Context.MODE_PRIVATE | Context.MODE_APPEND);
    }
     
    public SharedPreferences getSharedPref()
    {
        return msp;
    }
 
     
    public synchronized void putUser(UserEntity user)
    {
         
        Editor editor = msp.edit();
         
        String str="";
        try {
            str = SerializableUtil.obj2Str(user);
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        editor.putString(KEY_NAME,str);
        editor.commit();
         
        s_User = user;
    }
     
    public synchronized UserEntity getUser()
    {
         
        if (s_User == null)
        {
            s_User = new UserEntity();
     
             
            //获取序列化的数据
            String str = msp.getString(SharedPreUtil.KEY_NAME, "");
             
            try {
                Object obj = SerializableUtil.str2Obj(str);
                if(obj != null){
                    s_User = (UserEntity)obj;
                }
                 
            catch (StreamCorruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
         
        return s_User;
    }
     
    public synchronized void DeleteUser()
    {
        Editor editor = msp.edit();
        editor.putString(KEY_NAME,"");
     
        editor.commit();
        s_User = null;
    }
     
}

  

6、 调用Activity代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.example.imagedemo;
 
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
 
public class ActivityMain extends Activity
{
     
    EditText edit_pwd;
    EditText edit_name;
    Button button;
     
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        SharedPreUtil.initSharedPreference(getApplicationContext());
         
     
         
        edit_pwd = (EditText)findViewById(R.id.pwd);
        edit_name = (EditText)findViewById(R.id.name);
         
        button = (Button)findViewById(R.id.btn);
         
         
     //保存到本地
        button.setOnClickListener(new OnClickListener()
        {
             
            @Override
            public void onClick(View v)
            {
                 
                 String name  = edit_name.getText().toString();
                 String pwd = edit_pwd.getText().toString();
                  
                 UserEntity user = new UserEntity();
                 user.setPassword(pwd);
                 user.setUserName(name);
                  
                 //用户名,密码保存在SharedPreferences
                 SharedPreUtil.getInstance().putUser(user);            
            }
        });
        Button delBtn = (Button)findViewById(R.id.btn_del);
        delBtn.setOnClickListener(new OnClickListener()
            {
                 
                @Override
                public void onClick(View v)
                {  
                     SharedPreUtil.getInstance().DeleteUser();     
                       edit_name.setText("");
                       edit_pwd.setText("");
                }
            });
         
        UserEntity user = SharedPreUtil.getInstance().getUser();
        if(!TextUtils.isEmpty(user.getPassword()) && !TextUtils.isEmpty( user.getUserName() ) ){
            edit_name.setText(user.getUserName());
            edit_pwd.setText(user.getPassword());
        }
         
    }
     
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
     
}

  

  对应的布局文件

 来个截图

 

[24]Window PowerShell DSC学习系列---- 如何保护MOF文件里面存储的密码?

在上节笔者分享了[23]Window PowerShell DSC学习系列---- MOF文件能存储用户的密码吗?MOF文件里面能直接存储明文密码,这样是非常不安全的。那么有什么方式能够把MOF里面存...

[23]Window PowerShell DSC学习系列---- MOF文件能存储用户的密码吗?

我们知道,DSC的资源中,有很多的资源是需要访问文件共享目录,进入本地的用户的目录,或者为一个特定的用户安装一个MSI的安装包,修改注册表;这个时候,如果直接执行调用DSC的资源,则可能会弹出“Acc...

需求:实现数据库密码通过密文的方式存储在配置文件中

需求:实现数据库密码通过密文的方式存储在配置文件中 配置文件:evoucher.conf【可以是任意自定义格式结尾的配置文件】格式 是以  Key:Value存在的。 例如如下: # ...

android 文件存储以及SharedPreferences存储以及模拟记住密码

1、文件存储 文件存储是android最基本的一种数据存储方式,他不会对存储的内容进行任何格式化的处理,所有数据都原封不动的保存在文件当中。 1.1 将数据存储到文件当中 Context类提供了一个o...
  • freshxu
  • freshxu
  • 2016年05月23日 11:08
  • 319

android--内部存储写文件和使用API获取内部存储路径,sharedperferance获取原有的账号密码--简单的登陆(记录原有的账号和密码)--I/0流介绍

I/O流就是对文件的操作,按流来分类分为输入与输出二类,按字节和字符分类分为字节流和字符流。 输出流:字符输出流,字节输出流。 输入流:字符输入流,字节输入流。 而按字节和字符分则是,字节流和字符流都...

Dropbox是如何安全地存储用户帐号密码的?(2017-02-08 薛命灯)

作者| Devdatta Akhawe译者|  薛命灯 众所周知,存储明文密码是一种很糟糕的做法。如果把明文密码保存在数据库里,一旦数据库遭到破坏,用户的账号信息就很危险。早在1976年,软件行业就...
  • laowxl
  • laowxl
  • 2017年02月08日 13:58
  • 360

提取winXP本地存储的无线密码

  • 2014年02月18日 15:33
  • 59KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文件存储密码
举报原因:
原因补充:

(最多只允许输入30个字)