这篇文章将向你解释如何使用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. python 全栈开发,Day3

    python之集合,深浅copy 一.集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把 ...

  2. comfirm 方法显示对话框

    comfirm 方法显示对话框 原理: confirm() 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框 confirm(message): message:要在 window 上弹出的对 ...

  3. python中的lambda函数用法

    例1:传入多个参数的lambda函数def sum(x,y): return x+y用lambda来实现:p = lambda x,y:x+yprint(4,6) 例2:传入一个参数的lambda函数 ...

  4. c# 根据唯一码,存缓存 实现12小时内 阅读量+1

    需求:某一个详细页面需要实现用户 12小时内阅读量+1, 实现思路;得到一个唯一码的机器码,不管是否用户登录了 都有这个码,然后存到缓存里面 最后判断时间+12小时  是否超过当前时间 string ...

  5. Java后台模拟发送http的get和post请求,并测试

    个人学习使用:谨慎参考 1 Client类 import com.thoughtworks.gauge.Step; import com.thoughtworks.gauge.Table; impor ...

  6. 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen

    reportgen v0.1.8 更新介绍 这段时间,我对 reportgen 进行了大工程量的修改和更新.将之前在各个文章中出现的函数进行了封装,同时也对现有工具包的一些逻辑进行了调整. 1.rep ...

  7. python全栈学习--day4

    列表 说明:列表是python中的基础数据类型之一,它是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:   1 li = ['alex',123,Ture,(1,2,3,'wu ...

  8. 使用jmeter+ant进行接口自动化测试(数据驱动)之二:利用apache-ant执行测试用例并生成HTML格式测试报告

    在 使用jmeter+ant进行接口自动化测试(数据驱动)之一 介绍了如何使用csv文件来批量管理接口 本次接着介绍如何利用apache-ant执行测试用例并生成HTML格式测试报告 ①下载安装 ap ...

  9. Maven+SSM框架搭建【spring+springmvc+mybatis】

    本案例用到:ssm[spring+springmvc+mybatis]框架 数据库:mysql (推荐使用mysql 或者 sqlserver  .oracle太大,一般大型项目才会用到) 开发工具: ...

  10. 1013团队Beta冲刺day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...