如何在NodeJs中使用Bcrypt来保护用户密码

这篇具有很好参考价值的文章主要介绍了如何在NodeJs中使用Bcrypt来保护用户密码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        不管你给你的程序进行了多少加密,黑客都可能有一万种办法黑进你的数据库。一个成熟的软件必须要有额外的加密系统。这样,即使数据库真的被攻破,我们也可以更好地保护我们的用户信息。这就是Bcrypt的作用,加盐salt和散列hash

注意:本文仅仅讲解Bcrypt的作用及用法,因此会尽量少的设计额外的概念。在真正写码时所需要的数据库的操作以及路由的操作会尽量忽略

目录

为什么要给密码加密

在NodeJs中使用Bcrypt加密

在用户登录的时候使用Bcrypt校验身份


为什么要给密码加密?

        散列(hash)的意思是给一段普通文字使用算法加密,使他变成一个固定长度的字符串。不管这段文字有多长,经过算法处理后的最终的结果都将是相同长度。并且每次的结果都将完全相同。

        举个例子,不过你是把111还是把'alongword'或者是其他的一些文本传进去,结果都会是一样的长度。并且相同的字符会一定会产出相同的结果。这显然不是一个安全的做法。所以仅仅散列是不够的。

给密码加盐

        盐 (salt)是一个随机的字符串。如果你在hash的时候加入盐作为干扰的话,那么结果就不会再保持相同了。盐会被自动加到hash里面,所以你不需要刻意把他保存到数据库里面。

        Bcrypt早在1996年就存在,并且经过多年的大量网站的使用和验证,鲜有报道出来的问题。可以说他的这一套算法是很安全的。接下来,我们将使用node的中间件来让Bcrypt为我们的用户密码加盐并散列。


在NodeJs中使用Bcrypt加密

        首先,如果你不是很熟悉node,我们要先初始化一个node程序:

mkdir jwt-project 创建文件夹

cd jwt-project 进入文件夹

npm init -y 初始化node程序

        接下来,我们需要安装一些依赖:

npm install bcrypt

        安装完所需要的依赖后,我们就可以在node模块中引入并使用Bcrypt了

const bcrypt = require('bcrypt');

        接下来,我们需要一个变量:saltRounds。saltRounds 代表加密所需的时间,saltRounds越大,加密所需时间越长,加密后的密码也就越安全。但是我们也不想让用户永远等着我们加密密码,所以一般使用默认值10就可以。

const saltRounds = 10;

        为了方便,我们就不使用真实用户的密码了。我们自己写一个固定值就好

var password = "iamapassword";

        接下来,我们要利用Bcrypt的genSalt和hash方式来生成并且存储我们最终生成的hash。首先,我们先使用bcrypt.genSalt会接收saltRounds回调函数,这个回调函数会返回salt结果和error对象:

bcrypt.genSalt(saltRounds, function(err, salt) {
  // 返回salt值或者进行错误处理
});

         在得到salt值后,我们在回调的内部再调用Bcrypt的hash方式来生成hash。hash接受三个参数,分别是密码salt,和回调函数通常,我们会在这个回调函数里将处理好的hash存储到数据库中或者进行错误处理。

bcrypt.genSalt(saltRounds, function(err, salt) {

  bcrypt.hash(password, salt, function(err, hash) {

  // 返回hash的值,并将他存储到数据库中

  });

});

但其实,你也可以把以上两个函数合并成一个,结果如下

bcrypt.hash(password, saltRounds, function(err, hash) {
  // 数据库操作和错误处理
});

在用户登录的时候使用Bcrypt校验身份

        如果你知道如何查看数据库的话,你会发现这时候新注册的用户密码已经变成了一段长长的hash。这时候,再当用户登录的时候,我们就不能简单的对比用户输入的密码和数据库的hash了。Bcrypt为我们提供了一个方法,叫做compare。bcrypt.compare()会接受三个参数,分别是用户输入的密码数据库中的hash,和回调函数回调函数会返回一个布尔值,如果密码和hash吻合的话,就返回true,反之false。

         仍然为了方便起见,我们手写一个字符串充当密码,来让bcrypt帮我们验证密码是否正确

var password2 = "iamapassword";
bcrypt.compare(password2, hash, function(err, result) {
  if (result) {
    console.log("密码正确")
  }
  else {
    console.log("密码错误");
  }
});

总结:

        Bcrypt的存在为我们的程序多加了一层保障,它利用加盐和散列的算法将我们的密码加密成一段很难破解的长字符串,这样,即使我们的数据库被攻破,hash后的密码也可以给我们提供最后一层保护文章来源地址https://www.toymoban.com/news/detail-492508.html

到了这里,关于如何在NodeJs中使用Bcrypt来保护用户密码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 密码学的社会网络:如何保护社交网络的安全

    社交网络已经成为了现代人们生活中不可或缺的一部分,它们为我们提供了一种与家人、朋友和同事保持联系的方式。然而,这种联系也带来了一些挑战,因为社交网络上的数据经常被盗、篡改或泄露。因此,保护社交网络的安全至关重要。 在这篇文章中,我们将探讨密码学

    2024年02月20日
    浏览(60)
  • 如何保护 LDAP 目录服务中的用户安全?

    轻量级目录访问协议(LDAP)是目前主流的身份验证协议之一,由密歇根大学的 Tim Howes、Steve Kille 和 Wengyik Yeong 于1993年创建,又经过了 Internet 工程任务组(IETF)的标准化,通过网络分发目录信息,扮演了身份源(IdP)的角色。 LDAP 在现代网络中的重要性在于该协议参与共享

    2024年01月17日
    浏览(58)
  • 企业如何合规保护用户数据 - 网络安全法实施

    随着信息技术的快速发展,企业对用户数据的收集和处理变得越来越普遍。然而,随之而来的是对用户隐私和数据安全的担忧也日益增加。为了保护用户的权益和数据安全,网络安全法实施对企业在处理用户数据时提出了一系列要求。本文将介绍企业如何合规保护用户数据,

    2024年02月11日
    浏览(44)
  • 区块链与智能合约的数据安全:如何保护用户信息

    区块链技术是一种分布式、去中心化的数据存储和交易方式,它的核心概念是将数据存储在一个由多个节点组成的链表中,每个节点称为区块,每个区块包含一定数量的交易数据。智能合约则是一种自动化的协议,它可以在区块链上自动执行一些预定的操作。这两种技术结合

    2024年04月09日
    浏览(41)
  • 机器遗忘同等重要,AI如何忘记不良数据,保护用户隐私?

    在人工智能领域,大语言模型(LLMs)因其在文本生成、摘要、问答等任务中展现出的卓越能力而备受关注。然而,这些模型在训练过程中可能会记住大量数据,包括敏感或不当的信息,从而引发伦理和安全问题。为了解决这些问题, 机器遗忘(Machine Unlearning,MU)技术 应运

    2024年03月22日
    浏览(39)
  • nginx代理后,nodejs如何获取用户真实ip地址(包括websocket获取用户真实IP地址)

    因为nginx代理的原因,我们在请求头中获取到的用户ip只是nginx代理的ip,并非用户真实ip,原因是经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,可以通过$remote_addr变量拿到的将是反向代理服务器的ip地址。 第一步,修改

    2024年02月13日
    浏览(67)
  • 小程序安全性加固:如何保护用户数据和防止恶意攻击

    第一章:引言   在当今数字化时代,移动应用程序的使用已经成为人们日常生活中的重要组成部分。小程序作为一种轻量级的应用程序形式,受到了广泛的欢迎。然而,随着小程序的流行,安全性问题也日益凸显。用户数据泄露和恶意攻击威胁着用户的隐私和安全。本文将重

    2024年02月12日
    浏览(53)
  • Java安全和防护:如何保护Java应用程序和用户数据的安全

      在当今数字化时代,Java已经成为主流的编程语言之一。无论是企业级应用程序还是个人项目,Java应用程序都承载着大量的敏感数据和业务逻辑。然而,随着网络攻击日益猖獗,保护Java应用程序和用户数据的安全变得尤为重要。本文将深入探讨Java应用程序安全的重要性,并

    2024年02月03日
    浏览(69)
  • Python安全和防护:如何保护Python应用程序和用户数据的安全

      在当今数字化时代,数据安全是一个极其重要的话题。随着Python的广泛应用和越来越多的人使用Python构建应用程序,保护Python应用程序和用户数据的安全变得尤为重要。本文将介绍一些关键的Python安全问题,并提供一些保护Python应用程序和用户数据的实用技巧。 在保护Py

    2024年02月16日
    浏览(67)
  • 6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码

    在配置文件中添加如下参数cat config/elasticsearch.yml: 关闭es服务如果服务启动(kill进程id) 启动es服务 待服务启动完成,且能正常访问后,执行 集群此时是启动状态 elasticsearch-head查看 通过浏览器查看 http://192.168.180.45:9200/_cat/nodes?v 进入主节点的bin目录下执行 再次在bin目录输

    2024年04月26日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包