Node.js中不同加密算法的实现

一、加密算法

为了保证数据的安全性和防篡改,很多数据在传输中都进行了加密。例如,很多网站升级到 https 协议, https 协议就是使用了非对称加密和hash签名,还有 github 使用的 ssh ,也是非对称加密。还有大部分登录时密码采用的 MD5 加密等等。

       加密可分为三大类,对称加密非对称加密摘要算法

二、对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

 对称加密目前主流的有 AES 和 DES , AES 是新一代的标准,速度快,安全级别更高。

     1、AES:AES的加密模式有五种:CBC、ECB、CTR、OCF、CFB

                 ECB:电子密本方式,需要一个密钥即可,特点是简单,利于并行计算。

                CBC:密文分组链接方式,除了需要一个密钥之外,还需要一个向量,向量的作用也是用于数据的加密,所以这个的安全性要好于 ECB

              CTR、OCF、CFB:具体算法的实现方式不一样,优缺点也各不相同,而这几个都同 CBC 一样,都需要密钥和向量。

           AES 有三种长度 128位、192位、256位,这三种的区别,主要来自于密钥的长度,16字节密钥=128位,24字节密钥=192位,32字节密钥=256位。如下表格:

长度

密钥长度

向量长度

128位

16

16

192位

24

16

256位

32

16

      2、DES

           加密默认与 AES 相同,也有五种模式,除了 ECB 只需要密钥,其他模式需要密钥和向量。与 AES 不同的是, DES 的密钥长度只有8字节,向量也是8字节。

      3、编码实现 

          (1)安装crypto-js模块

               npm install crypto-js

          (2)在js文件中引入crypto-js模块

const CryptoJS = require("crypto-js"); 
/**
 * 加密
 * @param {*} key :密钥
 * @param {*} text:明文
 */
function encrypt(key,text){
    return CryptoJS.AES.encrypt(text,key).toString();
}

/**
 * 解密
 * @param {*} key :密钥
 * @param {*} cipherText :密文
 */
function decrypt(key,cipherText){
  
    let bytes= CryptoJS.AES.decrypt(cipherText,key);
    return bytes.toString(CryptoJS.enc.Utf8)
}
let key = "abc"
let text = "猪二哥" 
let ciphertext = encrypt(key,text)
console.log("密文:"+ciphertext)
let originalText = decrypt(key,ciphertext)
console.log("明文:"+originalText)

三、非对称加密:有两把钥匙,公钥和私钥

       公钥是可以公开对外,私钥就是自个的,不可泄露。因为有两个密钥,非对称加密这个名字就是这么由来的。

        发送方用接收方公开对外的公钥进行加密,接收方收到数据后,用私钥进行解密,业务处理完后,用私钥给需要回传的数据加密,收到数据的一方在用公钥解密。这个过程就是非对称加解密,简单理解就是公钥加密的数据,用私钥解密;私钥加密的数据,用公钥解密。

        非对称加密与对称加密相比,安全性要高很多。对于对称加密,密钥钥匙被某一方不小心泄露了,那秘文就有可能被破解和篡改。而非对称加密,公钥随意流通,只要颁发密钥的一方好好把私钥保管好,安全性是妥妥的。

         网上有很多工具可以一键生成配对的公钥和私钥,淘宝、微信都有提供相关工具,或者使用 OpenSSL 生成也可以。

四、摘要算法(HASH)

        1、把任意长度的输入,根据算法生成一串固定长度的伪随机数,这一算法就是摘要算法,它有这么几个特点

  • 不需要密钥,加密出来的数据无法被解密,具有不可逆性。
  • 生成的摘要长度是固定的,与输入无关。
  • 相同的输入,使用相同的实现,生成的摘要一定相同;不同的输入,生成的摘要是大相径庭的,即不会发生碰撞。

      根据这些特点,摘要算法通常用于生成签名,用来验证数据的完整性。

      还有用户密码的存储,如今密码的存储主流的方式,就是使用摘要算法生成唯一的标识,为了保证安全性,通常在生成摘要后再加上一串随机数(加盐salt),再来hash一次。目前主流的实现有 MD5 和 SHA-2 , MD5 生成的摘要是 32 字节, sha256 生成的摘要是 64 字节。

        2、编码实现

            (1)安装crypto模块

                  npm install crypto

            (2)实现:

const crypto = require('crypto');
/**
 * md5加密
 * @param {*} text :明文
 */
function md5(text){
   const hash = crypto.createHash('md5')
   return hash.update(text).digest('hex')
}
/**
 * sha256加密
 * @param {*} data 
 */
function sha256(data){
    const hash = crypto.createHash('sha256');
    return hash.update(data).digest('hex');
   }
console.log(md5('abc')) 
console.log(sha256('abc'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上庸者-不服周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值