node.js密码加密实践

crypto

crypto 模块提供了加密的功能,包括对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装


const crypto = require('crypto');   // 使用require('crypto')来访问该模块
const secret = 'abcdefg';
const hash = crypto.createHamc('sha256', secret).update('I love cupcakes').digest('hex');
console.log(hash);

想要了解更多关于crypto模块的知识可以去看相关的知识,这里就不多说了
链接:http://nodejs.cn/api/crypto.html

实践

1. 关键代码

注册登录要以相同的方式进行处理,这样子的密码才会一致

const crypto = require('crypto');   // 引入加密模块

let userPwd = req.body.userPwd,
    md5 = crypto.createHash("md5");     // md5加密
let newPwd = md5.update(userPwd).digest("hex");

2. 前置

引入模块、参数定义、数据库连接

require('./../util/util');
let express = require('express');
let router = express.Router();
let mongoose = require('mongoose');
let Users = require('../models/users');

const crypto = require('crypto');   // 引入加密模块

const SUCCESS = 2000;       // 请求成功
const NO_LOGIN = 4003;      // 未登录
const NO_POWER = 4001;      // 没有权限
const ERROR = 5000;         // 请求失败
const EXCEPTION = 4005;     // 异常
const WARN = 2001;          // 警告

mongoose.connect('mongodb://127.0.0.1:27017/teacher', {useNewUrlParser: true});

mongoose.connection.on('connected', function () {
    console.log('MongoDB connected success.');
});

mongoose.connection.on('error', function () {
    console.log('MongoDB connected fail.');
});

mongoose.connection.on('disconnected', function () {
    console.log('MongoDB connected disconnected.')
});

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

3. 注册

// 注册
router.post('/register', function (req, res, next) {
    let phone = req.body.phone,
        userPwd = req.body.userPwd,
        md5 = crypto.createHash("md5");
    let newPwd = md5.update(userPwd).digest("hex");
    let param = {
        createDate: '',
        phone: phone,
        userPwd: newPwd
    }
    // 检验手机号码是否被注册过
    Users.findOne({phone: param.phone}, function (err, doc) {
        if (err) {
            res.json({
                code: ERROR,
                msg: err.message,
                result: ''

            })
        } else {
            if (doc) {  // 手机号码被注册过
                res.json({
                    code: WARN,
                    msg: '该手机号码已被注册过',
                    result: ''
                })
            } else {    // 手机号码没有被注册过
                let createDate = new Date().Format('yyyy-MM-dd hh:mm:ss');
                param.createDate = createDate;
                Users.insertMany([param], function(err2, doc2) {
                    if (err2) {
                        res.json({
                            code: ERROR,
                            msg: err.message,
                            result: ''
                        })
                    } else {
                        res.json({
                            code: SUCCESS,
                            msg: '注册成功',
                            result: doc2
                        })
                    }
                })
            }
        }
    })
});

4. 登录


// 登录
router.post('/login', function (req, res, next) {
    let phone = req.body.phone,
        userPwd = req.body.userPwd;
    let md5 = crypto.createHash("md5");
    let pwd = md5.update(userPwd).digest("hex");
    let param = {
        phone: phone,
        userPwd: pwd
    }
    Users.findOne(param, function(err, doc) {
        if (err) {
            res.json({
                code: ERROR,
                msg: err.message,
                result: ''
            })
        } else {
            if (doc) {
                    // 存储cookie
                res.cookie('userId', doc._id, {
                    path: '/',
                    maxAge: 1000 * 60 * 60
                });
                res.json ({
                    code: SUCCESS,
                    msg: '登录成功',
                    result: {
                        phone: doc.phone,
                        userId: doc._id
                    }
                })
            } else {
                res.json ({
                    code: WARN,
                    msg: '账号或密码错误',
                    result: ''
                })
            }
        }
    })
});

原文地址:https://www.cnblogs.com/let423/p/10541593.html

时间: 2024-09-29 19:23:56

node.js密码加密实践的相关文章

java结合node.js非对称加密,实现密文登录传参——让前后端分离的项目更安全

前言   在参考互联网大厂的登录.订单.提现这类对安全性操作要求较高的场景操作时发现,传输的都是密文.而为了目前项目安全,我自己负责的项目也需要这方面的技术.由于,我当前的项目是使用了前后端分离技术,即node.js做前端,spring boot做后端.于是,我开始搜索有关node.js与java实现非对称加密的资料,然而,我却没有得到一个满意的答案.因此,我有了写本篇博客的想法,并希望给用到这类技术的朋友提供帮助. 一.明文密码传输对比 首先. 构建spring boot 2.0项目 引入we

Cookie和Session在Node.JS中的实践(二)

Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是session篇,重点在讨论seesion的特性.概念,以及session和cookie的区别和联系. 之前有人问我,这个问题有必要长篇大论的探讨吗?其实只要我觉得这个技术点重要而且具有迷惑性,就值得去写.去探讨,否则你很难完全明白.写这种文章有两个好处: 首先,于作者而言,写出来文章让大家一起理解某

[Node.js] 对称加密、公钥加密和RSA

原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可以勉强对付过去,一旦需要频繁应用诸如 AES/RSA等算法,这种状态就颇令人捉急了. 是时候了解一下原理了,所以找来了这本图解密码技术 给自己补补课: 在该书深入浅出的指引下 ,补充了一些常识,在此进行一番梳理: 对称加密算法(共享密钥) 顾名思义,对称加密就是用相同的密钥进行加密和解密.说到对称加

JS 密码加密

首先需要注意的一点是,密码的加密应该是在页面完成的,因为传输的过程中,密码明文有可能会泄露出去. 然后要说明的就是,虽然在页面加密密码,加密算法暴露了,但是有些加密算法,比如MD5,即使知道加密算法,知道密文也很难得出明文是什么. MD5是使用散列函数进行密码加密的,加密是单向的,如果不是两段相同的明文,结果很难一致. 网上有MD5的解密工具,但是那种工具一般都是查字典出来的,也就是说那种工具会在后台进行查找,如果它的数据库里没有明文,它是解密不了密文的. Crypto下载地址:https://

Node.js 中流操作实践

本文节选自 Node.js CheatSheet | Node.js 语法基础.框架使用与实践技巧,也可以阅读 JavaScript CheatSheet 或者 现代 Web 开发基础与工程实践 了解更多 JavaScript/Node.js 的实际应用. Stream 是 Node.js 中的基础概念,类似于 EventEmitter,专注于 IO 管道中事件驱动的数据处理方式:类比于数组或者映射,Stream 也是数据的集合,只不过其代表了不一定正在内存中的数据..Node.js 的 Str

[整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题

花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是需到写问题,特整理在此. <1>.由于node.msi安装包已经自动添加了系统环境变量,所以可以在任意地方路径下运行node xxx.js.<2>.确定2个环境变量是否已添加(1)一个是PATH上增加node.exe的目录C:\Program Files\nodejs,(已自动添加)(2)一个是增加环境变量NODE_PATH,值为C:\Program Files\node

js密码加密

1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML><html><head><meta charset="utf-8"><title>base64加密</title><script type="text/javascript" src="base64.js"></script><script ty

从.NET到Node.js谈前后端分离实践(by vczero)

一.最初的[无分离]实践 11年末的时候,用winForm开发程序,拖拖控件,点点按钮,连接数据库,做一些基本的管理系统:Java的JSP还能包揽一切,服务器端拼接模板,顶多使用servlet做一些业务逻辑,做到后端的MVC.那时候,带了一个学校的创新团队,做一些项目,但是基本上是一个人前端后一起搞,现在想想,真是[杂乱无章],后端MVC还好,倒是前端,基本上只能做一些简单效果,施展的空间不大,幸好,也基本能完成项目. 我称之为[无分离]实践,如果是像一个人搞,开发速度倒是挺快的. 前后端无分离

node.js基本工作原理及流程

概述 Node.js是什么 Node 是一个服务器端 JavaScript 解释器,用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用. Node.js 是一个可以让 JavaScript 运行在浏览器之外的平台.它实现了诸如文件系统.模块.包.操作系统 API.网络通信等 Core JavaScript 没有或者不完善的功能.历史上将 JavaScript移植到浏览器外的计划不止一个,