Welcome

首页 / 移动开发 / Android / 深入理解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开发者们有所帮助,如有疑问大家可以留言交流。