浅谈crypto、rsa、3des的使用

前言

在针对密码加密,有各种各样的加密手段,下面谈谈用过的密码加密方式。

crypto

crypto:模块的目的是为了提供通用的加密和哈希算法。它是nodejs的内置模块。

签名
  const fs = require('fs')
  const crypto = require('crypto')
  const config = require('./config')

  export const crySign = data => {
  	// rsa_dir 密钥地址
    let key = fs.readFileSync(config.rsa_dir).toString()
    let arr = []
    for (let k in data) {
      arr.push(k)
    }
    arr = arr.sort()
    let str = ''
    for (let i = 0, l = arr.length; i < l; i++) {
      if (data[arr[i]] || parseInt(data[arr[i]]) === 0) {
        str += arr[i] + '=' + data[arr[i]] + '&'
      }
    }
    str = str.substring(0, str.length - 1)
    let sign = crypto.createSign('sha1')
    sign.update(str)
    return sign.sign(key, 'base64')
  }

MD5加密
const crypto = require('crypto')
export const cryMD5 = data => {
  let md5 = crypto.createHash('md5')
  return md5.update(data).digest('hex')
}

RSA

RSA加密算法是一种非对称加密算法。RSA算法有一定的计算量,加上Node不适合做计算密集型的操作。当接口被频繁调用可能会占用主线程,阻塞其他接口,使用了RSA的接口并发量会下降十倍左右。

过程

双方都维护一套公私钥, 发送方(a,b)-> 接收方 (c,d)
a. 自己的私钥签名
b. 对方的公钥加密
c. 私钥解密
d. 公钥验证签名,参数是否被篡改 && 调用方是否是期望的

使用node-rsa
const fs = require('fs')
const NodeRSA = require('node-rsa')
const config = require('./config')

export const rsa = data => {
	// rsa_public_dir 密钥地址
	let publicKeyStr = fs.readFileSync(config.rsa_public_dir).toString()
	const key = new NodeRSA(publicKeyStr)
	// 设置padding方式,node-rsa默认是pkcs1_oaep
	key.setOptions({
      encryptionScheme: 'pkcs1'
    })
	return key.encrypt(data, 'base64')
}
使用jsencrypt
const fs = require('fs')
const JsEncrypt = require('jsencrypt')
const config = require('./config')

export const rsaEncrypt = data => {
  let publicKeyStr = fs.readFileSync(config.rsa_public_dir).toString()
  const jse = new JsEncrypt()
  jse.setPublicKey(publicKeyStr)
  return jse.encrypt(data)
}

3des

应用场景:登录密码加密

const CryptoJS = require('crypto-js')

const key = 'my key'
const iv = '123456'

// CBC模式加密
export const desEncrypt = (message) => {
  const keyHex = CryptoJS.enc.Base64.parse(key) // 加密秘钥,将Base64编码字符串解码为原始二进制byte
  const encrypted = CryptoJS.TripleDES.encrypt(message, keyHex, {    
    iv: CryptoJS.enc.Utf8.parse(iv), // 矢量,得到偏移量的二进制byte字节
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })
  return encrypted.toString() // 得到base64编码字符串密文 
}

// CBC模式解密
export const desDecrypt = (ecryptStr) => {
  const enckey = CryptoJS.enc.Base64.parse(key)
  const decrypted = CryptoJS.TripleDES.decrypt({
    ciphertext: CryptoJS.enc.Base64.parse(ecryptStr)
    }, enckey, {
      iv: CryptoJS.enc.Utf8.parse(iv),
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
  })
  return decrypted.toString(CryptoJS.enc.Utf8) // 转为UTF-8的原始数据
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值