MD5加密算法

我们在平时做项目的时候,需要用到一些算法,将一些重要信息加密,MD5加密算法具有不可逆性,只能加密,但是解密非常困难,我们在程序中可以这么去写。

String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());

DigestUtils是一个工具类,里面的方法都使用了static进行修饰,md5DigestAsHex里面应该传的是一个数组,因此,我们应该使用password.getBytes()把String转换成数组。

此外,MD5算法可以作为校验和使用,例如TCP协议里面有一个字段名叫做16位校验和。

MD5加密算法_第1张图片

 所谓校验和其实就是为了验证看当前的数据是否出现问题了,因为我们TCP报文在传输的过程中数据可能会有破坏,因此我们要进行校验,如果校验结果不符合的话就将报文丢弃。

常见的校验的方法有两种(TCP用的不是这两种)

1.crc循环冗余校验

 

现在有一串数据,把它当成二进制的数据,以字节为单位,取出数据,然后把这些数据进行累加,溢出的部分就不要了,无所谓。

short sum = 0;
for (byte b : 数组) {
    sum += b;
}

然后传输数据的时候,把这个sum和数据一起传输过去,接收方拿到数据和sum之后,用相同的方法计算,得到sum2,如果sum != sum2,说明数据损失或者改变了。

为什么数据在传输的过程中会损失或者改变?

数据是以光电信号进行传输的,很可能发生比特翻转的情况,就是0变成了1,1变成了0,导致数据被破坏。

可以看到crc数据循环校验这个方法是很有风险的,因为很有可能两个不同的数据算出来的crc是一致的。

因此我们介绍md5算法:

MD5算法本质上是一种字符串哈希算法,把数据通过一个哈希函数转换成一个数组下标。

MD5算法的特性:

  1. 定长:不管输入的字符串是多次,得到MD5的值都是固定长度!
  2. 分散:输入的字符串哪怕只发生了细微变化,得到的MD5值都会发生巨大改变
  3. 不可逆,给定原字符串,很容易得到MD5,但是很难恢复成原始字符串。

MD5算法应用场景

  1. 作为哈希算法(本来职责)
  2. 作为校验和
  3. 应用于密码学场景

你可能感兴趣的:(安全,http,网络协议)