我们在平时做项目的时候,需要用到一些算法,将一些重要信息加密,MD5加密算法具有不可逆性,只能加密,但是解密非常困难,我们在程序中可以这么去写。
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
DigestUtils是一个工具类,里面的方法都使用了static进行修饰,md5DigestAsHex里面应该传的是一个数组,因此,我们应该使用password.getBytes()把String转换成数组。
此外,MD5算法可以作为校验和使用,例如TCP协议里面有一个字段名叫做16位校验和。
所谓校验和其实就是为了验证看当前的数据是否出现问题了,因为我们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算法的特性:
- 定长:不管输入的字符串是多次,得到MD5的值都是固定长度!
- 分散:输入的字符串哪怕只发生了细微变化,得到的MD5值都会发生巨大改变
- 不可逆,给定原字符串,很容易得到MD5,但是很难恢复成原始字符串。
MD5算法应用场景
- 作为哈希算法(本来职责)
- 作为校验和
- 应用于密码学场景
版权归原作者 胡桃姓胡,蝴蝶也姓胡 所有, 如有侵权,请联系我们删除。