软件编程
位置:首页>> 软件编程>> Android编程>> 深入理解Android MD5数据加密

深入理解Android MD5数据加密

作者:总李写代码  发布时间:2022-03-16 07:48:03 

标签: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 "";
}

总结

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com