«

[安卓]手机管家(五)防盗之加密

时间:2024-3-2 18:20     作者:韩俊     分类: Android


在homeActivity里调用,layout,用到了hint,提示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="设置密码"
        android:gravity="center"
        android:background="#00ff00"
        android:textSize="15sp"/>
    <EditText 
        android:id="@+id/et_dialog_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"/>
     <EditText 
        android:id="@+id/et_dialog_passwordconfirm"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请确认密码"/>     
      <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal">
          <Button
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:layout_width="0dp" 
              android:id="@+id/bt_ok"
              android:text="确认"/>
           <Button
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:layout_width="0dp" 
              android:id="@+id/bt_cancle"
              android:text="取消"/>
      </LinearLayout>
</LinearLayout>

@Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
            switch (position) {
                case 0:
                //第一次进入的时候,弹出一个对话框,让用户输入密码,两次确认。
                    showSetPasswordDialog();

                break;
            case 8:
                //跳入到setting页面
                Intent intent = new Intent(HomeActivity.this,SettingActivity.class);
                startActivity(intent);

                break;

             default:
                break;
            }
        }   
    }
    private void showSetPasswordDialog() {
        // TODO Auto-generated method stub
        Builder builder = new Builder(this);
        View view = View.inflate(this, R.layout.dialog_setpw, null);
        builder.setView(view);
        builder.show();
    }

输入密码框架确定,完善细节

第二个密码框确认是否密码一致,一致了才进入模块,不一致要求重新输入

在layout里加入密码属性



取消

//builder有三种创建方式,为了能够实现取消,需要有一个builder实体
        bt_cancle.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {               
                //将dialog dismiss掉
                dialog.dismiss();
            }
        });


具体的对比逻辑,首先是判断是否为空,不为空的时候再去对比是否相同,不同就要重新输入



一致需要SharedPreferences保存数据,第一次输入成功后为了加上印象,一般会让用户再登陆一次,需要将前面这个dialogdismiss掉


if (password.equals(passwordconfrim)) {
                        //将密码保存起来
                        Toast.makeText(HomeActivity.this, "密码输入ok,即将保存", 1).show();                   
                        Editor editor =sp.edit();                           
                        editor.putString("password", password);
                        editor.commit();
                        //在确认后一般要求重新登陆一次以方便用户加深记忆,先dismiss当前dialog
                        dialog.dismiss();   
                    }

注意这个dialog的实现,在上面用builder.show,但是需要用alertDialog接收
private void showSetPasswordDialog() {
        // TODO Auto-generated method stub
        Builder builder = new Builder(this);
        View view = View.inflate(this, R.layout.dialog_setpw, null);
        //在匿名内部类里需要加上final才能被局部变量引用
        builder.setView(view);
        //builder返回一个AlertDialog,显示出来还要接收下
        //必须用dialog接收方便后面dismiss掉,正常写法是创建,显示,接收
        /*final AlertDialog dialog = builder.create();
          builder.show();*/
        final AlertDialog dialog = builder.show();

在刚进入的时候也需要判断下,如果已经保存了,则只是需要一次输入的框,第一次登陆,没有保存的,才需要两次输入对比,这里也要实现一个新的方法和layout
switch (position) {
                case 0:
                //第一次进入的时候,弹出一个对话框,让用户输入密码,两次确认。
                    //如果没要保存的需要输入和再次输入
                    if (sp.getString("password", "").length()==0) {
                        showSetPasswordDialog();
                    }
                    else {
                        //如果是已经有了,则直接进入单次输入框
                        showInputPasswordDialog();
                    }

                break;


单次输入框的实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" > 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="输入密码"
        android:gravity="center"
        android:background="#00ff00"
        android:textSize="15sp"/>
    <EditText 
        android:id="@+id/et_inputdialog_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="textPassword"/>  
      <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal">
          <Button
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:layout_width="0dp" 
              android:id="@+id/bt_inputdialog_ok"
              android:text="确认"/>
           <Button
              android:layout_weight="1"
              android:layout_height="wrap_content"
              android:layout_width="0dp" 
              android:id="@+id/bt_inputdialog_cancle"
              android:text="取消"/>
      </LinearLayout>
</LinearLayout>

单输入框框的架子
private void showInputPasswordDialog() {
        Builder builder  = new Builder(this);  
        View view = View.inflate(this, R.layout.dialog_inputpw, null);
        builder.setView(view);
        final AlertDialog dialog =builder.show();

        final EditText et_password = (EditText) view.findViewById(R.id.et_inputdialog_password);

        Button bt_ok = (Button) view.findViewById(R.id.bt_inputdialog_ok);
        Button bt_cancle = (Button) view.findViewById(R.id.bt_inputdialog_cancle);

        bt_ok.setOnClickListener(new OnClickListener() {        
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        }); 
        bt_cancle.setOnClickListener(new OnClickListener() {        
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });     
    }   

完善响应
bt_ok.setOnClickListener(new OnClickListener() {       
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String password_saved = sp.getString("password", "");
                String password_input = et_password.getText().toString();
                if (password_input.length()!=0) {
                    if (password_input.equals(password_saved)) {
                        //密码跟保存的一致,则可以进入该模块
                        Toast.makeText(HomeActivity.this, "密码正确,即将进入设置模块", 1).show();
                        dialog.dismiss();
                        //进入该模块             
                    }
                    else {
                        Toast.makeText(HomeActivity.this, "密码不正确,请重新输入", 1).show();
                    }
                 }
             }
        }); 

正确后需要进入一个新的layout,这个暂时留在后面,现在需要实现加密,否则手机丢了,直接把文件导出就能看到密码了~


通常我们以MD5加密

在实现MD5加密主要有以下几个步骤

首先得到一个信息摘要器 MessageDigest 然后设置MD5

我们获取要加密的数据 例如 password=“123456”

将这些数据转换成字节数据 password.getBytes()

循环对每个字节数进行处理

这里主要是做2个处理 一个是 对每个字节数据进行 与运算 一般是与上一个16进制的数

例如 int number = p $ 0xff;

然后 将得到的number'进行转换为16进制的数

Integer.toHexString(number);

如果这个数转换后的长度为1 那么我们就补0

不满八个二进制那么我们就补全


在工具包里加入一个MD5的工具

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils { 
    public static String getDegist(String password){
       String   degist = "";
       try {
            MessageDigest  md = MessageDigest.getInstance("md5");
            byte[]  digest =md.digest(password.getBytes());
            StringBuffer sb =new StringBuffer();
            for (byte b : digest) {
                int resutl = b& 0xff;
                String str=    Integer.toHexString(resutl);
                if (str.length()==1) {
                    sb.append("0");
                }
                sb.append(str);
            }
            degist =sb.toString();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }      
       return degist;
    }
}

输入后要解密
if (password.equals(passwordconfrim)) {
                        //将密码保存起来
                        Toast.makeText(HomeActivity.this, "密码输入ok,即将保存", 1).show();                   
                        Editor editor =sp.edit();   
                        //将明文转成密文,password123-》加密 
                        String degist = MD5Utils.getDegist(password);
                        editor.putString("password", degist);
                        editor.commit();
                        //在确认后一般要求重新登陆一次以方便用户加深记忆,先dismiss当前dialog
                        dialog.dismiss();   
                    }

有保存后,再次输入需要对比,拿到的是密文,我们需要把再次输入的也生成密文再对比
@Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String password_saved = sp.getString("password", "");
                String password_input = et_password.getText().toString();
                if (password_input.length()!=0) {
                    String password_input_digest = MD5Utils.getDegist(password_input);
                    if (password_input_digest.equals(password_saved)) {
                        //密码跟保存的一致,则可以进入该模块
                        Toast.makeText(HomeActivity.this, "密码正确,即将进入设置模块", 1).show();
                        dialog.dismiss();
                        //进入该模块             
                    }

标签: android

热门推荐