`

Android杂谈---用MD5处理明文密码

 
阅读更多

很多的网络相关的软件都需要用户名密码登录,在开发的时候像这些密码都是保存在SharedPreferences中,这些密码保存在/data/data/包名/shared_prefs下,保存在一个XML文件中,如下:

可以用FileBrower查看


开始说道正题,MD5加密算法虽然现在有些人已经将其解开了,但是它的加密机制依然很强大,我想绝大对数还是不会解开的。MD5加密算法是单向加密,只能用你的密码才能解开,要不就是会解密算法,否则想都别想解开。为了防止这种情况的发生。还可以对加密过的密码进行再次加密。

 

下面是个小例子:

main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<EditText
		android:id="@+id/username"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginTop="20dp"
		android:layout_marginRight="10dp"
		android:hint="帐号"
	/>
	<EditText
		android:id="@+id/password"
		android:password="true"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginTop="10dp"
		android:layout_marginRight="10dp"
		android:hint="密码"
	/>
	<Button
		android:id="@+id/save"
		android:text="保存"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginTop="10dp"
		android:layout_marginRight="10dp"
	/>
	<Button
		android:id="@+id/login"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginTop="10dp"
		android:layout_marginRight="10dp"
		android:text="登录"
	/>
</LinearLayout>

 login.xml

 

<?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="wrap_content"
  	android:text="login successful!"
  />
</LinearLayout>

 login.java

 

package com.loulijun.md5demo;

import android.app.Activity;
import android.os.Bundle;

public class Login extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);
	}

}

 MD5Demo.java

 

package com.loulijun.md5demo;

import java.security.MessageDigest;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MD5Demo extends Activity {
    private EditText username,password;
    private Button savebtn,loginbtn;
    String user,pass;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        savebtn = (Button)findViewById(R.id.save);
        loginbtn = (Button)findViewById(R.id.login);

        savebtn.setOnClickListener(new Button.OnClickListener()
        {

			@Override
			public void onClick(View v) {
				SharedPreferences pre = getSharedPreferences("loginvalue",MODE_WORLD_WRITEABLE);
				pass = MD5(password.getText().toString());
				user = username.getText().toString();
				if(!pass.equals("")&&!user.equals(""))
				{
					  pre.edit().putString("username", username.getText().toString()).
				      putString("password",encryptmd5(pass)).commit();
				      Toast.makeText(getApplicationContext(), "保存成功!", Toast.LENGTH_SHORT).show();
				}else
				{
					Toast.makeText(getApplicationContext(), "密码不能为空!", Toast.LENGTH_LONG).show();
				}
		      
				
			}
        	
        });
        loginbtn.setOnClickListener(new Button.OnClickListener()
        {
        	
        	
			@Override
			public void onClick(View v) {
				SharedPreferences sp = getSharedPreferences("loginvalue", MODE_WORLD_READABLE);
				String loginuser = sp.getString("username", null);
				String loginpass = sp.getString("password", null);
				
				user = username.getText().toString();
		    	pass = password.getText().toString();
		    	
		    	String passmd5 = MD5(pass);
		    	String encryptmd5 = encryptmd5(passmd5);
				
		    	System.out.println("username="+loginuser+"-------------password="+loginpass);
				  System.out.println("user=="+user+"-------------encryptmd5=="+encryptmd5);
				  if(!user.equals("")&&!pass.equals(""))
				  {
					  if( user.equals(loginuser)&& encryptmd5.equals(loginpass))
					  {
						  Intent intent = new Intent();
						  intent.setClass(MD5Demo.this, Login.class);
						  MD5Demo.this.startActivity(intent);  
						  finish();
					  }else
					  {				  
						  Toast.makeText(getApplicationContext(), "密码是错误的!", Toast.LENGTH_LONG).show();
					  }
				  }else
				  {
					  Toast.makeText(getApplicationContext(), "密码不能为空!", Toast.LENGTH_LONG).show();
				  }
				
			}
        	
        });
    }
    
  //MD5加密,32位
    public static String MD5(String str)
    {
    	MessageDigest md5 = null;
    	try
    	{
    		md5 = MessageDigest.getInstance("MD5");
    	}catch(Exception e)
    	{
    		e.printStackTrace();
    		return "";
    	}
    	
    	char[] charArray = str.toCharArray();
    	byte[] byteArray = new byte[charArray.length];
    	
    	for(int i = 0; i < charArray.length; i++)
    	{
    		byteArray[i] = (byte)charArray[i];
    	}
    	byte[] md5Bytes = md5.digest(byteArray);
		
		StringBuffer hexValue = new StringBuffer();
		for( int i = 0; i < md5Bytes.length; i++)
		{
			int val = ((int)md5Bytes[i])&0xff;
			if(val < 16)
			{
				hexValue.append("0");
			}
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();
    }
    
    // 可逆的加密算法
    public static String encryptmd5(String str) {
    	char[] a = str.toCharArray();
    	for (int i = 0; i < a.length; i++) 
    	{
    			a[i] = (char) (a[i] ^ 'l');
    	}
    	String s = new String(a);
    	return s;
    }

}

 程序很简单,下面是运行的效果:




 

  • 大小: 9.2 KB
  • 大小: 14.7 KB
  • 大小: 24 KB
  • 大小: 6.8 KB
分享到:
评论

相关推荐

    Android杂谈---Nexus S的ROOT教程

    这篇“Android杂谈---Nexus S的ROOT教程”显然是针对想要获取Nexus S手机ROOT权限的用户,提供了一条详细的操作路径。Nexus S是由Google与三星联合推出的旗舰设备,因其开源特性而深受开发者喜爱。 首先,我们需要...

    Android杂谈--闹钟详谈

    在Android源码中,`AlarmService`是实际处理闹钟的组件,它会根据不同的闹钟类型将任务添加到调度队列。例如,`RTC_WAKEUP`类型的闹钟会触发`BroadcastReceiver`,进而唤醒设备并执行相应的`PendingIntent`。 在...

    杂谈----1 显示横向滚动条

    标题中的“杂谈----1 显示横向滚动条”暗示了我们将会探讨的是关于在界面设计中如何实现或处理横向滚动条的技术问题。这通常涉及到前端开发,特别是网页或应用程序的用户界面(UI)部分,其中可能包括HTML、CSS和...

    计算机汇编杂谈-理解原理

    计算机汇编杂谈-理解其中的原理

    swing开发杂谈--初版本程序源码

    在Swing开发中,初版本的程序源码通常包含基础组件的使用、事件处理、布局管理等多个方面的内容。下面将详细讨论Swing开发中的关键知识点。 1. **基础组件**: Swing提供了丰富的组件库,如按钮(JButton)、文本框...

    项目管理故事2-实施策略杂谈-开元项目实施.ppt

    "项目管理故事2-实施策略杂谈-开元项目实施" 本文是基于赵磊项目经理的项目管理故事,分享实施成功经验。赵磊担任过多个项目经理职位,负责开元旅业NC项目财务实施、苏州好孩子NC财务项目实施、合肥公交NC财务第一...

    「安全管理」Linux_HIDS杂谈 - WEB应用防火墙.zip

    「安全管理」Linux_HIDS杂谈 - WEB应用防火墙 安全管理 安全资讯 安全开发 零信任 身份管理

    软件工程历史杂谈-杨东屏

    - **云计算与大数据**:云计算提供了强大的计算资源和支持,大数据则带来了海量数据处理的需求,两者都对软件工程提出了新的挑战。 - **敏捷开发**:敏捷开发强调迭代和增量式的软件开发方法,以适应不断变化的市场...

    嵌入式开发杂谈-薛立功经典之作

    ### 嵌入式开发杂谈—薛立功经典之作:关键知识点解析 #### 一、引言 在嵌入式开发领域,《嵌入式开发杂谈》是薛立功先生的经典著作之一,该作品旨在解答新手在入门阶段遇到的各种问题。通过作者的经验分享,帮助...

    程序设计经验杂谈-给予帮助

    在编程世界中,程序设计是一门深奥的艺术,它涵盖了逻辑构建、问题解决、算法设计、数据结构使用、代码组织等多个方面。这份“程序设计经验杂谈”文档,据说是出自一位大师之手,无疑为我们提供了宝贵的洞见。在本文...

    (免费)杂谈-我眼中的FPGA与DSP.pdf

    在图像处理的中值滤波算法示例中,FPGA可以利用其并行处理能力,同时处理多个像素,极大地提高处理速度;而DSP则通过优化的软件算法,高效地完成排序和中值计算,达到良好的处理效果。 总的来说,FPGA和DSP各有千秋...

    (免费)杂谈-我眼中的FPGA与DSP.docx

    在FPGA与DSP的应用对比中,以图像处理为例,如果使用FPGA实现中值滤波,设计者需要关注硬件逻辑设计和时序约束,通过并行处理来提高效率。而使用DSP,开发者则专注于软件算法的优化,如改进排序算法以减少比较次数,...

    java杂谈-一个计算机专业学生几年的编程经验汇总谈.pdf

    当你在命令行中运行Java程序时,可以使用`java -verbose *.class`参数,这将显示程序加载的所有类文件,让你能够观察到类加载的顺序。只有当类的实例真正被创建时,对应的类文件才会被加载,这也是Java实现“按需...

    作业指导书编制规范,作业指导书编制的各部分内容要点 - 仓库管理杂谈 - 库管易.docx

    作业指导书通常针对特定操作或岗位,详细描述如何执行任务,用以指导和规范工作流程。 作业指导书的基本结构遵循5W1H原则,即Why(为什么)、What(做什么)、When(何时)、Who(谁)、Where(在哪里)、How(如何...

    java杂谈-一个计算机专业学生几年的编程经验汇总谈实用.pdf

    作者建议通过在命令行中使用`java -verbose *.class`参数来观察类的加载过程。这样可以清晰地看到类文件被加载的顺序,只有当类的实例真正被创建时,对应的类文件才会被加载。这有助于理解Java如何在运行时管理类的...

Global site tag (gtag.js) - Google Analytics