Md5的使用

引言

开发中经常涉及MD5(中文信息摘要、非对称性)的加密,用于确保信息传递过程中的完整一致性。它将数字、字母、汉字甚至是文件等解析为一串固定的字符值。场景有密码加密、接口参数加密、文件上传时判断文件是否重复等

MD5算法特点

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的
2、容易计算:原数据很容易生成MD5值
3、抗修改性:对原数据有任何的改动,生成的MD5值都不一样
4、强抗碰撞:不同原数据生成相同MD5值的概率极其小

实现上可以自定义生成MD5值方法,也可以使用封装好的生成MD5的方法库,例如Guava、commons.codec的DigestUtils、spring的工具类DigestUtils

Guava库生成md5

<!--guava依赖-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>14.0.1</version>
</dependency>
测试代码(这里对图片生成md5,常见的是字符串)
public static void getMd5ByGuava() throws Exception {
    File file = new File("D:/测试图片.png");
    String context = IOUtils.toString(new FileInputStream(file));
    String md5 = Hashing.md5().newHasher().putString(context, Charsets.UTF_8).hash().toString();
    System.out.println( md5);
}

commons-codec库生成md5

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.9</version>
</dependency>
public static void getMd5ByDigestUtil() throws Exception {
    try {
        File file = new File("D:/测试图片.png");
        String context = IOUtils.toString(new FileInputStream(file));
        String md5 = DigestUtils.md5Hex(context);
        System.out.println(md5);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

spring的工具类DigestUtils

DigestUtils类封装在spring-core包下
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.1.0</version>
</dependency>
String md5 = DigestUtils.md5DigestAsHex("sdfsds".getBytes());

注意

 md5加密虽然是非对称性加密(有人认为md5不是严格意义上的加密,因为非对称性),但是利用彩虹表、碰撞法、穷举法等方式还有有可能对称解析的,故而md5一般会加上个盐值(salt)来增加md5加密的复杂性,如下

 public void testMd5(){
       String content = "MVB_467961616";
       String salt = "q7er0et9u7oh1a6sdf5jlzv2zn4c.!@#$%^,./[]*&";  //salt值,增加破解难度
       String md5Hex = DigestUtils.md5Hex(content+salt);    //一般持久化存的值也是增加salt后进行md5后的值
 }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值