md5和hash加密(node.js)

md5

  • 1、安装crypto
    npm install crypto --save
    //crypto 模块提供了加密功能,
    //包括对 OpenSSL 的哈希、MD5、HMAC、加密、解密、签名、以及验证功能的一整套封装
    
  • 2、在页面中引入 crypto
    var crypto = require("crypto");
    
  • 3、加密
    var md5 = crypto.createHash('md5')
    let passwordMd5 = md5.update('password').digest('hex')
    
  • 请添加图片描述

hash加密

const crypto = require('crypto');

const hash = crypto.createHash('md5');
// 如果要计算SHA1,只需要把'md5'改成'sha1',就可以得到SHA1的结果1f32b9c9932c02227819a4151feed43e131aca40。
// 还可以使用更安全的sha256和sha512。
// 可任意多次调用update():
hash.update('Hello, world!');
hash.update('Hello, nodejs!');
// update()方法默认字符串编码为UTF-8,也可以传入Buffer。
console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544
// hash加密无法多次加密 md5可以 使用了digest后就不能再使用了

注: hash算法(md5也是hash算法一种)没办法解密 只能通过数据库的数据进行md5加密后与需要的数据比较来验证

hash加密后再加盐

加盐加密

let name = 'abcd'
let password = '123'
// Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,
// 如果该字符串无法识别,或者一些情况下,包含了不合法的日期数值(如:2015-02-31),则返回值为NaN。
var timestamp = Date.parse(new Date()) / 1000
var md5 = crypto.createHash('md5')
let passwordMd5 = md5.update('password').digest('hex')
let user_ticket = md5.update(passwordMd5 + timestamp).digest('hex')
console.log(user_ticket)  //加盐的结果

hash加密可以由一个字符串得到一串加密密钥,但是由一串加密密钥可以得到很多个对应的字符串,所以是无法解密的

Cookie加密函数(NODE.JS)

自用的各个加密函数

  • MD5加密
    var crypto = require('crypto');
    // node.js的md5加密模块
    // MD5加密函数
    function md5Encryption(req, res, Str, cookieName, maxAgeSeconds, isSigned) {
      var md5 = crypto.createHash('md5')
      // 对Str进行加密
      let strMd5 = md5.update(Str).digest('hex')
      // 发送cookie
      if(isSigned) {
        res.cookie(cookieName, strMd5, {maxAge: maxAgeSeconds, signed: true})
        // 第一次设置的话值为undefined 第二次才能获取到值
        // console.log('req.signedCookies.cookieName', req.signedCookies[cookieName]);
      } else {
        res.cookie(cookieName, strMd5, {maxAge: maxAgeSeconds})
        // console.log('req.cookies.cookieName', req.cookies[cookieName]);
      }
      // 返回加密的字符串
      return strMd5
    }
    
  • cookie加密函数
    function cookieEncryption(req, res, cookieName, cookieValue, maxAgeSeconds, isSigned) {
      if(isSigned) {
        res.cookie(cookieName, cookieValue, {maxAge: maxAgeSeconds, signed: true})
        return req.signedCookies[cookieName]
      } else {
        res.cookie(cookieName, cookieValue, {maxAge: maxAgeSeconds})
        return req.cookies[cookieName]
      }
    }
    
  • hash加盐函数
    // hash加盐函数
    function hashSalt(req, res, cookieName, str, maxAgeSeconds, isSigned) {
      var strSalt
      // 如果未设置Cookie
      // 创建hash对象
      var hash = crypto.createHash('sha512')
      // 密码
      let password = str
      // 当前时间的毫秒数
      // Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,
      // 如果该字符串无法识别,或者一些情况下,包含了不合法的日期数值(如:2015-02-31),则返回值为NaN。
      let data = Date.parse(new Date());
      // 对密码和时间戳hash加密
      strSalt = hash.update(password + data).digest('hex')
      // 发送包含加密字符串的Cookie
      if(isSigned) {
        res.cookie(cookieName, strSalt, {maxAge: maxAgeSeconds, signed:true})
        // Cookie解密后的Cookie字符串
        // console.log('req', req.signedCookies[cookieName]);
      } else {
        res.cookie(cookieName, strSalt, {maxAge: maxAgeSeconds})
        // console.log('req', req.cookies[cookieName]);
      }
      // 返回加密字符串
      return strSalt
    }
    
  • 整体代码
    var crypto = require('crypto');
    // node.js的md5加密模块
    // MD5加密函数
    function md5Encryption(req, res, Str, cookieName, maxAgeSeconds, isSigned) {
      var md5 = crypto.createHash('md5')
      // 对Str进行加密
      let strMd5 = md5.update(Str).digest('hex')
      // 发送cookie
      if(isSigned) {
        res.cookie(cookieName, strMd5, {maxAge: maxAgeSeconds, signed: true})
        // 第一次设置的话值为undefined 第二次才能获取到值
        // console.log('req.signedCookies.cookieName', req.signedCookies[cookieName]);
      } else {
        res.cookie(cookieName, strMd5, {maxAge: maxAgeSeconds})
        // console.log('req.cookies.cookieName', req.cookies[cookieName]);
      }
      // 返回加密的字符串
      return strMd5
    }
    // Cookie验证函数
    function CheckCookie(req, str, cookieName, isSigned) {
      if(isSigned == true) {
        if(req.signedCookies[cookieName] == undefined) {
          return undefined
        }
        if(str == req.signedCookies[cookieName]) {
          return true
        } else {
          return false
        }
      } else {
        if(req.cookies[cookieName] == undefined) {
          return undefined
        }
        if(str == req.cookies[cookieName]) {
          return true
        } else {
          return false
        }
      }
    }
    // cookie加密函数
    function cookieEncryption(req, res, cookieName, cookieValue, maxAgeSeconds, isSigned) {
      if(isSigned) {
        res.cookie(cookieName, cookieValue, {maxAge: maxAgeSeconds, signed: true})
        return req.signedCookies[cookieName]
      } else {
        res.cookie(cookieName, cookieValue, {maxAge: maxAgeSeconds})
        return req.cookies[cookieName]
      }
    }
    // hash加盐函数
    function hashSalt(req, res, cookieName, str, maxAgeSeconds, isSigned) {
      var strSalt
      // 如果未设置Cookie
      // 创建hash对象
      var hash = crypto.createHash('sha512')
      // 密码
      let password = str
      // 当前时间的毫秒数
      // Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,
      // 如果该字符串无法识别,或者一些情况下,包含了不合法的日期数值(如:2015-02-31),则返回值为NaN。
      let data = Date.parse(new Date());
      // 对密码和时间戳hash加密
      strSalt = hash.update(password + data).digest('hex')
      // 发送包含加密字符串的Cookie
      if(isSigned) {
        res.cookie(cookieName, strSalt, {maxAge: maxAgeSeconds, signed:true})
        // Cookie解密后的Cookie字符串
        // console.log('req', req.signedCookies[cookieName]);
      } else {
        res.cookie(cookieName, strSalt, {maxAge: maxAgeSeconds})
        // console.log('req', req.cookies[cookieName]);
      }
      // 返回加密字符串
      return strSalt
    }
    
    
    module.exports = {
      md5Encryption,
      CheckCookie,
      cookieEncryption,
      hashSalt
    };
    

实验案例代码(实验时写在了express框架中的user.js)

var express = require('express');
var router = express.Router();
// node.js的md5加密模块
var crypto = require('crypto');
const { serialize } = require('cheerio/lib/api/forms');

const encryptionFunc = require('./加密')
var count = 1
var str4 
router.get('/', function(req, res, next) {
  // md5加密
  // var str = encryptionFunc.md5Encryption(req, res,'123', 'user', '600000', true)
  // console.log(encryptionFunc.CheckCookie(req, str, 'user', true));
  // console.log("str", str);

  // cookie加密
  // var str2 = encryptionFunc.cookieEncryption(req, res, 'cookieName', 'cookieValue', 60000, true)
  // console.log("str2", str2);
  // console.log(encryptionFunc.CheckCookie(req, str2, 'cookieName', true));

  // hash加盐加密
  // count确保只执行一次
  if(count == 1) {
    str4 = encryptionFunc.hashSalt(req, res, 'cookie1', 'value1', 60000, true)
  }
  console.log('str4', str4);
  console.log('req.signedCookies.cookie1', req.signedCookies.cookie1);
  console.log(encryptionFunc.CheckCookie(req, str4, 'cookie1', true));
  count++

  res.send('respond with a resource');
});

module.exports = router;

app.js中代码配置

app.use(cookieParser('hw'));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值