博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android数据加密之MD5加密
阅读量:7138 次
发布时间:2019-06-28

本文共 4276 字,大约阅读时间需要 14 分钟。

前言:

      项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法。

什么是MD5加密?

     MD5英文全称“Message-Digest Algorithm 5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的,是一种单向加密算法,是不可逆的一种的加密方式。

     其他几种加密方式:

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 "";    }

总结:

    MD5加密简单的总结到此为止。

 

转载地址:http://kkvrl.baihongyu.com/

你可能感兴趣的文章
linux基础(day 33)
查看>>
12.6 Nginx安装 12.7 默认虚拟主机 12.8 Nginx用户认证 12.9 Nginx域名重定向
查看>>
MaxCompute Studio 使用入门
查看>>
linux进程介绍
查看>>
nginx服务器出现504 gateway time-out怎么解决
查看>>
Java-实现链表的基本操作
查看>>
部署android开发环境总结
查看>>
我的友情链接
查看>>
利用makefile构建c++项目的思路介绍
查看>>
ssh的反向隧道
查看>>
F5 DDoS防御小妙招:减轻DDoS***危害的六大最佳方法
查看>>
echo
查看>>
MariaDB,MySQL中存储过程的学习笔记
查看>>
一张图诠释linux系统启动过程
查看>>
载入jQuery库的最佳方法
查看>>
系统错误提示修复Repair Filesystem
查看>>
【DAY20】Socket编程的补充2
查看>>
Openstack 网络服务Neutron [五]
查看>>
如何看硬盘SMART参数----用HDtune工具查看
查看>>
PUTTY使用Ctrl+s僵死的问题
查看>>