Md5加密Java实现

什么是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位的数据了。

 

public static String createMD5(String str) {
        StringBuffer stringBuffer = null;
        String hexString = null;
        try {
                //1.指定加密算法类型
                MessageDigest digest = MessageDigest.getInstance("MD5");
                //2.将需要加密的字符串转换成byte数组
                byte[] hash = digest.digest(str.getBytes("UTF-8"));
                //3.拼接数据
                stringBuffer = new StringBuffer();
                for (byte b : hash) {
                    int i = b&0xFF;
                    //int类型的i需要转换成16进制
                    hexString = Integer.toHexString(i);
                    if(hexString.length()<2) {
                         hexString = "0"+hexString;
                    }
                    stringBuffer.append(hexString);
                }
        } 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();
    }

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值