这篇文章将向你解释如何使用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模块

    博客地址:<NodeJS模块研究 - crypto> Github :https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各 ...

  8. Nodejs:md5入门介绍及crypto模块的应用

    简介 MD5(Message-Digest Algorithm)是计算机安全领域广泛使用的散列函数(又称哈希算法.摘要算法),主要用来确保消息的完整和一致性.常见的应用场景有密码保护.下载文件校验等. ...

  9. nodeJS之crypto加密

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

随机推荐

  1. 关于无法下载android开发工具的解决方法

    目前中国内地访问android网站需要FQ.不过这个网站http://www.androiddevtools.cn/提供了所有的和官网上一样的android开发工具和一些其他问题的解决方法.为andr ...

  2. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

  3. WPF介绍

    WPF 为Windows Presentation Foundation的首字母缩写 ,中文译为“Windows呈现基础”.WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上 ...

  4. yum安装puppet

    yum安装puppet author:headsen chen     2017-10-31  17:09:35 个人原创,转载请注明作者和出处,否则依法追究法律责任: 环境:centos 6.5 [ ...

  5. 【重点--web前端面试题总结】

    前端面试题总结 HTML&CSS: 对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应. JavaScri ...

  6. 有序的Map集合--LinkedHashMap

    提出问题: 在写一个dao的时候,我的需求是这个dao是一个万能的,目前的方法只有一个查询出实体类对应的表中所有的数据,通过传入的对象,利用反射获取实体类中的属性名,属性类型,利用字符串拼接获取相应属 ...

  7. Java集合详解及List源码分析

    对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...

  8. 笔记:XML-解析文档-流机制解析器(SAX、StAX)

    DOM 解析器完整的读入XML文档,然后将其转换成一个树型的数据结构,对于大多数应用,DOM 都运行很好,但是,如果文档很大,并且处理算法又非常简单,可以在运行时解析节点,而不必看到完整的树形结构,那 ...

  9. 内部办公网与IDC机房的GRE隧道配置实践

    背景 公司内网与机房服务器为了实现用内网IP通信的功能,故使用了linux的IP gre隧道的方式.使得公司内部可以直接通过路由直连的方式访问机房服务器. 拓扑图如下: 注:拓扑中的外网IP为虚构的I ...

  10. Solr+Tomcat+zookeeper部署实战

    一 .安装solr 环境说明:centos 7.3,solr 6.6,zookeeper3.4,Tomcat8.5,jdk1.8 zookeeper的部署请参考:http://www.cnblogs. ...