MD5
- MD5用的是哈希函数,典型的应用是对一段信息产生信息摘要,以防止被篡改
- 无论多长的输入,MD5算法都会输出一个128位的一个串(通常用16进制表示为32个字符)
- 我们大致的了解一下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);
}
}
}
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);
}
}
}
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的哈希算法流程

代码实现
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);
}
}
}
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);
}
}
}
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
- 全称是循环冗余校验
- 特色是检错能力极强,开销小
- 具体计算举个例子说明:

这个式子表达的是用CRC4计算二进制序列10110011的校验码
CRC4其实是个多项式G(x)=X^4+ X^3+1,可以看做是 12^4+12^3+02^2+02^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()));
}
}
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()));
}
}
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())); } }
加密后结果如下

三种区别
- 以上三种加密算法都是通过对数据计算,来生成一个校验值,然后用该校验值来完成对数据完整性的校验
- 不同之处在于:

[Linux] 文件校验命令
Linux下文件校验(文件完整性检查)命令有crc32
, md5sum
, sha1sum
, cksum
等等。其中crc32
和cksum
在macOS上也有。
