这篇文章将向你解释如何使用Node.jsCrypto模块对你的密码进行加盐hash。在这里,我们将不会对不懂的密码存储方式进行详细的比较。我们将要做的是知道在Node.js中使用加盐hash在进行密码存储的机制。放心,这是最好的存储密码的方式,在没有出现其他更好的方法之前。

这是什么技术

加盐是这样一直技术:将用户输入的密码和一个随机的字符串(这个字符串就是盐)通过hash结合,通过hash算法生成一个hash值,然后将结果存储在数据库中。

为什么要进行加盐Hash

因为相同密码的hash值是相同的,所以那时很容易通过lookup tables和rainbow tables来破解密码(lookup tables 和rainbow talbes是一些人预先破解了一些常见的密码然后存储起来以供其他人使用的表格)。如果有两个或者更多的用户拥有相同的密码hash值,将会让攻击者更加容易预测密码。加盐是为了让有相同密码hash值得这种情况减少。 如果你的盐(随机字符串)够长,那么这种几率将会几乎为零。

进行实践

在实践中你将会进行以下这些操作

创建并保存密码

  1. 获取用户密码
  2. 生成一个(随机字符串)
  3. 和用户密码进行结合
  4. 使用加密算法对结合后的字符串进行hash加密
  5. 将hash的结果作为密码进行存储,同时将密码一起存储。

验证用户密码

  1. 验证用户名并从数据库中获取hash后的密码及盐
  2. 用户输入的密码和对应用户已经存储的进行结合
  3. 使用和创建用户是相同的hash加密算法对结合字符串进行hash加密
  4. 将hash加密后的密码和数据控存储的密码进行比较

让我们来看看实际代码

首先需要引入crypto这个模块。你不需要单独去下载它,因为他是Node.js的内置模块,只需引入即可。

'use strict'
var crypto = require('crypto')

创建一个function用来生成盐

/**
 * generates random string of characters i.e salt
 * @function
 * @param {number} length - Length of the random string.
 */

 var genRandomString = function(length){
     return crypto.randomBtytes(Math.ceil(length/2))
                .toString('hex') /**转成十六进制*/
                .slice(0,length);/**返回指定长度字符串*/
 }
 

将密码和盐一起进行hash加密

使用一种你在读这篇文章时代的一种合适的加密hash算法,因为伴随着计算能力的发展,加密hash技术也会发展。所以如果你使用就得hash加密算法是存在很大风险的。这里我们使用sha512

/**
 * hash password with sha512.
 * @function
 * @param {string} password - List of required fields.
 * @param {string} salt - Data to be validated.
 */

 var sha512 = function(password, salt){
     var hash = crypto.createHamc('sha512', salt); /**使用sha512算法进行hash*/
     hash.update(password)
     var value = hash.digest('hex')
     return {
         salt:salt,
         passwordHash:value
     }
  }

下面我们将创建一个函数使用让面的的函数生成一个hash值,作为用户密码存储在数据库中。


function saltHashPassword(userpassword){
    var salt = genRandowString(16) /**生成一个长度为16个字符的盐*/
    var passwordData = sha512(userpassword, salt);
    console.log( console.log('UserPassword = '+userpassword);
    console.log('Passwordhash = '+passwordData.passwordHash);
    console.log('nSalt = '+passwordData.salt);)
}

saltHashPassword('MYPASSWORD');
saltHashPassword('MYPASSWORD');

注意,我们当用saltHashPassword两次使用相同的参数,只是想要展示使用相同密码的两次hash加密的结果是不同的。

下面让我们来看看完整的代码展示

'use strict';
var crypto = require('crypto');

/**
 * generates random string of characters i.e salt
 * @function
 * @param {number} length - Length of the random string.
 */
var genRandomString = function(length){
    return crypto.randomBytes(Math.ceil(length/2))
            .toString('hex') /** convert to hexadecimal format */
            .slice(0,length);   /** return required number of characters */
};

/**
 * hash password with sha512.
 * @function
 * @param {string} password - List of required fields.
 * @param {string} salt - Data to be validated.
 */
var sha512 = function(password, salt){
    var hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */
    hash.update(password);
    var value = hash.digest('hex');
    return {
        salt:salt,
        passwordHash:value
    };
};

function saltHashPassword(userpassword) {
    var salt = genRandomString(16); /** Gives us salt of length 16 */
    var passwordData = sha512(userpassword, salt);
    console.log('UserPassword = '+userpassword);
    console.log('Passwordhash = '+passwordData.passwordHash);
    console.log('nSalt = '+passwordData.salt);
}

saltHashPassword('MYPASSWORD');
saltHashPassword('MYPASSWORD');

在运行这段代码,你将会的得到两个不同的hash值(这里就不做展示了,有兴趣的可以自己运行看看)

结论

无论你做任何需要存储用户密码的web应用,它都非常容易出现问题,所以这里我们强烈推荐你使用加盐hash来对用户密码进行处理,这将有效的提高密码存储的安全性。

英文原文地址

使用nodeJS的 crypto模块来为你的密码hash加盐的更多相关文章

  1. nodeJS之crypto模块md5和Hmac加密

    nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用cryp ...

  2. nodeJS之crypto模块公钥加密及解密

    nodeJS之crypto模块公钥加密及解密 NodeJS有以下4个与公钥加密相关的类.1. Cipher: 用于加密数据:2. Decipher: 用于解密数据:3. Sign: 用于生成签名:4. ...

  3. Nodejs进阶:MD5入门介绍及crypto模块的应用

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 简介 MD5(Message-Digest Algorithm) ...

  4. Nodejs进阶:crypto模块中你需要掌握的安全基础

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址. 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速度增长.同时,各类网络安全问题层出不穷.在信 ...

  5. 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议

    node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...

  6. NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇

    个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...

  7. nodeJS之crypto加密

    前面的话 加密模块提供了 HTTP 或 HTTPS 连接过程中封装安全凭证的方法.也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 签名(sign) 和 ...

  8. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  9. 关于Nodejs的多进程模块Cluster

    关于Nodejs的多进程模块Cluster   前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...

随机推荐

  1. python多线程使用

    内容链接: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683236 ...

  2. Servlet简介及使用

    javaweb学习总结(五)——Servlet开发(一) 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口 ...

  3. 【转】安卓Java的虚拟机区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  4. k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)

    在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这 ...

  5. (一)Qt5模块,QtCreator常用快捷键,命名规范

    常用快捷键 1)帮助文件:F1 (光标在函数名字或类名上,按 F1 即可跳转到对应帮助文档,查看其详细用法) 2).h 文件和对应.cpp 文件切换:F4 3)编译并运行:Ctrl + R 4)函数声 ...

  6. easyui中datagrid常见功能

    1.数据加载,需要拼接成标准json格式{}.如果是jsonarray格式[{},{}],无法识别. 2.后端将list拼接成datagrid能识别的json格式,需要首先new JSONObject ...

  7. MySQL8的新特性CTE

    [瞎BB] 十一长假的最后一天,想到明天要就回去上班了:内心的激动无法用平常的言语来表达,可能是国人的感情向来比较内敛(这个锅不能我一个人背) 也可能是我们比较重行动(Just Do IT).但... ...

  8. POJ3041_Asteroids

    这个题目说,有一个N*N的规格的方格.某些格子里有*号,每次可以消除一行或者一列中所有的*号.最少需要消多少次? 新学到的,什么什么定理,最少点覆盖等于最大匹配数. 这个定理可以这样来理解(看别人的) ...

  9. VirtualBox虚拟机Centos7网络配置

    Centos7要实现虚拟机可以链接网络,主机与虚拟机可以互相通过ip地址访问,需要配置两种网卡,两张网卡配置不同的网络链接方式 virtualBox 网络链接讲解地址:https://www.cnbl ...

  10. [洛谷P4329][COCI2006-2007#1] Bond

    题目大意:有$n$个人有$n$个任务,每个人执行每个任务有不同的成功率,每个人只能执行一个任务,求所有任务都执行的总的成功率. 题解:可以跑最大费用最大流,把成功率取个$log$,最后$exp$回去就 ...