资讯专栏INFORMATION COLUMN

node中的密码安全

Wildcard / 764人阅读

摘要:后端解密后端核心代码注意要放在处理路由前不加会报错解密注意这里的常量值要设置为加密输入到数据库中的密码是存入数据库中这里,我是用自带模块进行解密,当然,你也可以用的方法进行解密。

本文将讲解对于前后端分离的项目,前端注册或登录时如何保证用户密码安全传输到server端,最终存入数据库
为什么需要加密

加密真的有必要吗?
我们先来看一看前端发起的ajax请求中,如果不对密码进行加密,会发生什么。
f12打开chrome开发者工具,找到请求,查看请求参数如下:

如果你的协议是http,那么前端传给后端的密码差不多是裸奔状态,因为http传输的是明文,很可能在传输过程中被窃听,伪装或篡改。
那么,弄个https不就好了吗?
https的确能够极大增加网站的安全性,但是用https得先买证书(也有免费的),对于个人站点或者不想弄证书的情况下,那最起码也得对用户密码进行一下加密吧。

流程图

先看一下大体流程图,首先,我们用工具生成公钥和私钥,将其放入server端,前端发起请求获取公钥,拿到公钥后对密码进行加密,然后将加密后的密码发送到server端,server端将用密钥解密,最后再用sha1加密密码,存入数据库。

生成RSA公钥和密钥

既然选择RSA加密,那么首先得有工具啊,常见的有openssl,但这里不介绍,感兴趣的请自行查阅,对于node而言,我介绍一个不错的库Node-RSA,我们将用它来生成RSA公钥和密钥。

RSA是一种非对称加密算法,即由一个密钥和一个公钥构成的密钥对,通过密钥加密,公钥解密,或者通过公钥加密,密钥解密。其中,公钥可以公开,密钥必须保密

用Node-RSA生成的公钥和密钥代码如下:

const NodeRSA = require("node-rsa")
const fs = require("fs")

// Generate new 512bit-length key
var key = new NodeRSA({b: 512})
key.setOptions({encryptionScheme: "pkcs1"})

var privatePem = key.exportKey("pkcs1-private-pem")
var publicDer = key.exportKey("pkcs8-public-der")
var publicDerStr = publicDer.toString("base64")

// 保存返回到前端的公钥
fs.writeFile("./pem/public.pem", publicDerStr, (err) => {
  if (err) throw err
  console.log("公钥已保存!")
})
// 保存私钥
fs.writeFile("./pem/private.pem", privatePem, (err) => {
  if (err) throw err
  console.log("私钥已保存!")
})

执行完成后,我们将在根目录下得到公钥和私钥文件:

注意:server端的公钥和密钥应该隔一段时间换一次,比如每次服务器重启时。

前端加密

核心代码如下:

  
  
  

前端将用到jsencrypt对其进行加密,详细用法请参考github。

后端解密

后端核心代码:

const express = require("express");
const crypto = require("crypto");
const fs = require("fs");

var privatePem = fs.readFileSync("./pem/private.pem");

var app = express();
app.use(express.json());

// CORS 注意:要放在处理路由前
function crossDomain(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Content-Type");

  next();
}
app.use(crossDomain)

app.use(function (req, res, next) {
  // 不加会报错
  if (req.method === "OPTIONS") {
    res.end("ok")
    return
  }

  switch (req.url) {
    case "/getPublicKey":
      let publicPem = fs.readFileSync("./pem/public.pem", "utf-8")
      res.json(publicPem)
      break
    case "/reg":
      // 解密
      var privateKey = fs.readFileSync("./pem/private.pem", "utf8")
      var password = req.body.password
      var buffer2 = Buffer.from(password, "base64")
      var decrypted = crypto.privateDecrypt(
        {
          key: privateKey,
          padding: crypto.constants.RSA_PKCS1_PADDING // 注意这里的常量值要设置为RSA_PKCS1_PADDING
        },
        buffer2
      )
      console.log(decrypted.toString("utf8"))

      // sha1加密
      var sha1 = crypto.createHash("sha1");
      var password = sha1.update(decrypted).digest("hex");
      console.log("输入到数据库中的密码是: ", password)
      // 存入数据库中
      // store to db...
      res.end("reg ok")
      break
  }
})

app.listen(3000, "127.0.0.1")

这里,我是用node自带模块crpto进行解密,当然,你也可以用Node-RSA的方法进行解密。

最后

我们再来看一看前端请求的密码信息:

这样一串字符,即便被他人获取,如果没有密钥,在一定程度上,他是无法知道你的密码的。

当然,关于网络安全是一个大话题,本篇只是对其中的一小部分进行介绍,欢迎留言讨论,希望对您有帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97803.html

相关文章

  • 项目部署上线

    摘要:购买云服务购买云服务器操作系统位阿里云或腾讯云购买打开部署登录输入是公用的地址部署命令下载安装包。配置匿名用户上传文件权限运行。将匿名上传权限修改为。 购买云服务 购买云服务器(操作系统: CentOS 7.4 64位)阿里云或腾讯云购买 打开Xshell部署 登录输入 ssh root@server(server是公用的Ip地址)部署node wget命令下载Node.js安装包...

    RobinTang 评论0 收藏0
  • Elasticsearch 参考指南(配置监控)

    摘要:设置保存期限,超过此期限,监控导出器创建的索引将被自动删除,默认为天。本地导出器设置导出器是监控使用的默认导出器,顾名思义,它将数据导出到本地集群,这意味着不需要进行太多配置。本地导出器的值必须始终是,这是必须的。 配置监控 默认情况下,X-Pack监控被启用,但是数据收集被禁用,高级监控设置使你能够控制收集数据的频率、配置超时以及为本地存储的监控索引设置保留期,你还可以调整监控数据的...

    陈江龙 评论0 收藏0
  • 2021爱智先行者—(2)零基础APP开发实例

    摘要:有鉴于此,本文以未安装工具软件的计算机未激活的爱智设备为例,实战解说零基础小白的爱智开发过程。爱智设备断开互联网也可以运行,但本文中的开发部署等功能无法操作。 【本...

    paney129 评论0 收藏0
  • MySQL数据库高可用集群搭建-PXC集群部署

    摘要:下文简称集群提供了高可用的一种实现方法。,同步需要,在整个同步数据过程中不需要。中定义的集群内部全局事务,用于记录集群中发生状态改变的唯一标识以及队列中的偏移量。节点的数据库的登陆和节点的用户名密码一致,自动同步。 Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上...

    zhaochunqi 评论0 收藏0
  • Bytom国密网说明和指南

    摘要:在比原链主网中,在获取交易和区块头等摘要的过程中使用的哈希算法是算法,而在国密测试网中,使用算法替代。启动的是国密测试网。可以说,比原链的项目进展伴随着国密测试网的发布更上一层楼。 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 国密算法是指国家密码管理局制...

    王岩威 评论0 收藏0

发表评论

0条评论

Wildcard

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<