深入理解Android MD5数据加密

MD5加密

MD5是由MD2、MD3、MD4演变过来的,虽然MD5加密算法现在有些人已经将其解开了,但是它的加密机制依然很强大,我想绝大对数还是不会解开的。MD5加密算法是单向加密,是不可逆的一种的加密方式,只能用你的密码才能解开,要不就是会解密算法,否则想都别想解开。

MD5加密的特点

压缩性:任意长度的数据,算出的MD5值长度都是固定的。

容易计算:从原数据计算出MD5值很容易。

抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5应用场景

一致性验证

数字签名

安全访问认证

MD5加密算法实现

1.)计算字符串MD5值

 public static String md5(String string) {
  if (TextUtils.isEmpty(string)) {
   return "";
  }
  MessageDigest md5 = null;
  try {
   md5 = MessageDigest.getInstance("MD5");
   byte[] bytes = md5.digest(string.getBytes());
   String result = "";
   for (byte b : bytes) {
    String temp = Integer.toHexString(b & 0xff);
    if (temp.length() == 1) {
     temp = "0" + temp;
    }
    result += temp;
   }
   return result;
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return "";
 }

2.)计算文件的MD5值

 // 计算文件的 MD5 值
 public static String md5(File file) {
  if (file == null || !file.isFile() || !file.exists()) {
   return "";
  }
  FileInputStream in = null;
  String result = "";
  byte buffer[] = new byte[8192];
  int len;
  try {
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   in = new FileInputStream(file);
   while ((len = in.read(buffer)) != -1) {
    md5.update(buffer, 0, len);
   }
   byte[] bytes = md5.digest();

   for (byte b : bytes) {
    String temp = Integer.toHexString(b & 0xff);
    if (temp.length() == 1) {
     temp = "0" + temp;
    }
    result += temp;
   }
  } catch (Exception e) {
   e.printStackTrace();
  }finally {
   if(null!=in){
    try {
     in.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return result;
 }

或者采用nio的方式

 public static String md5(File file) {
  String result = "";
  FileInputStream in = null;
  try {
   in = new FileInputStream(file);
   MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   md5.update(byteBuffer);
   byte[] bytes = md5.digest();
   for (byte b : bytes) {
    String temp = Integer.toHexString(b & 0xff);
    if (temp.length() == 1) {
     temp = "0" + temp;
    }
    result += temp;
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (null != in) {
    try {
     in.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return result;
 }

MD5加密安全性探讨:

虽然说MD5加密本身是不可逆的,但并不是不可破译的,网上有关MD5解密的网站数不胜数,破解机制采用穷举法,就是我们平时说的跑字典。所以如何才能加大MD5破解的难度呢?

1.)对字符串多次MD5加密

 public static String md5(String string, int times) {
  if (TextUtils.isEmpty(string)) {
   return "";
  }
  String md5 = md5(string);
  for (int i = 0; i < times - 1; i++) {
   md5 = md5(md5);
  }
  return md5(md5);
 }

2.)MD5加盐

加盐的方式也是多种多样

string+key(盐值key)然后进行MD5加密

用string明文的hashcode作为盐,然后进行MD5加密

随机生成一串字符串作为盐,然后进行MD5加密

 public static String md5(String string, String slat) {
  if (TextUtils.isEmpty(string)) {
   return "";
  }
  MessageDigest md5 = null;
  try {
   md5 = MessageDigest.getInstance("MD5");
   byte[] bytes = md5.digest((string + slat).getBytes());
   String result = "";
   for (byte b : bytes) {
    String temp = Integer.toHexString(b & 0xff);
    if (temp.length() == 1) {
     temp = "0" + temp;
    }
    result += temp;
   }
   return result;
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return "";
 }

总结

以上就是关于Android MD5数据加密的全部内容,希望能对Android开发者们有所帮助,如有疑问大家可以留言交流。

(0)

相关推荐

  • Android实现简单MD5加密的方法

    本文实例讲述了Android实现简单MD5加密的方法.分享给大家供大家参考,具体如下: 网上关于android下MD5加密的资料很多,但是测试了下总是跟网站的md5加密不一样, 后来才知道是编码方式不对,于是就自己写了一个. private static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; public stati

  • Android编程之MD5加密算法实例分析

    本文实例分析了Android编程之MD5加密算法.分享给大家供大家参考,具体如下: Android MD5加密算与J2SE平台一模一样,因为Android 平台支持 java.security.MessageDigest这个包.实际上与J2SE平台一模一样. 算法签名: 复制代码 代码如下: String getMD5(String val) throws NoSuchAlgorithmException 输入一个String(需要加密的文本),得到一个加密输出String(加密后的文本) pa

  • Android获取apk签名指纹的md5值(防止重新被打包)的实现方法

    本文实例讲述了Android获取apk签名指纹的md5值以防止重新被打包的实现方法.分享给大家供大家参考,具体如下: 做个记录(这里只是Java层的签名校验,java层容易被破解,我建议apk加固下) 获取md5值来进行Apk签名校验, 可以防止apk重新被打包. 下面我说说怎么获取apk签名的md5值(有三种方法) 1.用代码获取签名指纹的md5值 /** * MD5加密 * @param byteStr 需要加密的内容 * @return 返回 byteStr的md5值 */ public

  • 深入浅析Android手机卫士保存密码时进行md5加密

    推荐阅读: 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士关闭自动更新 详解Android 手机卫士设置向导页面 一般的手机没有root权限,进不去data/data目录,当手机刷机了后,拥有root权限,就可以进入data/data目录,查看我们保存的密码文件,因此我们需要对存入的密码进行MD5加密 获取MessageDigest信息摘要器对象,调用MessageDigest.getInstance("md5"),参数:规则 调用MessageDigest对象

  • android md5加密与rsa加解密实现代码

    复制代码 代码如下: import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { /* * MD5加密 */ public static String getDigest(String str) { MessageDigest messageDigest = nul

  • Android md5加密与php md5加密一致详解

     Android md5加密与php md5加密一致详解 在Android开发过程中加密密码常常采用md5加密方式,然而如果服务器端采用PHP开发(php采用md5加密很简单,直接md5($str)),很可能与Java的md5加密不一致.以下方法是md5加密与php一致的源码: import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException

  • java,android,MD5加密算法的实现代码(16位,32位)

    如下所示: import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Md5 { public static String getMD5(String val) throws NoSuchAlgorithmException{ MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update

  • 深入理解Android MD5数据加密

    MD5加密 MD5是由MD2.MD3.MD4演变过来的,虽然MD5加密算法现在有些人已经将其解开了,但是它的加密机制依然很强大,我想绝大对数还是不会解开的.MD5加密算法是单向加密,是不可逆的一种的加密方式,只能用你的密码才能解开,要不就是会解密算法,否则想都别想解开. MD5加密的特点 压缩性:任意长度的数据,算出的MD5值长度都是固定的. 容易计算:从原数据计算出MD5值很容易. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别. 强抗碰撞:已知原数据和其MD

  • 深入理解Android M 锁屏密码存储方式

    Android M 之前锁屏密码的存储 在 Android M 之前,锁屏密码的存储格式很简单,其使用了 64 位随机数作为 salt 值,此 salt 值被存储在 SQLite 数据库 /data/system/locksettings.db 中.密码在存储的时候,会将输入的密码加上此随机数组成新的字符串.然后对新的字符串分别进行 SHA-1 和 MD5 加密,将加密后的密文通过 MD5 + SHA-1 的方式进行字符串拼接,组成新的密文存储在 /data/system/password.ke

  • 深入理解Android热修复技术原理之代码热修复技术

    一.底层热替换原理 1.1.Andfix 回顾 我们先来看一下,为何唯独 Andfix 能够做到即时生效呢? 原因是这样的,在 app运行到一半的时候,所有需要发生变更的分类已经被加载过了,在Android 上是无法对一个分类进行卸载的.而腾讯系的方案,都是让 Classloader去加载新的类.如果不重启,原来的类还在虚拟机中,就无法加载新类.因此,只有在下次重启的时候,在还没走到业务逻辑之前抢先加载补丁中的新类,这样后续访问这个类时,就会Resolve 为新的类.从而达到热修复的目的. An

  • 深入理解Android中的建造者模式

    前言 在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等.虽然我们对大多数设计模式都有所了解,但是在应用设计模式的这个方面,感觉很多人在这方面有所不足.所以这篇文章我们一起深入的理解Android中的建造者模式. 建造者模式(Builder Pattern)也叫生成器模式,其定义如下: separate the construction of a complex object from

  • 学习理解Android菜单Menu操作

    今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性.Andro

  • 深入理解Android热修复技术原理之资源热修复技术

    一.普遍的实现方式 目前市面上的很多资源热修复方案基本上都是参考了 Instant Run的实现. 简要说来,Instant Run中的资源热修复分为两步: 1.构造一个新的 AssetManager,并通过反射调用 addAssetPath,把这个完 整的新资源包加入到AssetManager中.这样就得到了一个含有所有新资源的 AssetManager. 2.找到所有之前引用到原有 AssetManager的地方,通过反射,把引用处替换 为 AssetManager. 一个 Android

  • 一文理解Android系统中强指针的实现

    强指针和弱指针基础 android中的智能指针包括:轻量级指针.强指针.弱指针. 强指针:它主要是通过强引用计数来进行维护对象的生命周期. 弱指针:它主要是通过弱引用计数来进行维护所指向对象的生命周期. 如果在一个类中使用了强指针或者弱指针的技术,那么这个类就必须从RefBase这个类进行做继承,因为强指针和弱指针是通过RefBase这个类来提供实现的引用计数器. 强指针和弱指针关系相对于轻量级指针来说更加亲密,因此他们一般是相互配合使用的. 强指针原理分析 以下针对源码的分析都是来源于andr

  • 深入理解Android热修复技术原理之so库热修复技术

    目录 一.SO库加载原理 二.SO库热部署实时生效可行性分析 2.1.动态注册 native 方法实时生效 2.2.静态注册 native 方法实时生效 2.3.SO实时生效方案总结 三.SO库冷部署重启生效实现方案 3.1.接口调用替换方案 3.2.反射注入方案 四.如何正确复制补丁 SO库 五.本章小结 一.SO库加载原理 Java Api 提供以下两个接口加载一个 so 库 System. loadLibrary (String libName):传进去的参数:so库名称, 表示的so 库

随机推荐