nodejs的加密方式

一、加密算法

为了保证数据的安全性和防篡改,很多数据在传输中都进行了加密

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

二、对称加密

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

主流有AES、DES,AES 是新一代的标准,速度快,安全级别更高。

1.AES:

共有五种加密方式:ECB、CBC、CTR、OCF、CFB

区别:ECB的只用一个密钥即可,比较简单,利于计算,其他的除了一个密钥之外还需要一个向量,其作用是数据的加密,安全性优于ECB

长度

密钥长度

向量长度

128位(16字节)

16

16

192位(24字节)

24

16

256位(32字节)

32

16

2.DES:

加密默认与AES相同,但其密钥的长度只有8字节,向量长度也是8字节

3.编码实现:

  1. 安装crypto-js模块
    npm install crypto-js
  2. 在js文件中引入
var express = require('express');
var router = express.Router();
var pool = require('../config/tets')
var CryptoJS = require('crypto-js')
/* 加密
 key  :密钥
 text :明文
*/
function encrypt(key,text) {
    return CryptoJS.AES.encrypt(text,key).toString()
}
/* 解密
 key  :密钥
 cipherText :密文
*/
function decrypt(key,cipherText){
    let bytes = CryptoJS.AES.decrypt(cipherText,key)
    return bytes.toString(CryptoJS.enc.Utf8)
}

// http://localhost:8857/wechat/login
router.post('/login',function(req,res,next){
    pool.getConnection(function(err,conn){
        if(err){
            console.log('连接失败')
        } else{
            let user = req.body.username
            let pass = req.body.password
            
            let ciphertext = encrypt(user,pass)
            let originaltext = decrypt(user,ciphertext)
            let data = [user,originaltext]
            console.log(ciphertext)
            console.log(originaltext)
            console.log(data)
            let sql = 'select * from admin where username = ? and password =?'
            conn.query(sql,data,function(error,results){
                if(error){
                  console.log('查询失败')
                  return
                } 
                res.send(results)   
            })
            conn.release()
        }
    })
  })
module.exports = router;

node 使用aes nodejs aes_nodejs

三、非对称加密

有两把钥匙,公钥和私钥。

公钥:对外公开,发送方用接收方对外公开的钥匙进行加密

私钥:不公开的,接收方在收到数据后,用私钥解密

安全性优于对称加密,在对称加密中当一方的密钥被泄露后,密文就存在被破解和篡改的可能,但在非对称加密中,公钥本身就对外开放,只需保护私钥即可。

四、摘要算法

将任意长度的输入根据算法生成一串固定长度的伪随机数。

1.特点

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

2.编码实现

  1. 安装crypto模块
    npm install crypto
  2. 实现
var crypto = require("crypto")
/* 
加密
text :明文
*/
function md5(text){
  var hash = crypto.createHash('md5')
  return hash.update(text).digest('hex')
}
/**
 * data
 */
function sha256(data){
  var hash = crypto.createHash('sha256');
  return hash.update(data).digest('hex');
}
console.log(md5('123'))
console.log(sha256('123'))

node 使用aes nodejs aes_ci_02