Android-Java Md5加密技术

来源:互联网 发布:c语言编程步骤 编辑:程序博客网 时间:2024/04/19 09:02

什么是MD5加密


    百度给出的解释是:MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。


MD5 作用


    MD5在论坛上、软件发布时经常用,是为了保证文件的正确性,防止一些人盗用程序,加些木马或者篡改版权,设计的一套验证系统。每个文件都可以用MD5验证程序算出一个固定的MD5码来。 MD5所有加密后的数据长度都是32位,且每位都是由16进制的数字代表,只需对字符串做简单的修改,得到的MD5数据都是大不相同的。对于一些必要重要的密码或者签名,我们都需要通过MD5加密后保存,MD5具有不可逆性,不能被反解码,然而有一些公司通过建立数据库存储MD5的各种值来实现解码,但是其数据库包含数据有限,依然不能做到完全解码,我们只需要对MD5加密后进行处理能很容易的使其不能被解码。


MD5加强处理


实现方法有:

1.对已经进行过MD5加密的数据再次进行MD5加密。

2.对原有数据加一串其他字符来使其变得复杂也可以做到不能被解码。(所加字符串一般是已经协商好的)


 MD5加密的优点


    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。  2、容易计算:从原数据计算出MD5值很容易。  3、不可逆:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别,且不可逆。  4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。  5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。


MD5加密原理


   先将字符串转换成字节数组把数组中每个字节拿出来与0xFF相与将其所得值转换成int型,得到一个16组的数据,每组数据都占两位,当然得到的数据可能不是32位,但是MD5的数据严格要求所得数据必须是32位,所以我们会遍历数组把不是两位的数据其前面加上一个0使其成为两位。这样我们就一定能的到一个32位的数据了。

    private static String createMD5(@NonNull String str) {        try {            //1.指定加密算法类型              MessageDigest digest = MessageDigest.getInstance("MD5");            //2.将需要加密的字符串转换成byte数组              byte[] hash = digest.digest(str.getBytes("UTF-8"));            //3.拼接数据              StringBuffer stringBuffer = new StringBuffer();            StringBuilder hex = new StringBuilder(hash.length * 2);            for (byte b : hash) {                int i = b&0xFF;                //int类型的i需要转换成16进制                  String hexString = Integer.toHexString(i);                if(hexString.lenth()<2)                {                    hexString = "0"+hexString;                }                stringBuffer.append(hexString);            }            hex.append(Integer.toHexString(b & 0xFF));        } catch (NoSuchAlgorithmException e) {            //e.printStackTrace();              throw new RuntimeException("Huh, MD5 should be supported?", e);        } catch (UnsupportedEncodingException e) {            //e.printStackTrace();              throw new RuntimeException("Huh, UTF-8 should be supported?", e);        }        return stringBuffer.toString();    }


原创粉丝点击