Nodejs中加密模块安全知识讲解
在互联网时代,互联网上的数据量每天都在以惊人的速度增长。与此同时,各种网络安全问题层出不穷。在信息安全日益重要的今天,作为开发者,有必要通过技术手段强化安全意识,提升服务的安全性。
密码模块是nodejs的核心模块之一,提供与安全相关的功能,如抽象运算、加密、电子签名等。许多初学者不知道如何开始使用长的API列表,因此它涉及到安全领域的大量知识。
本文重点介绍API背后的理论知识,主要包括以下内容:
哈希,基于哈希的消息认证码(HMAC)
对称加密、非对称加密、电子签名
块加密模式
摘要(散列)
摘要:以长度不固定的消息为输入,通过运行hash函数生成长度固定的输出,这个输出称为抽象。通常用于验证消息是否完整且未被篡改。
抽象操作是不可逆的。也就是说,当输入固定时,产生固定的输出。但是当你知道输出时,你就不能推导出输入。
伪代码如下。
摘要=哈希(消息)
常见的总结算法及相应的输出位数如下:
MD5:128位
Sha-1: 160位
SHA256 :256位
SHA512:512位
nodejs中的示例:
var crypto=require(' crypto ');var MD5=crypto . create hash(' MD5 ');var message=' hellovar digest=md5.update(消息,“utf8”)。摘要(' hex ');console.log(摘要);//输出如下:注意这是十六进制。//5d 41402 ab C4 b2a 76 b 9719d 911017 c 592备注:在各种文章或文档中,抽象、hash、hash三个词经常混用,导致很多初学者看起来很困惑。其实大部分都是指同一件事。只要记住上面对抽象的定义。
麦克、HMAC
MAC(消息认证码):确保数据完整性的消息认证码。操作结果取决于消息本身和密钥。
MAC可以用很多不同的方式实现,比如HMAC。
HMAC(基于散列的消息认证码)可以大致理解为一个带有密钥的散列函数。
nodejs示例如下:
const crypto=require(' crypto ');//参数1:抽象函数//参数2:密钥lethmac=crypto.createhmac ('MD5 ',' 123456 ');让ret=hmac.update('hello ')。摘要(' hex ');console . log(ret);//9c 699d 7 af 73 a 49247 a 239 CB 0 d2f 8139对称加密和非对称加密
加密/解密:给定明文,通过某种算法生成加密密文,称为加密。反过来就是解密。
加密文本=加密(明文)明文=解密(encrypt text)密钥:为了进一步增强加密/解密算法的安全性,在加密/解密过程中引入了一个密钥。密钥可视为加密/解密算法的参数。当密文已知时,如果用于解密的密钥未知,则无法解密密文。
加密文本=加密(纯文本,加密密钥)纯文本=解密(加密文本,解密密钥)根据用于加密和解密的密钥是否相同,加密算法可以分为对称加密和非对称加密。
1.对称加密
加密和解密使用相同的密钥,即encryptKey===decryptKey。
常见的对称加密算法:DES、3DES、AES、Blowfish、RC5、IDEA。
加密和解密伪代码:
encryptedText=encrypt(明文,密钥);//加密明文=解密(加密文本、密钥);//解密2。不对称加密
也称为公钥加密。加密和解密使用不同的密钥,即encryptKey!==decryptKey .
加密密钥是公开的,称为公钥。解密密钥是秘密的,称为秘密密钥。
常见的非对称加密算法:RSA、DSA、ElGamal。
加密和解密伪代码:
encryptedText=encrypt(明文,公钥);//加密明文=解密(加密文本,私钥);//解密3。比较与应用
除了密钥不同,计算速度也不同。一般来说:
对称加密比非对称加密快。
非对称加密通常用于加密短文本,对称加密通常用于加密长文本。
它们可以一起使用,例如HTTPS协议,它可以在握手阶段通过RSA交换和生成对称密钥。在后期通信阶段,可以使用对称加密算法对数据进行加密,在握手阶段生成密钥。
注意:对称密钥交换不一定要通过RSA完成,也可以通过DH完成,这里不展开。
数字签名
数字签名的用途可以从签名中大致猜到。主要功能如下:
确认信息来自特定主题。
确认信息完整且未被篡改。
为了实现上述目标,有两个过程:
发件人:生成签名。
收件人:验证签名。
1.发送者生成签名
计算原始信息的摘要。
摘要由私钥签名以获得电子签名。
将原始信息和电子签名发送给接收方。
附件:签名伪码
digest=hash(消息);//计算抽象数字签名=sign (digest,private key);//计算数字签名2。接收者验证签名
用公钥解开电子签名,得到抽象的D1。(解决不了的,信息源主体验证失败)
计算汇总D2的原始信息。
对比D1和D2,如果D1等于D2,原始信息完整,没有被篡改。
附件:签名验证伪码
digest1=验证(数字签名,公钥);//get digest2=hash(消息);//计算原始信息的摘要。digest1===digest2 //验证是否相等。3.比较非对称加密。
由于RSA算法的特殊性,加密/解密和签名/验证看起来非常相似,容易被很多同学混淆。先记住以下结论,以后有时间再详细介绍。
加密/解密:公钥加密和私钥解密。
签名/验证:私钥签名,公钥验证。
数据包加密模式、填充、初始化向量
常见的对称加密算法,如AES和DES,都采用块加密方式。其中,有三个关键概念需要掌握:模式、填充和初始化向量。
了解了这三点,我们就知道加密模块对称加密API的参数是什么意思,知道出了问题该如何排除故障。
1.块加密模式
所谓块加密,就是将(长)明文拆分成固定长度的块,然后按照特定的方式对拆分后的块进行加密。
常见的块加密方式有:ECB(不安全)、CBC(最常用)、CFB、OFB、CTR等。
以最简单的ECB为例,消息首先被拆分成相等的模块,然后使用密钥进行加密。
假设每个块的长度是128位
2.初始化向量:四
为了增强算法的安全性,在部分块加密模式(CFB、OFB、CTR)中引入初始化向量(IV)来随机化加密结果。也就是说,对于相同的明文,IV不同,加密结果也不同。
以CBC为例,每个数据块在与前一个加密块进行OR运算后被加密。对于第一个数据块,它与IV为或。
IV的大小与数据块的大小(128位)有关,与密钥的长度无关。
3.填充:填充
块加密模式需要加密固定长度的块。在分组被分割之后,最后一个数据块的长度可以小于128位,这需要被填充以满足长度要求。
填充方式有多少种?一种常见的填充方法是PKCS7。
假设数据包长度为k字节,最后一个数据包长度为k-last,可以看出:
无论明文的长度是多少,在加密之前都会先填充明文(否则解密函数无法区分最后一个包是否被填充,因为存在最后一个包的长度刚好等于k的情况)
如果最后一个包的长度等于k-last===k,那么填充内容就是一个完整的包.k (k字节)
如果最后一个数据包的长度小于k-last k,则填充内容为k-last mod k。
01-if lth mod k=k-102 02-if lth mod k=k-2.负担.k k-如果lth mod k=0总之,
分块加密:首先将明文分成固定长度的块(128位),然后加密。
块加密的几种模式:ECB(不安全)、CBC(最常用)、CFB、OFB、CTR。
填充:部分加密模式。当最后一个块的长度小于128位时,需要以特定的方式填充。(欧洲央行和CBC需要填补,而CFB、OFB和CTR不需要填补)
初始化向量(四):部分加密模式(CFB、OFB、CTR)将明文块与先前的密文块进行or运算。对于第一个明文块,没有之前的密文块,所以需要提供初始化向量IV(取IV作为第一个明文块之前的密文块)。此外,IV还可以随机化加密结果。
写在后面
加密模块涉及很多安全知识,这里没有办法展开。为了便于解释,有些内容可能不够严谨。请指出任何错误或遗漏。
如果你在学习中有其他问题,可以在下面的留言区讨论。谢谢你的支持。
版权声明:Nodejs中加密模块安全知识讲解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。