node.js学习笔记之密码存储的加密-bcryptjs

node.js学习笔记之密码存储的加密-bcryptjsMD5属于通用型的哈希算法,设计出来的目的是在短时间内尽可能的计算大量的数据,这意味着它们在确保数据完整性方面使用较为出色;以及当你不想使用原本的数据进行比较的时候,这些算法得到的数据进行比较会比较好。但是在密码存储方面则不够安全。 一台现代计算机每秒可以计算330MB MD5…

bcrypt

为什么不使用MD5加密?

MD5属于通用型的哈希算法,设计出来的目的是在短时间内尽可能的计算大量的数据,这意味着它们在确保数据完整性方面使用较为出色;以及当你不想使用原本的数据进行比较的时候,这些算法得到的数据进行比较会比较好。但是在密码存储方面则不够安全。

一台现代计算机每秒可以计算330MB MD5散列。如果用户使用的密码都是小写字母并且只有6个字符的长度,你可以在大约40秒内尝试每个可能的密码。因此,使用以上的方式在数据当中存储密码并不安全,激活成功教程的难度也不高。而在bcrypt5个数量积的情况下需要12年的时间。

为什么使用bcrypt?

首先,bcrypt很慢。它使用了一种变体Blowfish加密算法的键控表,并引入了一个工作因子,它允许您确定哈希函数的开销有多大。正因为如此,bcrypt可以跟上摩尔定律。当计算机变得更快时,您可以增加工作因子,而散列将变得更慢。

bcrypt比MD5慢多少?取决于工作因子。使用工作因子为12的bcrypt,在我的笔记本电脑上大约0.3秒内就可以将密码yaaa散列。另一方面,MD5只需要不到一微秒的时间。

同时,bcrypt是单向Hash加密算法,不可反向激活成功教程生成密码明文。

在node.js中如何使用bcrypt

安装

npm i bcryptjs

使用

//引入bcrypt包
const bcrypt = require('bcryptjs');
const {promisify} = require('util');
//分析时间消耗
const {performance} = require('perf_hooks');

//同步版本
function bcryptHashSync(myPlaintextPassword,cost){
    let salt = bcrypt.genSaltSync(cost);
    let hash = bcrypt.hashSync(myPlaintextPassword, salt);
    return hash;
}
//每一次生成的hash都会不一样
let password = bcryptHashSync('yaaa',10);
console.log(password);//$2a$10$8j0o8ixPI967DEd3KwfeN.qBKQ6KHAzgTEJR0/yMcTP/ZthBpf3GK
//同步的形式验证密码
console.log(bcrypt.compareSync('yaaa',password));//true
//异步函数版本
async function bcryptHash(myPlaintextPassword,cost){
    const start = performance.now();
    //将有回调函数的API转换成promise形式再转成同步API的形式,将返回值赋值给前面的变量
    const salt = await promisify(bcrypt.genSalt)(cost);
    const mid = performance.now();
    const hash = await promisify(bcrypt.hash)(myPlaintextPassword,salt);
    const end = performance.now();
    console.log(hash);
}
//通常使用的工作因子cost是10
bcryptHash('Lzzhchc/*c.ds',10);
//Lzzhchc/!*c.ds 10
// $2a$10$YNDBR9HIIGM7W35lL3m0d.SyC7PUEoiEHOTTwP.3p6XamtMlJ56/S 76.01820003986359 175.74580001831055 249.9683000445366
const hash =  '$2a$10$YNDBR9HIIGM7W35lL3m0d.SyC7PUEoiEHOTTwP.3p6XamtMlJ56/S';
//验证,在拿之前生成的hash进行验证也可以得到正确结果
bcrypt.compare('Lzzhchc/!*c.ds',hash,(err,result) => {
   console.log(result);
});

通常bcrypt得到的hash的格式介绍

加密过程的介绍

  • cost代表hash杂凑的次数,数值越大,生成的salt-随机字符串复杂度越高,生成哈希的时间越长,被激活成功教程的难度也越高。
  • 单向加密,通过多次salt和cost的处理,使得被暴力激活成功教程的难度大大提升
  • 加密得到的字符串的格式介绍
node.js学习笔记之密码存储的加密-bcryptjs

如何比对明文和通过加密得到的hash是否对应着同一个密码

bcrypt.compareSync(passward,hash);
  • 拿到hash值中的salt-随机字符串值
  • 对明文密码-password进行加密。并且将从hash值中拿到的salt值添加到最后加密过程中使用的salt值
  • 将现在加密过后得到的hash值和原本传入的hash值进行对比,相等返回true,否则返回false

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13799.html

(0)

相关推荐

  • Redis 的持久化机制是什么?各自的优缺点?_redis持久机制

    Redis 的持久化机制是什么?各自的优缺点?_redis持久机制redis 持久化机制有两种:RDB 和 AOF。 RDB RDB 机制是对 redis 中的数据执行周期性的持久化。每个几分钟、几小时、几天生成 redis 内存中的数据的一份完整的快照。 AOF…

    2023-04-04
    152
  • Python字典遍历

    Python字典遍历Python是一种解释型、面向对象、动态数据类型的高级编程语言,与其他编程语言相比,Python的优势在于语法简洁、易读易写。Python内建了字典(Dictionary)数据类型,字典是一种可变的键值对集合,每个键与其相应值之间是一一对应的关系。

    2024-04-14
    85
  • 如何退出vi编辑模式

    如何退出vi编辑模式Vi是一种广泛使用的文本编辑器,在编写代码、修改配置文件和处理文本时非常有用。它的强大之处在于可以大大加快编辑速度,但是对于初学者来说,可能会发现退出Vi模式比较困难。

    2024-06-09
    58
  • GaussDB架构(上)「终于解决」

    GaussDB架构(上)「终于解决」GaussDB是华为公司数据库产品品牌名。华为公司从开始自研数据库至今已经有近20年历史,其中经历了早期发展、GaussDB的诞生和发展、数据库产业化三个阶段。本文简明介绍华为公司自研数据库的历程,…

    2023-04-13
    152
  • Python 变量作用域详解

    Python 变量作用域详解Python 是一门强大而灵活的编程语言,其中 Python 变量作用域是每个程序员都应该了解的一个重要部分。Python 变量作用域规定了变量在程序中可见的范围和它们在哪里可以访问。要了解 Python 变量作用域,需要了解全局变量和局部变量,以及它们如何在代码中工作。在本文中,我们将深入研究 Python 变量作用域和它们的规则、类型和用法,以帮助读者更好地理解 Python 编程。

    2024-07-06
    38
  • 使用Python的minmax函数

    使用Python的minmax函数在计算机科学中,经常需要找到一组数中的最小值和最大值。Python标准库提供了一个内置的函数minmax,可以方便地找到给定实数序列或可迭代对象的最小值和最大值。

    2024-08-26
    30
  • Python库安装目录

    Python库安装目录在Python编程中,库是经常使用的工具,为了使用它们,我们需要知道库的安装目录。本文将从多个方面对Python库安装目录进行详细的阐述。

    2024-09-21
    14
  • Python字符串首字母大写

    Python字符串首字母大写字符串首字母大写是指将一个字符串中的每个单词的首字母都变成大写字母,保留其他字母不变。

    2024-03-02
    99

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注