前言
密码学是一门研究信息加密和解密技术的科学,通过数学方法设计和分析加密算法和协议,以确保数据在传输和存储过程中的
保密性、完整性、真实性
和
不可否认性
。在前后端的各种重要交互场景中(登录,支付)往往都会用到一种或者多种加密算法,来保护用户的信息安全。
古代密码学
凯撒密码是一种替换加密方法,将字母表中的每个字母替换为其后固定位置的另一个字母。
-
阴符和阴书
阴符
是一种秘密符号或隐秘标记,用于传递重要信息。阴符通常只有发送者和接收者知道其具体含义和解码方式。阴符的具体形式和使用方式可以因时代和地域不同而有所变化。比如就是事先制作一些长度不同的竹片,然后约定好每个长度的竹片代表的内容:
大胜克敌之符,长一尺;破军擒将之符,长九寸;
阴书
是中国古代一种加密通信的方法,具体方法是将书信拆分成三部分,并分派三人发出,每人拿一部分,只有这三部分合在一起才能读懂信的内容,从而实现了机密的传递,敌人即使得到其中一部分也无法获知真实内容
现代密码学
现代密码学是保护信息安全的科学和技术,主要通过数学算法和计算机技术来实现数据的加密和解密。现代密码学广泛应用于电子商务、银行交易、网络通信、数据存储等领域。以下是现代密码学的主要内容和分类。
分类
将任意长度的数据输入转换为固定长度的散列值,用于数据完整性校验和数字签名,比如MD5,SHA-1,SHA-256
使用相同的密钥进行加密和解密操作,比如DES,AES,SM4
非对称加密算法使用一对密钥——公钥和私钥——分别进行加密和解密操作,RSA,ECC
散列函数
散列函数
(one-way hash function)是指对不同的输入值,通过单向散列函数进行计算,得到固定长度的输出值。这个输入值称为
原始值
(message),输出值称为
散列值
(hash value)。
MD5算法
MD5(Message Digest Algorithm 5)是一种广泛使用的加密散列函数,主要用于生成数据的唯一标识符或“指纹”。它的本质在于将任意长度的数据(消息)映射为固定长度的128位(16字节)的散列值。这个过程被称为散列(hashing),MD5的散列值通常以32个十六进制数字表示。
填充
:首先将输入数据填充至长度为448模512的比特数。填充的方式是将一个比特值1添加到数据末尾,然后添加0比特,直到数据长度为448比特。接着,再添加64比特来表示原始数据的长度,填充后的数据长度是512的倍数。
初始化
:使用四个32位的常量初始化四个缓冲区变量(A、B、C、D)。这些变量将用来存储最终的散列值。
处理每一块数据
:将填充后的数据分成若干个512比特的块,对每个块进行处理。每块数据通过16轮迭代计算,更新四个缓冲区变量的值。
输出结果
:将处理后的缓冲区变量值连接起来,生成128位的散列值。
下面这个图片,就是对 MD5运算过程的具体解释
const crypto = require('crypto');
function md5Hash(data) {
return crypto.createHash('md5')
.update(data, 'utf8') // 使用utf8编码进行更新
.digest('hex'); // 输出为十六进制字符串
}
// 使用示例
const input = 'Hello, World!';
const hash = md5Hash(input);
SHA256算法
SHA-256是由国家安全局(NSA)设计的加密散列函数,广泛用于数据完整性验证和密码学应用。
填充
:和前面提到的 MD5算法填充过程一样
初始化
:SHA-256算法使用8个32位的变量,初始化为特定的常数值。
处理每一块数据
:将填充后的数据分成若干个512比特的块,对每个块进行处理。每块数据通过16轮迭代计算,更新四个缓冲区变量的值。
输出结果
:将处理后的缓冲区变量值连接起来,生成128位的散列值。
应用
1.用户密码保护
用户在设置密码时,不记录密码本身,只记录密码的散列值,只有用户自己知道密码的明文。校验密码时,只要输入的密码正确,得到的散列值一定是一样的,表示校验正确。
2.接口参数校验
发送者与接收者要有一个
共享秘钥
。当发送者向接收者发送请求时,参数中附加上签名(签名由
共享秘钥 *
+*
业务参数
,进行单向散列函数加密生成)。接收者收到后,使用相同的方式生成签名,再与收到的签名进行比对,如果一致,验签成功
对称加密
对称加密是一种加密方法,其中加密和解密过程使用
相同的密钥
。这意味着加密数据时使用的密钥与解密数据时使用的密钥相同,从而确保只有持有该密钥的人能够访问原始数据。对称加密算法的主要特点是
速度快、效率高
,但密钥管理是一个关键问题,因为密钥需要安全地分发和存储。
AES算法
分别解释下,上图中,所提到的相关概念
SubBytes
:
-
过程
:使用S盒(Substitution box)对数据块中的每个字节进行替换。S盒是一个固定的替换表,将每个字节替换为另一字节,增加非线性特性。
ShiftRows
:
-
过程
:对数据块的每一行进行循环移位。第一行不变,第二行左移1个字节,第三行左移2个字节,第四行左移3个字节。这增加了数据的混淆。
MixColumns
:
-
过程
:对数据块的每一列进行混合。通过线性变换,使每列数据变成列的加权和,提高数据的扩散性(在最后一轮中省略此步骤)。
AddRoundKey
:
-
过程
:将处理后的数据块与当前轮密钥进行异或操作。每轮使用不同的轮密钥,更新数据块。
轮密钥
:
-
根据轮数的不同,根据单个原始的密钥行成一个密钥表,每一轮调用不同的密钥
应用
因为对称加密最大的优势是加密速度快,所以常用于我们 HTTPS 中大量数据的加解密,或者视频等实时通信中。
非对称加密
非对称加密算法,也被称作公钥加密算法,是一种加密机制,它依赖于一对密钥:一个是公开的密钥(public key),简称公钥;另一个是保密的密钥(private key),简称私钥。这种算法之所以被称为非对称,是因为加密和解密过程分别使用这对密钥中的不同成员。公钥可以广泛分享,用于加密信息或验证由私钥生成的数字签名;而私钥则必须严格保密,用于解密接收到的信息或创建数字签名。
RSA 算法
RSA加密算法是目前最有影响力的
公钥加密算法
,并且被普遍认为是目前
最优秀的公钥方案
之一。RSA 是第一个能同时用于
加密
和
数字签名
的算法,它能够
抵抗
到目前为止已知的
所有密码攻击
。