Android数据加密之MD5加密

什么是MD5加密:
MD5英文全称“Message-Digest Algorithm 5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的,是一种单向加密算法,是不可逆的一种的加密方式。
MD5的特点
压缩性:任意长度的数据,算出的MD5值都是固定的;
容易计算:从原数据计算出MD5值很容易;
抗修改性:对原数据进行任何改动,哪怕是修改一个字节,所得到的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值

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加密(也就是一份for循环,规定反复加密几次)

	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加密)