一、前言
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。数据加密离不开加密算法,今天给大家分享的小知识是由数字证书延伸开的加密算法,其中涉及对称加密和非对称加密算法,也会聊聊不算加密算法的消息摘要算法,最后对从客户端到服务端证书验证到双方实现安全高效数据通信究竟发生了什么做一个总结。
二、数字证书 Digital Certificate
2.1 查看
2.2 构成
包括但不仅限于证书的颁发者、使用者(持有者)、有效期、公钥、签名使用的算法、证书认证链等等
2.3 作用
官方的话说就是
数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。
用人话讲就是
能让你在上班摸鱼时保证摸鱼内容不被坏人窃取、篡改,影响你上网正常摸鱼,这样是不是很好理解呢 :|)
2.4 小结
数字证书是由电子商务认证中心(CA
中心)所颁发的一种较为权威与公正的证书,用来互相验证双方身份,就像是我们的身份证一样,能够帮助我们不被没有身份证且“意图不轨”的坏人损害利益,主要体现在数据传输安全性上
三、数据安全
3.1 数据加密 Encryption
-
数据加密就是将原来的明文按某种算法进行处理,加工成一段不容易读懂、晦涩的代码,加密过后的片段被称之为密文
-
数据加密是保护数据安全的一个重要手段
3.1.1 对称加密 Symmetrical Encryption
- 一个密钥可以同时用作信息的加密和解密,也被称之为 单密钥加密 。当消息发送方需要加密大量数据时使用对称加密,此时对称加密也被称为 密钥加密
简要示意图:
优点:
-
加密/解密速度快,适合大量数据传输,效率很高
-
认可度高,应用范围广
缺点:
-
只要一方密钥被泄露,通信密文就会被破解
-
在对称加密算法中,数据安全性不仅取决于算法,更取决于对密钥的管理安全性,为了密钥的唯一性,每次加密都会生成密钥,这样会导致密钥管理负担重
3.1.2 非对称加密 Asymmetric Encryption
- 对称加密使用的是同一个密钥,而非对称加密使用的是一对密钥,有公钥和私钥之分
简要示意图:
-
如果用公钥对数据进行加密,只有用对应的私钥才能解密
-
如果用私钥对数据进行加密,那么只有用对应的公钥才能解密
典型:
RSA
优点:
-
加密密钥公开,密钥分配和管理简单,无负担
-
算法复杂度高,安全性高于对称加密算法
缺点:
-
本身对性能要求就比较高,密钥越长,性能开销越大,无法用于长期通信
-
对于大量数据的加密/解密数据以及效率低下
3.1.3 消息摘要算法 Message-Digest Algorithm
面试官:你有了解过哪些加密算法?
你磕磕巴巴:MD5、SHA1、SHA256……
面试官:你可以回家等消息了!
MD5
、SHA1
、SHA256
这些都属于密码散列函数,是用于产生散列值,主要用于确保信息传输的完整与无误的,在严格意义上不能算是加密算法,只能说是信息摘要算法
示意图:
使用场景:
- 使用公钥对摘要信息进行加密,弥补摘要算法易破解的不足的同时还能用来验证消息是否完整无误,适用于数字签名
算法实现:
这里以 MD5
举例,SHA
家族同理
public class MD5Encrypt {
private static final String ALGORITHM = "MD5";
private static byte[] getDigest(String s) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance(MD5Encrypt.ALGORITHM);
md5.reset();
md5.update(s.getBytes(StandardCharsets.UTF_8));
// digest 摘要
return md5.digest();
} catch (Exception e) {
System.out.println(e);
}
return null;
}
private static String digestToHex(byte hash[]) {
if (hash == null) {
return null;
}
StringBuilder builder = new StringBuilder(hash.length * 2);
for (int i = 0; i < hash.length; i++) {
if ((hash[i] & 0xff) < 0x10) {
builder.append("0");
}
builder.append(Long.toString(hash[i] & 0xff, 16));
}
return builder.toString();
}
private static String md5(String clearText) {
try {
return new String(
digestToHex(getDigest(clearText)).getBytes(StandardCharsets.UTF_8),
StandardCharsets.UTF_8);
} catch (Exception e) {
System.out.println(e);
}
return clearText;
}
public static void main(String[] args) {
// 明文信息
final String clearText = "HUALEI";
// 摘要消息
String cipherText = md5(clearText);
// 明文:HUALEI,经过 MD5 算法处理后的摘要消息:eaf606892525d3abbb0cc2ddbdfd144d
System.out.println("明文:" + clearText + ",经过 " + ALGORITHM + " 算法处理后的摘要消息:" + cipherText);
}
}
特征:
-
具有普遍、稳定和快速的特点
-
抗碰撞性差,摘要处理后的消息安全性低
-
具有伪随机性,相同算法加密相同消息,加密后的结果一定是相同的
-
一个字节被改变了,产生的摘要信息就大相径庭
-
无论消息多长,产生的摘要消息长度都是固定的
-
摘要消息,该算法越安全
3.2 数据解密
- 加密的逆向过程即为解密,也就是将原来晦涩难懂的代码片段转换成双方都能识别的明文,也就是得到加密前的数据
四、工作机制
我想大家一定有以下问题:
数字证书是如何通过加密算法保证数据安全的呢?它的工作机制到底是什么?
数字证书是通过申请并且缴费获得的,基于 HTTPS
协议,相较于 HTTP
协议更安全。
4.1 具体工作流程
-
客户端发送请求到服务端获取包含 公钥 A 的 CA 数字证书,私钥 B 则保存在服务器端,随后开始验证证书的合法性
-
合法则取出其中的 公钥 A 对生成随机码加密,向服务器发送加密后的随机码,作为后面传输数据时使用的对称加密算法的密钥
-
服务端拿到加密后的随机码后用之前保存的 私钥 B 进行解密,从而拿到原始随机码,用它来加密向客户端传输的内容数据,随即发送
-
由于客户端保存了一份原始随机码,只要拿它作为对称加密的密钥即可解密传输过来的内容数据
-
至此,客户端和服务端就建立了一种能安全高效地传输所有数据的通信连接了 (o゜▽゜)o☆[BINGO!]
RSA 加密算法基于 HTTPS 进行数据传输图解:
4.2 总结概括
-
双方通过数字证书确认身份,数字签名和原始信息组成了数字证书,通过公钥加解密拿到摘要算法处理后的摘要消息并比对原始消息确认信息是否完整无误
-
由于性能损耗是非对称加密的最大弊端,所以基于
HTTPS
进行大量数据传输时,为了平衡效率和安全性,需要将 非对称加密和对称加密算法结合 起来 -
对称公钥通过公钥加密,只有另一方的私钥才能解密,解开后方能使用它解密传输的内容,从此利用对称公钥保持连接通信
结尾
撰文不易,欢迎大家点赞、评论,你的关注、点赞是我坚持的不懈动力,感谢大家能够看到这里!Peace & Love。