Nodejs中crypto模块的安全知识讲解(2)
秘钥:为了进一步增强加/解密算法的安全性,在加/解密的过程中引入了秘钥。秘钥可以视为加/解密算法的参数,在已知密文的情况下,如果不知道解密所用的秘钥,则无法将密文解开。
encryptedText = encrypt(plainText, encryptKey) plainText = decrypt(encryptedText, decryptKey)
根据加密、解密所用的秘钥是否相同,可以将加密算法分为对称加密、非对称加密。
1、对称加密
加密、解密所用的秘钥是相同的,即encryptKey === decryptKey。
常见的对称加密算法:DES、3DES、AES、Blowfish、RC5、IDEA。
加、解密伪代码:
encryptedText = encrypt(plainText, key); // 加密 plainText = decrypt(encryptedText, key); // 解密
2、非对称加密
又称公开秘钥加密。加密、解密所用的秘钥是不同的,即encryptKey !== decryptKey。
加密秘钥公开,称为公钥。解密秘钥保密,称为秘钥。
常见的非对称加密算法:RSA、DSA、ElGamal。
加、解密伪代码:
encryptedText = encrypt(plainText, publicKey); // 加密 plainText = decrypt(encryptedText, priviteKey); // 解密
3、对比与应用
除了秘钥的差异,还有运算速度上的差异。通常来说:
对称加密速度要快于非对称加密。
非对称加密通常用于加密短文本,对称加密通常用于加密长文本。
两者可以结合起来使用,比如HTTPS协议,可以在握手阶段,通过RSA来交换生成对称秘钥。在之后的通讯阶段,可以使用对称加密算法对数据进行加密,秘钥则是握手阶段生成的。
备注:对称秘钥交换不一定通过RSA,还可以通过类似DH来完成,这里不展开。
数字签名
从签名大致可以猜到数字签名的用途。主要作用如下:
确认信息来源于特定的主体。
确认信息完整、未被篡改。
为了达到上述目的,需要有两个过程:
发送方:生成签名。
接收方:验证签名。
1、发送方生成签名
计算原始信息的摘要。
通过私钥对摘要进行签名,得到电子签名。
将原始信息、电子签名,发送给接收方。
附:签名伪代码
digest = hash(message); // 计算摘要 digitalSignature = sign(digest, priviteKey); // 计算数字签名
2、接收方验证签名
通过公钥解开电子签名,得到摘要D1。(如果解不开,信息来源主体校验失败)
计算原始信息的摘要D2。