`

主题:Android杂谈---用MD5加密算法加密密码(转载)

阅读更多

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

可以用FileBrower查看


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

 

下面是个小例子:

main.xml

 

Java代码  收藏代码
  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >  
  7.     <EditText  
  8.         android:id="@+id/username"   
  9.         android:layout_width="fill_parent"   
  10.         android:layout_height="wrap_content"   
  11.         android:layout_marginLeft="10dp"   
  12.         android:layout_marginTop="20dp"   
  13.         android:layout_marginRight="10dp"   
  14.         android:hint="帐号"   
  15.     />  
  16.     <EditText  
  17.         android:id="@+id/password"   
  18.         android:password="true"   
  19.         android:layout_width="fill_parent"   
  20.         android:layout_height="wrap_content"   
  21.         android:layout_marginLeft="10dp"   
  22.         android:layout_marginTop="10dp"   
  23.         android:layout_marginRight="10dp"   
  24.         android:hint="密码"   
  25.     />  
  26.     <Button  
  27.         android:id="@+id/save"   
  28.         android:text="保存"   
  29.         android:layout_width="fill_parent"   
  30.         android:layout_height="wrap_content"   
  31.         android:layout_marginLeft="10dp"   
  32.         android:layout_marginTop="10dp"   
  33.         android:layout_marginRight="10dp"   
  34.     />  
  35.     <Button  
  36.         android:id="@+id/login"   
  37.         android:layout_width="fill_parent"   
  38.         android:layout_height="wrap_content"   
  39.         android:layout_marginLeft="10dp"   
  40.         android:layout_marginTop="10dp"   
  41.         android:layout_marginRight="10dp"   
  42.         android:text="登录"   
  43.     />  
  44. </LinearLayout>  

 login.xml

 

Java代码  收藏代码
  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"   
  4.   android:layout_width="match_parent"   
  5.   android:layout_height="match_parent"   
  6.   android:orientation="vertical" >  
  7.   <TextView  
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="login successful!"   
  11.   />  
  12. </LinearLayout>  

 login.java

 

Java代码  收藏代码
  1. package  com.loulijun.md5demo;  
  2.   
  3. import  android.app.Activity;  
  4. import  android.os.Bundle;  
  5.   
  6. public   class  Login  extends  Activity {  
  7.   
  8.     @Override   
  9.     protected   void  onCreate(Bundle savedInstanceState) {  
  10.         // TODO Auto-generated method stub   
  11.         super .onCreate(savedInstanceState);  
  12.         setContentView(R.layout.login);  
  13.     }  
  14.   
  15. }  

 MD5Demo.java

 

Java代码  收藏代码
  1. package  com.loulijun.md5demo;  
  2.   
  3. import  java.security.MessageDigest;  
  4.   
  5. import  android.app.Activity;  
  6. import  android.content.Intent;  
  7. import  android.content.SharedPreferences;  
  8. import  android.os.Bundle;  
  9. import  android.view.View;  
  10. import  android.widget.Button;  
  11. import  android.widget.EditText;  
  12. import  android.widget.Toast;  
  13.   
  14. public   class  MD5Demo  extends  Activity {  
  15.     private  EditText username,password;  
  16.     private  Button savebtn,loginbtn;  
  17.     String user,pass;  
  18.     @Override   
  19.     public   void  onCreate(Bundle savedInstanceState) {  
  20.         super .onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         username = (EditText)findViewById(R.id.username);  
  23.         password = (EditText)findViewById(R.id.password);  
  24.         savebtn = (Button)findViewById(R.id.save);  
  25.         loginbtn = (Button)findViewById(R.id.login);  
  26.   
  27.         savebtn.setOnClickListener(new  Button.OnClickListener()  
  28.         {  
  29.   
  30.             @Override   
  31.             public   void  onClick(View v) {  
  32.                 SharedPreferences pre = getSharedPreferences("loginvalue" ,MODE_WORLD_WRITEABLE);  
  33.                 pass = MD5(password.getText().toString());  
  34.                 user = username.getText().toString();  
  35.                 if (!pass.equals( "" )&&!user.equals( "" ))  
  36.                 {  
  37.                       pre.edit().putString("username" , username.getText().toString()).  
  38.                       putString("password" ,encryptmd5(pass)).commit();  
  39.                       Toast.makeText(getApplicationContext(), "保存成功!" , Toast.LENGTH_SHORT).show();  
  40.                 }else   
  41.                 {  
  42.                     Toast.makeText(getApplicationContext(), "密码不能为空!" , Toast.LENGTH_LONG).show();  
  43.                 }  
  44.                 
  45.                   
  46.             }  
  47.               
  48.         });  
  49.         loginbtn.setOnClickListener(new  Button.OnClickListener()  
  50.         {  
  51.               
  52.               
  53.             @Override   
  54.             public   void  onClick(View v) {  
  55.                 SharedPreferences sp = getSharedPreferences("loginvalue" , MODE_WORLD_READABLE);  
  56.                 String loginuser = sp.getString("username" null );  
  57.                 String loginpass = sp.getString("password" null );  
  58.                   
  59.                 user = username.getText().toString();  
  60.                 pass = password.getText().toString();  
  61.                   
  62.                 String passmd5 = MD5(pass);  
  63.                 String encryptmd5 = encryptmd5(passmd5);  
  64.                   
  65.                 System.out.println("username=" +loginuser+ "-------------password=" +loginpass);  
  66.                   System.out.println("user==" +user+ "-------------encryptmd5==" +encryptmd5);  
  67.                   if (!user.equals( "" )&&!pass.equals( "" ))  
  68.                   {  
  69.                       if ( user.equals(loginuser)&& encryptmd5.equals(loginpass))  
  70.                       {  
  71.                           Intent intent = new  Intent();  
  72.                           intent.setClass(MD5Demo.this , Login. class );  
  73.                           MD5Demo.this .startActivity(intent);    
  74.                           finish();  
  75.                       }else   
  76.                       {                 
  77.                           Toast.makeText(getApplicationContext(), "密码是错误的!" , Toast.LENGTH_LONG).show();  
  78.                       }  
  79.                   }else   
  80.                   {  
  81.                       Toast.makeText(getApplicationContext(), "密码不能为空!" , Toast.LENGTH_LONG).show();  
  82.                   }  
  83.                   
  84.             }  
  85.               
  86.         });  
  87.     }  
  88.       
  89.   //MD5加密,32位   
  90.     public   static  String MD5(String str)  
  91.     {  
  92.         MessageDigest md5 = null ;  
  93.         try   
  94.         {  
  95.             md5 = MessageDigest.getInstance("MD5" );  
  96.         }catch (Exception e)  
  97.         {  
  98.             e.printStackTrace();  
  99.             return   "" ;  
  100.         }  
  101.           
  102.         char [] charArray = str.toCharArray();  
  103.         byte [] byteArray =  new   byte [charArray.length];  
  104.           
  105.         for ( int  i =  0 ; i < charArray.length; i++)  
  106.         {  
  107.             byteArray[i] = (byte )charArray[i];  
  108.         }  
  109.         byte [] md5Bytes = md5.digest(byteArray);  
  110.           
  111.         StringBuffer hexValue = new  StringBuffer();  
  112.         for int  i =  0 ; i < md5Bytes.length; i++)  
  113.         {  
  114.             int  val = (( int )md5Bytes[i])& 0xff ;  
  115.             if (val <  16 )  
  116.             {  
  117.                 hexValue.append("0" );  
  118.             }  
  119.             hexValue.append(Integer.toHexString(val));  
  120.         }  
  121.         return  hexValue.toString();  
  122.     }  
  123.       
  124.     // 可逆的加密算法   
  125.     public   static  String encryptmd5(String str) {  
  126.         char [] a = str.toCharArray();  
  127.         for  ( int  i =  0 ; i < a.length; i++)   
  128.         {  
  129.                 a[i] = (char ) (a[i] ^  'l' );  
  130.         }  
  131.         String s = new  String(a);  
  132.         return  s;  
  133.     }  
  134.   
  135. }  

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




 

分享到:
评论

相关推荐

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

    本篇主要围绕"Android杂谈---Nexus S的ROOT教程"展开,讲解如何为Nexus S这款经典的Android设备获取ROOT权限,并涉及与之相关的源码和工具。 首先,我们需要理解ROOT是什么。在Android操作系统中,ROOT权限相当于...

    Android杂谈--闹钟详谈

    本文将深入探讨Android中的闹钟实现,涉及源码分析以及如何使用相关工具进行调试和优化。 首先,Android提供了`AlarmManager`类来管理闹钟服务。它是系统服务,可以通过`Context.getSystemService(Context.ALARM_...

    Eclipse下PeerSim仿真

    Eclipse下PeerSim仿真(2010-07-24 14:21:16) 转载▼ 标签: 杂谈 Eclipse下PeerSim仿真 时间: 2010.06.25 23:00:00 标签: PeerSim ,Eclipse ...******************** Eclipse下PeerSim仿真 ******************** ...

    学术环境模拟PYTHON代码,参考:《星辰杂谈-学术圈最近怎么了?》

    为了解学术界东西方思维习惯的演变,本文建立了以随机概率论为基础的数学模型,考虑东西价值观差异,以揭示政府管制和道德引导在学术界树立正确价值观和文化自信中的影响以及必要性。数学模型都不是完全真实的,需要...

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

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

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

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

    K3 采购价格管控杂谈

    本文将深入探讨K3 WISE中的采购价格管控策略及其实施细节,旨在帮助使用者更好地理解和应用这些功能。 #### 二、单价精度设置 单价精度的设置直接影响到后续的价格核算和数据分析。合理的单价精度能够确保数据的...

    房地产行业地产杂谈系列之五:细数主流商管企业,经营发展各有千秋(16页).pdf

    【房地产行业地产杂谈系列之五】这篇研究报告主要聚焦于主流商业管理企业的经营与发展差异,通过对华润万象生活、宝龙商业、合景悠活、星盛商业和卓越商企服务等几家代表性企业的分析,揭示了行业的现状和未来趋势。...

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

    在"swing开发杂谈--初版本程序源码"中,可能包含了上述部分或全部知识点的实际应用,通过分析`netHelper`这个子文件夹,我们可以看到可能的网络辅助类或其他功能模块的实现。这个源码可能会演示如何使用Swing构建一...

    多核多线程杂谈-并行计算

    ### 多核多线程杂谈-并行计算 #### 1. 并行计算概述 随着计算机硬件的发展,单核处理器的性能提升遇到了物理瓶颈,因此多核处理器成为了提高计算能力的关键技术之一。并行计算是利用多核处理器或多台计算机协同...

    blog:A front-end blog | 前端博客

    从零开始做Vue前端架构(5)webpack发布版配置 & 配置重构 从零开始做Vue前端架构(6)单元测试 & 代码覆盖率 从零开始做Vue前端架构(7)e2e测试 从零开始做Vue前端架构(8)vuex 从零开始做Vue前端架构(9)...

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

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

    Android开发杂谈

    本文将基于“Android开发杂谈”的主题,结合提供的资源——一个名为"Android_.pdf"的文件,来深入探讨一些重要的知识点。 1. **源码阅读**: 在Android开发中,理解源码是提升技能的关键。Android开源项目(AOSP)...

    04纯电动汽车故障诊断概述

    ### 知识点生成 #### 一、纯电动汽车的发展历史与现状 - **起源与发展初期:** - 世界上第一辆具有实际应用价值的电动汽车诞生于19世纪30年代,由英国发明家罗伯特·戴维森创造。 - 早期电动汽车因性能问题和...

    地产杂谈系列之五十:2009-2023行情逐年复盘与未来展望.pdf

    然而,不是所有主题都能带来长期的行情,如2017年的雄安新区主题,其行情可能因短期基本面提振有限或低于预期而迅速消退。2023年的重要主题之一是城中村改造,该主题的行情持续性将取决于改造的实际进展和房企是否...

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

    ### 软件工程历史概览 #### 一、程序设计的起源与始祖 - **十七世纪的计算器发展**:十七世纪初,人类开始尝试制造计算器,这标志着早期计算机科学的萌芽。1623年,德国的博学者Wilhelm Schickard制造了世界上第一...

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

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

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

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

Global site tag (gtag.js) - Google Analytics