摘要算法(MD5、SHA、CRC)

文章目录

    • MD5
    • SHA1
    • CRC
    • 三种区别

MD5

  • MD5用的是哈希函数,典型的应用是对一段信息产生信息摘要,以防止被篡改
  • 无论多长的输入,MD5算法都会输出一个128位的一个串(通常用16进制表示为32个字符)
  • 我们大致的了解一下MD5的算法流程
    • MD5算法将输入的信息进行分组,每组512位(64字节),顺序处理完所有分组后输出128位结果
    • 在每一组消息的处理中,都要进行4轮,每轮16步
    • (1)进行数据填充整理:将要加密的二进制数据对512取模,得到的结果如果不足448位则进行补足,补足方式是第一位填充1,后面全部填充0
    • (2)记录数据长度:经过第一步数据整理后数据的位数可以表示为N*512+448,再向后追加64位用于存储数据长度(以字节为单位),填充后,数据的位数将变为(N+1)*512,如果消息的长度大于2^64,则只使用其低64位进行填充
    • (3)数据处理:MD5的实现需要每512字节就进行一次处理,后一次处理的输入为前一次处理的输出,因此,在循环处理开始前,需要4个链接变量作为输入,它们分别是:int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476
    • (4)进行N轮循环处理,将最后结果输出:这一步是每轮数据的处理算法,每一轮处理也要循环64次,这64次循环又分为4组(每16次循环为1组),每组循环使用不同的逻辑处理函数,处理完成后,将输出作为下一轮循环的输入
      • 具体运算使用到了4个逻辑函数F、G、H、I,分别对应4轮运算(每轮再进行16次操作),每轮循环都很相似,首先将四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d
      • 第一轮的16次操作中,每次操作对a、b、c和d中的其中三个做一次非线性函数运算,然后将所得结果加上第四个变量,一个子分组和一个常数。
      • 再将所得的结果向右环移一个不定的数,再加上a,b,c或d中之一,最后再用该结果取代a、b、c或d中之一
    • (5)输出结果:当全部信息处理完成后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后输出的是A、B、C和D的级联,当全部分组的数据都处理完成后,将结果级联,即得到MD5处理的结果

java代码MD5加密

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

//MD5加密
public class MD5 {
    public static void main(String[] args) {
        try {
            //MessageDigest 为应用程序提供信息摘要算法
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String secret = "dean";
            byte[] secret_bytes = secret.getBytes(StandardCharsets.UTF_8);
            byte[] digest = md5.digest(secret_bytes);
            StringBuilder res = new StringBuilder();
            //将字节转换为16进制
            for (byte b : digest) {
                String row = Integer.toHexString(b & 0xff);
                if (row.length() == 1) {
                    row = "0" + row;
                }
                res.append(row);
            }
            System.out.println("加密后密文:"+res);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

输出如下:
在这里插入图片描述

SHA1

  • SHA1被称为安全哈希算法,SHA1比MD5更复杂,所以也更加安全
  • 对于长度小于2^64位的消息,SHA1会产生160位的消息摘要
  • SHA1的哈希算法流程
    • (1)将512位的明文划分位16个子明文分组,每个子明文分组为32位
    • (2)申请5个32位的链接变量(和MD5类似),记为A、B、C、D、E
    • (3)16份子明文分组扩展位80份
    • (4)80份子明文分组进行4轮运算
    • (5)链接变量与初始链接变量进行求和运算
    • (6)链接变量作为下一个明文分组的输入重复进行以上操作
    • (7)最后,5个链接变量中的数据就是SHA1的摘要
      代码实现
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class SHA {
    public static void main(String[] args) {
        try {
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            String secret = "dean";
            byte[] secret_bytes = secret.getBytes(StandardCharsets.UTF_8);
            //加密
            byte[] digest = sha1.digest(secret_bytes);
            System.out.println("共"+digest.length+"字节");
            //将密文解析为16进制
            StringBuilder res = new StringBuilder();
            for (byte b : digest) {
                String row = Integer.toHexString(b & 0xff);
                if (row.length() == 1) {
                    row = "0" + row;
                }
                res.append(row);
            }
            System.out.println("加密后密文:"+res);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

输出如下:
在这里插入图片描述

CRC

  • 全称是循环冗余校验
  • 特色是检错能力极强,开销小
  • 具体计算举个例子说明:
    摘要算法(MD5、SHA、CRC)_第1张图片
    这个式子表达的是用CRC4计算二进制序列10110011的校验码
    CRC4其实是个多项式G(x)=X^4+ X^3+1,可以看做是 1*2^4+1*2^3+0*2^2+0*2^1+1*2^0,取系数则为11001
    因为五位多项式可以生成四位校验码,所以二进制序列后加了四个0,最终异或得到的0100即校验码
    用0100替换原始二进制序列中的四个0得到的新帧101100110100会被发给接收端,接收端用新帧再除11001来验证余数是否为0,若为0,则说明没有出现差错,否则出现了差错

java中提供了CRC32的工具进行加密校验

import java.nio.charset.StandardCharsets;
import java.util.zip.CRC32;

public class CRC {
    public static void main(String[] args) {
        CRC32 crc32 = new CRC32();
        String secret = "dean";
        //加密
        crc32.update(secret.getBytes(StandardCharsets.UTF_8));
        System.out.println(Long.toHexString(crc32.getValue()));
    }
}

加密后结果如下
在这里插入图片描述

三种区别

  • 以上三种加密算法都是通过对数据计算,来生成一个校验值,然后用该校验值来完成对数据完整性的校验
  • 不同之处在于:
    • 算法不同:CRC采用的是多项式除法、MD5和SHA1使用的是替换、轮转等方法
    • 校验长度不同,CRC的校验位长度与其多项式相关,一般为16位或32位,MD5一般是32个字节或16个字节(其实是截取32字节中的16字节),SHA1是20个字节
    • 校验值的称呼不同,CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值或散列值
    • 安全性不同,这里的安全性指的是检错的能力,CRC的安全性和多项式相关,相对于MD5和SHA1要弱很多,MD5的安全性较高,SHA1的安全性最高
    • 效率不同,CRC的计算效率很高,MD5和SHA1比较慢
    • 用途不同,CRC一般用作通信数据的校验,MD5和SHA1用于安全领域,比如文件校验,数字签名等
    • ps:CRC意在检测数据是否被意外更改,通常用于网络和存储设备,该算法的目的不是为了防止故意篡改,而是要捕捉网络错误和磁盘写入错误等事故,所以该算法的重点在于速度,而不是安全性

你可能感兴趣的:(SpringCloud,算法,哈希算法,安全)